superclawd 0.1.7 → 0.1.9
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.
- package/dist/index.js +36 -36
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __cr } from 'module'; const require = __cr(import.meta.url);
|
|
3
|
-
import{spawn as fn,spawnSync as zr,execSync as Qr}from"node:child_process";import{fileURLToPath as dn}from"node:url";import{existsSync as mn}from"node:fs";import{resolve as Zr,dirname as eo,join as to}from"node:path";import{homedir as hn}from"node:os";import{join as te}from"node:path";import{randomBytes as wn}from"node:crypto";import{readFileSync as Sn,writeFileSync as Ge,mkdirSync as je,chmodSync as kn,existsSync as Fe}from"node:fs";var J=(process.env.SUPERCLAWD_BACKEND||"real").toLowerCase(),
|
|
4
|
-
`,{mode:384});try{kn(ee,384)}catch{}}function Ye(){return
|
|
5
|
-
`)}catch{}}function ze(e,t,n=!1){Fe(Xe(e))||Cn(e,{notifications:n?!1:En(),...t?{workspace:t}:{}})}function Qe(){Fe(ee)||G({credentials:{keyId:"",secret:"",workspace:""},preferences:{notifications:!1,skipPermissions:!1,chooseWorkspaceAtStartup:!0,privateMemory:!0}})}var Ze=1e3*60*60*24*3;function et(){if(
|
|
3
|
+
import{spawn as fn,spawnSync as zr,execSync as Qr}from"node:child_process";import{fileURLToPath as dn}from"node:url";import{existsSync as mn}from"node:fs";import{resolve as Zr,dirname as eo,join as to}from"node:path";import{homedir as hn}from"node:os";import{join as te}from"node:path";import{randomBytes as wn}from"node:crypto";import{readFileSync as Sn,writeFileSync as Ge,mkdirSync as je,chmodSync as kn,existsSync as Fe}from"node:fs";var J=(process.env.SUPERCLAWD_BACKEND||"real").toLowerCase(),S=J==="mock",q=process.env.SUPERCLAWD_MCP_API_URL||"https://mcp-api.superclawd.com",ne=process.env.SUPERCLAWD_API_URL||"https://api.superclawd.com",x=process.env.SUPERCLAWD_HOME||te(hn(),".superclawd"),re=te(x,"sessions"),ee=te(x,"config.json");function yn(e){if(!e||typeof e!="object")return{};let t=e,n=t.credentials??{...typeof t.keyId=="string"?{keyId:t.keyId}:{},...typeof t.secret=="string"?{secret:t.secret}:{},...typeof t.workspace=="string"?{workspace:t.workspace}:{}},r=t.preferences??{...typeof t.skipPermissions=="boolean"?{skipPermissions:t.skipPermissions}:{},...typeof t.notifications=="boolean"?{notifications:t.notifications}:{},...typeof t.chooseWorkspaceAtStartup=="boolean"?{chooseWorkspaceAtStartup:t.chooseWorkspaceAtStartup}:{},...typeof t.experimental=="boolean"?{experimental:t.experimental}:{}},o={};return Object.keys(n).length&&(o.credentials=n),Object.keys(r).length&&(o.preferences=r),typeof t.machineId=="string"&&(o.machineId=t.machineId),o}function Ke(){let e=A()??{};if(e.machineId)return e.machineId;let t=wn(16).toString("hex");return G({...e,machineId:t}),t}function A(){try{return yn(JSON.parse(Sn(ee,"utf8")))}catch{return null}}function G(e){je(x,{recursive:!0}),Ge(ee,`${JSON.stringify(e,null,2)}
|
|
4
|
+
`,{mode:384});try{kn(ee,384)}catch{}}function Ye(){return A()?.preferences?.skipPermissions===!0}function En(){return A()?.preferences?.notifications===!0}function Be(){return A()?.preferences?.chooseWorkspaceAtStartup!==!1}function ke(e){let t=A()??{};G({...t,credentials:{...t.credentials,workspace:e}})}function oe(){let e=A();e?.credentials?.workspace&&G({...e,credentials:{...e.credentials,workspace:""}})}function He(){return A()?.preferences?.experimental===!0}function qe(){return A()?.preferences?.keepAwake===!0}function Je(){return A()?.preferences?.privateMemory!==!1}function Ve(){return A()?.preferences?.pipelinesMcp===!0}function Xe(e){return te(e,"config.json")}function Cn(e,t){try{je(e,{recursive:!0}),Ge(Xe(e),`${JSON.stringify(t,null,2)}
|
|
5
|
+
`)}catch{}}function ze(e,t,n=!1){Fe(Xe(e))||Cn(e,{notifications:n?!1:En(),...t?{workspace:t}:{}})}function Qe(){Fe(ee)||G({credentials:{keyId:"",secret:"",workspace:""},preferences:{notifications:!1,skipPermissions:!1,chooseWorkspaceAtStartup:!0,privateMemory:!0}})}var Ze=1e3*60*60*24*3;function et(){if(S)return{ok:!0,session:{keyId:process.env.SUPERCLAWD_MCP_KEY||"mock-key",secret:process.env.SUPERCLAWD_MCP_SECRET||"mock-secret",workspace:process.env.SUPERCLAWD_MCP_WORKSPACE||"mock-workspace",apiUrl:q}};let e=A()?.credentials??{},t=process.env.SUPERCLAWD_MCP_KEY||e.keyId,n=process.env.SUPERCLAWD_MCP_SECRET||e.secret,r=process.env.SUPERCLAWD_MCP_WORKSPACE||e.workspace||"";return!t||!n?{ok:!1,error:"Not authenticated. Run `superclawd login` (or set SUPERCLAWD_MCP_KEY + SUPERCLAWD_MCP_SECRET)."}:{ok:!0,session:{keyId:t,secret:n,workspace:r,apiUrl:q}}}import{spawn as ye}from"node:child_process";var tt=e=>{process.env.SUPERCLAWD_DEBUG&&process.stderr.write(`keep-awake: ${e}
|
|
6
6
|
`)};function Rn(){try{switch(process.platform){case"darwin":return ye("caffeinate",["-i","-w",String(process.pid)],{stdio:"ignore"});case"linux":return ye("systemd-inhibit",["--what=sleep:idle","--who=SuperClawd","--why=SuperClawd session running","--mode=block","cat"],{stdio:["pipe","ignore","ignore"]});case"win32":{let e=[`$p = Add-Type -MemberDefinition '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint e);' -Name P -Namespace W -PassThru;`,"$p::SetThreadExecutionState(0x80000000 -bor 0x00000001) | Out-Null;","[void][Console]::In.ReadToEnd();"].join(" ");return ye("powershell",["-NoProfile","-NonInteractive","-Command",e],{stdio:["pipe","ignore","ignore"]})}default:return null}}catch{return null}}function nt(){let e=Rn();if(!e)return tt(`unsupported platform ${process.platform}`),null;e.unref(),e.on("error",n=>tt(n.message));let t=!1;return{stop(){if(!t){t=!0;try{e.kill()}catch{}}}}}import{spawnSync as rt}from"node:child_process";import Pn from"node:readline/promises";import{readFileSync as _n,writeFileSync as vn,mkdirSync as bn}from"node:fs";import{join as An}from"node:path";var Mn=1500,ot=24*60*60*1e3,st=An(x,"update-state.json");function xn(e,t){let n=s=>s.split("-")[0].split(".").map(i=>parseInt(i,10)||0),r=n(e),o=n(t);for(let s=0;s<3;s++){let i=r[s]??0,a=o[s]??0;if(i!==a)return i>a}return!1}async function $n(e){let t=new AbortController,n=setTimeout(()=>t.abort(),Mn);try{let r=await fetch(`https://registry.npmjs.org/${e}`,{headers:{accept:"application/vnd.npm.install-v1+json"},signal:t.signal});return r.ok?(await r.json())["dist-tags"]?.latest??null:null}catch{return null}finally{clearTimeout(n)}}function it(){try{return JSON.parse(_n(st,"utf8"))}catch{return{}}}function Ln(e){try{bn(x,{recursive:!0}),vn(st,JSON.stringify(e,null,2))}catch{}}function at(e,t){let n=it();n[e]={...n[e],...t},Ln(n)}async function Ee(e,t,n=Date.now()){let r=it()[e]??{},o=r.latest??null;return(!r.checkedAt||n-r.checkedAt>=ot)&&(o=await $n(e),at(e,{latest:o??void 0,checkedAt:n})),!o||!xn(o,t)||r.dismissed===o||r.notifiedAt&&n-r.notifiedAt<ot?null:{latest:o}}function In(e){return!(e.includes("-p")||e.includes("--print"))&&!!process.stdin.isTTY}function Ce(e,t,n,r){process.stderr.write(`\u26A0 ${e} ${t} is outdated (latest ${n}). Update with: ${r}
|
|
7
7
|
`)}async function Re(e,t,n){let r=Pn.createInterface({input:process.stdin,output:process.stderr});try{process.stderr.write(`
|
|
8
8
|
${e} ${t} is outdated \u2014 ${n} is available.
|
|
9
9
|
`);let o=(await r.question(" [U] Update now (default) [R] Run anyway > ")).trim().toLowerCase();return o==="r"||o==="run"?"run":"update"}finally{r.close()}}function Y(e,t){at(e,{notifiedAt:Date.now(),...t?{dismissed:t}:{}})}async function ct(e,t){if(process.env.SUPERCLAWD_NO_UPDATE||process.env.SUPERCLAWD_BACKEND==="mock"||process.env.SUPERCLAWD_UPDATED)return{};let n=await Ee("superclawd",e);if(!n)return{};let{latest:r}=n;if(!In(t))return Ce("SuperClawd",e,r,"superclawd update"),Y("superclawd"),{};if(await Re("SuperClawd",e,r)==="run")return Y("superclawd",r),{};Y("superclawd"),process.stderr.write(`Updating (npm i -g superclawd@latest) \u2026
|
|
10
10
|
`);let s=rt("npm install -g superclawd@latest",{stdio:"inherit",shell:!0});if(s.status!==0)return process.stderr.write(`\u2717 Update failed (npm exited ${s.status??"?"}). Running ${e} for now.
|
|
11
11
|
`),{};let i=rt("superclawd",t,{stdio:"inherit",env:{...process.env,SUPERCLAWD_UPDATED:"1"}});return i.error?(process.stderr.write(`\u2713 Updated to ${r}. Re-run your command.
|
|
12
|
-
`),{exitCode:0}):{exitCode:i.status??0}}import{randomUUID as lt}from"node:crypto";function ut(e){let t={"content-type":"application/json","x-mcp-key-id":e.keyId,"x-mcp-secret":e.secret,"x-workspace-slug":e.workspace,"x-request-id":lt()};return process.env.SUPERCLAWD_EXPERIMENTAL==="true"&&(t["x-experimental"]="true"),t}async function se(e,t,n){let r=`${e.apiUrl}${t}`;if(n){let i=new URLSearchParams;for(let[l,c]of Object.entries(n))c!==void 0&&c!==""&&i.set(l,c);let a=i.toString();a&&(r+=(r.includes("?")?"&":"?")+a)}let o=await fetch(r,{headers:ut(e)}),s=await o.json().catch(()=>null);return{status:o.status,ok:o.ok,body:s}}async function pt(e,t,n){try{let r=await fetch(`${e}/api/prompt/workspaces`,{headers:{"content-type":"application/json","x-mcp-key-id":t,"x-mcp-secret":n,"x-request-id":lt()}}),o=await r.json().catch(()=>null);return{ok:r.ok,status:r.status,workspaces:o?.workspaces??[]}}catch{return{ok:!1,status:0,workspaces:[]}}}async function dt(e,t,n,r={}){let o=await fetch(`${e.apiUrl}${t}`,{method:"POST",headers:{...ut(e),...r},body:JSON.stringify(n)}),s=await o.json().catch(()=>null);return{status:o.status,ok:o.ok,body:s}}async function Pe(e,t){e.message("Loading your workspaces\u2026");let n=await pt(q,t.keyId,t.secret);if(!n.ok||n.workspaces.length===0)return{};let r=new Set(n.workspaces.map(i=>i.slug)),o=t.workspace&&r.has(t.workspace)?t.workspace:void 0;if(t.workspace&&!r.has(t.workspace)&&oe(),n.workspaces.length===1){let i=n.workspaces[0].slug;return i!==o&&ke(i),{workspace:i}}let s=await e.selectWorkspace(n.workspaces,{currentSlug:o,defaultSlug:o,onSetDefault:i=>ke(i)});return s===null?{cancelled:!0}:{workspace:s}}async function _e(e){if(
|
|
12
|
+
`),{exitCode:0}):{exitCode:i.status??0}}import{randomUUID as lt}from"node:crypto";function ut(e){let t={"content-type":"application/json","x-mcp-key-id":e.keyId,"x-mcp-secret":e.secret,"x-workspace-slug":e.workspace,"x-request-id":lt()};return process.env.SUPERCLAWD_EXPERIMENTAL==="true"&&(t["x-experimental"]="true"),t}async function se(e,t,n){let r=`${e.apiUrl}${t}`;if(n){let i=new URLSearchParams;for(let[l,c]of Object.entries(n))c!==void 0&&c!==""&&i.set(l,c);let a=i.toString();a&&(r+=(r.includes("?")?"&":"?")+a)}let o=await fetch(r,{headers:ut(e)}),s=await o.json().catch(()=>null);return{status:o.status,ok:o.ok,body:s}}async function pt(e,t,n){try{let r=await fetch(`${e}/api/prompt/workspaces`,{headers:{"content-type":"application/json","x-mcp-key-id":t,"x-mcp-secret":n,"x-request-id":lt()}}),o=await r.json().catch(()=>null);return{ok:r.ok,status:r.status,workspaces:o?.workspaces??[]}}catch{return{ok:!1,status:0,workspaces:[]}}}async function dt(e,t,n,r={}){let o=await fetch(`${e.apiUrl}${t}`,{method:"POST",headers:{...ut(e),...r},body:JSON.stringify(n)}),s=await o.json().catch(()=>null);return{status:o.status,ok:o.ok,body:s}}async function Pe(e,t){e.message("Loading your workspaces\u2026");let n=await pt(q,t.keyId,t.secret);if(!n.ok||n.workspaces.length===0)return{};let r=new Set(n.workspaces.map(i=>i.slug)),o=t.workspace&&r.has(t.workspace)?t.workspace:void 0;if(t.workspace&&!r.has(t.workspace)&&oe(),n.workspaces.length===1){let i=n.workspaces[0].slug;return i!==o&&ke(i),{workspace:i}}let s=await e.selectWorkspace(n.workspaces,{currentSlug:o,defaultSlug:o,onSetDefault:i=>ke(i)});return s===null?{cancelled:!0}:{workspace:s}}async function _e(e){if(S)return{ok:!0};try{let t=await se(e,"/api/prompt/catalog");return t.ok?{ok:!0}:t.status===401?{ok:!1,error:"Your credentials are invalid or expired. Run `superclawd login` again."}:t.status===404?{ok:!1,workspaceInvalid:!0,error:"Workspace not found. Run `superclawd` and pick a workspace."}:t.status===403?{ok:!1,workspaceInvalid:!0,error:"You are not a member of this workspace."}:t.status===502||t.status===503||t.status===504?{ok:!1,error:`SuperClawd backend is unreachable or starting up (HTTP ${t.status}). Try again in a moment.`}:{ok:!1,error:`Auth check failed (HTTP ${t.status}).`}}catch(t){return{ok:!1,error:`Cannot reach SuperClawd backend (${String(t)}).`}}}var ve=[{id:"skill-backend-001",name:"backend-api-conventions",action:"code",executionMode:"auto",description:"writing, creating, modifying, or reviewing backend API code \u2014 HTTP endpoints, routes, controllers, request handlers, or server-side validation and security",categories:[{name:"endpoint-design",instructions:["Name routes with plural nouns and kebab-case (e.g. /user-profiles).","Return RFC-7807 problem+json on errors, never bare strings.","Validate and sanitize every request body against a schema before use."]},{name:"security",instructions:["Use parameterized queries only; never string-concatenate SQL.","Rate-limit auth endpoints to 5 requests/minute per IP."]}]},{id:"skill-testing-001",name:"testing-standards",action:"test",executionMode:"auto",description:"writing or updating automated tests \u2014 unit tests, integration tests, test files, assertions, mocks, or test coverage",categories:[{name:"unit",instructions:["One behavioral assertion per test; name tests as should_<expectation>.","Mock only at process boundaries (network, fs, clock)."]}]},{id:"skill-always-001",name:"repo-foundations",action:"behave",executionMode:"always",description:"foundational rules that always apply in this repository",categories:[{name:"house-rules",instructions:["Every source file must start with a one-line header comment describing its purpose.","Prefer clarity over cleverness; match the surrounding code's style."]}]}];var ft=[{id:"guardrail-no-rm-rf",match:{tools:["Bash"],commandPatterns:["\\brm\\s+-rf\\b","\\brm\\s+-fr\\b"]},action:"deny",message:"Destructive 'rm -rf' is blocked by a workspace guardrail. Remove paths explicitly and deliberately instead."},{id:"guardrail-payments-edits",match:{tools:["Edit","Write","MultiEdit","NotebookEdit"],pathGlobs:["**/payments/**"]},action:"ask",message:"Edits under payments/ touch billing-critical code \u2014 confirm before proceeding (workspace guardrail)."}],mt=[{id:"agent-reviewer-001",name:"code-reviewer",description:"Reviews a diff for correctness and security issues. Use after writing code.",vendor:"anthropic",model:"claude-sonnet-4-6",prompt:"You are a meticulous senior code reviewer. Examine the change for correctness, security, and clarity. Report concrete findings with file:line; do not rewrite the code unless asked.",mode:"subagent",tools:{read:"allow",glob:"allow",grep:"allow",edit:"deny",write:"deny",bash:"deny",webfetch:"deny",task:"deny"},steps:null,inheritWorkspaceContext:!1},{id:"agent-orchestrator-001",name:"orchestrator",description:"Coordinates multi-step coding tasks and delegates focused work. Use when a task spans several files or steps.",vendor:"anthropic",model:"claude-sonnet-4-6",prompt:"You are an orchestrator. Break the request into concrete steps, perform the edits directly, and keep changes minimal and focused on what was asked.",mode:"subagent",tools:{read:"allow",glob:"allow",grep:"allow",edit:"allow",write:"allow",bash:"deny",webfetch:"deny",task:"allow"},steps:null,inheritWorkspaceContext:!0}],gt=[{name:"ship-checklist",description:"Run this team's pre-merge checklist.",arguments:[{name:"scope",description:"what is being shipped",required:!1}],content:`Pre-merge checklist for $ARGUMENTS:
|
|
13
13
|
1. Tests pass and cover new behavior.
|
|
14
14
|
2. No secrets or debug logging left in.
|
|
15
15
|
3. Public APIs documented.
|
|
@@ -22,8 +22,8 @@ E2001 upstream_unavailable`}];var wt=[{id:"workflow-deploy-001",name:"production
|
|
|
22
22
|
3. Tag the release.
|
|
23
23
|
4. Run db migrations.
|
|
24
24
|
5. Deploy and watch error rate for 10m.
|
|
25
|
-
6. Announce in #releases.`}];function Dn(){let e=ve.filter(n=>n.executionMode==="auto").map(n=>({id:n.id,name:n.name,action:n.action,executionMode:n.executionMode,description:n.description})),t=ve.filter(n=>n.executionMode==="always").flatMap(n=>n.categories.flatMap(r=>r.instructions)).map((n,r)=>`${r+1}. ${n}`).join(`
|
|
26
|
-
`);return{skills:e,agents:mt,agentTeams:[],commands:gt.map(({name:n,description:r,arguments:o,team:s})=>({name:n,description:r,arguments:o,team:s??null})),resources:ht.map(({name:n,description:r})=>({name:n,description:r})),workflows:wt.map(({id:n,name:r,description:o})=>({id:n,name:r,description:o})),mcpServers:[],guardrails:ft,policyGuardrails:[],foundational:{text:t},teamMemoryEnabled:!0,repoMemoryEnabled:!0,agentMemoryEnabled:!0}}async function St(e){if(
|
|
25
|
+
6. Announce in #releases.`}];function Dn(){let e=ve.filter(n=>n.executionMode==="auto").map(n=>({id:n.id,name:n.name,action:n.action,executionMode:n.executionMode,description:n.description,userInvocable:n.userInvocable})),t=ve.filter(n=>n.executionMode==="always").flatMap(n=>n.categories.flatMap(r=>r.instructions)).map((n,r)=>`${r+1}. ${n}`).join(`
|
|
26
|
+
`);return{skills:e,agents:mt,agentTeams:[],commands:gt.map(({name:n,description:r,arguments:o,team:s})=>({name:n,description:r,arguments:o,team:s??null})),resources:ht.map(({name:n,description:r})=>({name:n,description:r})),workflows:wt.map(({id:n,name:r,description:o})=>({id:n,name:r,description:o})),mcpServers:[],guardrails:ft,policyGuardrails:[],foundational:{text:t},teamMemoryEnabled:!0,repoMemoryEnabled:!0,agentMemoryEnabled:!0}}async function St(e){if(S)return Dn();let t=await se(e,"/api/prompt/catalog",{repoFingerprint:process.env.SUPERCLAWD_REPO_FINGERPRINT});if(!t.ok||!t.body)throw new Error(`Failed to fetch catalog (HTTP ${t.status}).`);return{skills:(t.body.skills??[]).filter(r=>r.executionMode==="auto"),agents:(t.body.agents??[]).map(r=>({...r,learnedMemories:r.learnedMemories??[]})),agentTeams:(t.body.agentTeams??[]).map(r=>({...r,linkedWorkflows:r.linkedWorkflows??[]})),commands:t.body.commands??[],resources:t.body.resources??[],workflows:t.body.workflows??[],mcpServers:t.body.mcpServers??[],guardrails:t.body.guardrails??[],policyGuardrails:t.body.policyGuardrails??[],foundational:{text:t.body.foundational?.text??""},teamMemoryEnabled:t.body.teamMemoryEnabled??!0,repoMemoryEnabled:t.body.repoMemoryEnabled??!0,agentMemoryEnabled:t.body.agentMemoryEnabled??!0}}async function kt(e,t,n=!0){if(S)return!0;try{return(await dt(e,"/api/prompt/inspector",{ide:!0,platform:"claude-code",llm_model:"claude",x_session_request_id:t,notify_on_checkpoint:n,enable_session_files:!1},{"x-session-request-id":t})).ok}catch{return!1}}import{mkdirSync as Pr,writeFileSync as _r,chmodSync as vr}from"node:fs";import{dirname as Ht,join as qt}from"node:path";function $(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"skill"}function Tn(e){return`${(e.description??e.name).trim().replace(/\.$/,"")}.`}function On(e){return`# ${e.name} (SuperClawd-managed)
|
|
27
27
|
|
|
28
28
|
The authoritative instructions for this skill are managed in SuperClawd and
|
|
29
29
|
are **not** included here. You must fetch them before acting.
|
|
@@ -37,13 +37,13 @@ are **not** included here. You must fetch them before acting.
|
|
|
37
37
|
|
|
38
38
|
Do not proceed using only this description \u2014 it is a pointer, not the rules.
|
|
39
39
|
If \`get_directives\` returns an error, tell the user and stop.
|
|
40
|
-
`}function Un(e){let t=Tn(e).replace(/"/g,'\\"');return`---
|
|
40
|
+
`}function Un(e){let t=Tn(e).replace(/"/g,'\\"'),n=e.userInvocable??!1;return`---
|
|
41
41
|
name: ${$(e.name)}
|
|
42
42
|
description: "${t}"
|
|
43
|
-
user-invocable:
|
|
43
|
+
user-invocable: ${n}
|
|
44
44
|
---
|
|
45
45
|
|
|
46
|
-
`}function yt(e){let
|
|
46
|
+
`}function yt(e,t){let n=new Set(t),r=[];for(let o of e){let s=$(o.name),i=2;for(;n.has(s);)s=`${$(o.name)}-${i++}`;n.add(s),r.push({relPath:`skills/${s}/SKILL.md`,content:Un(o)+On(o)})}return r}var Wn=`SUPERCLAWD \u2014 operating manual (always in effect):
|
|
47
47
|
- The ALWAYS rules below are ALREADY LOADED and active for this entire session.
|
|
48
48
|
Apply them directly to all work. Do NOT call any tool to fetch them \u2014 you
|
|
49
49
|
already have them in full.
|
|
@@ -88,11 +88,11 @@ ${n}`,o=e.linkedWorkflows??[];if(o.length){let s=o.map(i=>`- ${i.name} (workflow
|
|
|
88
88
|
|
|
89
89
|
### Linked workflows
|
|
90
90
|
You **MAY** run any of these linked workflows if (and only if) one is relevant to the task \u2014 there is **no obligation** to run any. To run one, call the \`${xe}\` MCP tool with its \`workflowId\`, then follow the returned steps in order.
|
|
91
|
-
${s}`}return r}function Pt(e,t={},n=[]){let r=t.foundationalText??"",o=ue(e),s=new Map;for(let{slug:l,agent:c}of o)s.set(c.id,{slug:l,description:c.description});let i=new Map,a=new Set;for(let l of n){let c=l.memberAgentIds.map(
|
|
91
|
+
${s}`}return r}function Pt(e,t={},n=[]){let r=t.foundationalText??"",o=ue(e),s=new Map;for(let{slug:l,agent:c}of o)s.set(c.id,{slug:l,description:c.description});let i=new Map,a=new Set;for(let l of n){let c=l.memberAgentIds.map(E=>s.get(E)).filter(E=>!!E),g=Jn(l,c),y=i.get(l.leadAgentId)??[];y.push(g),i.set(l.leadAgentId,y),l.linkedWorkflows?.length&&a.add(l.leadAgentId)}return o.map(({slug:l,agent:c})=>{let g=i.get(c.id),y=!!g&&g.length>0,E=a.has(c.id),f=y?[Ae(c,r),...g].join(`
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
95
|
-
`):Ae(c,r);return{relPath:`agents/${l}.md`,content:qn(c,E
|
|
95
|
+
`):Ae(c,r);return{relPath:`agents/${l}.md`,content:qn(c,y,E)+f}})}function Vn(e){return e.arguments.length?e.arguments.map(t=>t.required?`<${t.name}>`:`[${t.name}]`).join(" "):""}function Xn(e){let t=[`description: "${e.description.replace(/"/g,'\\"')}"`],n=Vn(e);return n&&t.push(`argument-hint: ${n}`),`---
|
|
96
96
|
${t.join(`
|
|
97
97
|
`)}
|
|
98
98
|
---
|
|
@@ -147,7 +147,7 @@ ${s}`}}function Zn(e,t){let n=e.mode==="reference",r=n?`Read the SuperClawd refe
|
|
|
147
147
|
description: "${o}"
|
|
148
148
|
---
|
|
149
149
|
|
|
150
|
-
${r}`}}function vt(e){let t=new Set,n=[];for(let r of e){let o=$(r.name),s=2;for(;t.has(o);)o=`${$(r.name)}-${s++}`;t.add(o),n.push(Qn(r,o)),n.push(Zn(r,o))}return n}var er=`---
|
|
150
|
+
${r}`}}function vt(e){let t=new Set,n=[];for(let r of e){let o=$(r.name),s=2;for(;t.has(o);)o=`${$(r.name)}-${s++}`;t.add(o),n.push(Qn(r,o)),r.userInvocable===!0&&n.push(Zn(r,o))}return n}var er=`---
|
|
151
151
|
description: Audit this session against your active SuperClawd directives.
|
|
152
152
|
---
|
|
153
153
|
|
|
@@ -185,19 +185,19 @@ argument-hint: "[task or question]"
|
|
|
185
185
|
To perform this work, please ultrathink \u2014 reason as deeply and carefully as you can before acting. Surface edge cases, weigh alternatives, and check your assumptions.
|
|
186
186
|
|
|
187
187
|
$ARGUMENTS
|
|
188
|
-
`;function bt(){return[{relPath:"commands/audit-work.md",content:er},{relPath:"commands/status.md",content:tr},{relPath:"commands/notifications.md",content:nr},{relPath:"commands/ultrathink.md",content:rr}]}import{existsSync as or,readFileSync as sr,writeFileSync as ir,chmodSync as ar,mkdirSync as cr}from"node:fs";import{execSync as lr}from"node:child_process";import{dirname as ur,join as At}from"node:path";function $t(e){let t="hooks/foundational-fallback.txt",n=`${e.pluginDir}/${t}`,r=`${e.pluginDir}/hooks/reminder-context.txt`,o=`${e.pluginDir}/stepcount`,s=h=>({type:"command",command:`node "${e.helperPath}" ${h}`}),i=h=>({...s(h),async:!0}),a={SessionStart:[{hooks:[s(`foundational "${n}" SessionStart`)]}],Notification:[{matcher:"permission_prompt|elicitation_dialog|elicitation_complete|elicitation_response|auth_success",hooks:[i(`notify-local attention "${e.launchId}"`),i(`notify attention "${e.launchId}"`)]}],Stop:[{hooks:[i(`notify-local stop "${e.launchId}"`)]}],SessionEnd:[{hooks:[i(`notify completion "${e.launchId}"`)]}]},l=[{relPath:t,content:e.foundational.text??""}],c=Number(process.env.SUPERCLAWD_REMIND_EVERY??8),g=process.env.SUPERCLAWD_REPO_MEMORY!=="0",
|
|
189
|
-
${
|
|
188
|
+
`;function bt(){return[{relPath:"commands/audit-work.md",content:er},{relPath:"commands/status.md",content:tr},{relPath:"commands/notifications.md",content:nr},{relPath:"commands/ultrathink.md",content:rr}]}import{existsSync as or,readFileSync as sr,writeFileSync as ir,chmodSync as ar,mkdirSync as cr}from"node:fs";import{execSync as lr}from"node:child_process";import{dirname as ur,join as At}from"node:path";function $t(e){let t="hooks/foundational-fallback.txt",n=`${e.pluginDir}/${t}`,r=`${e.pluginDir}/hooks/reminder-context.txt`,o=`${e.pluginDir}/stepcount`,s=h=>({type:"command",command:`node "${e.helperPath}" ${h}`}),i=h=>({...s(h),async:!0}),a={SessionStart:[{hooks:[s(`foundational "${n}" SessionStart`)]}],Notification:[{matcher:"permission_prompt|elicitation_dialog|elicitation_complete|elicitation_response|auth_success",hooks:[i(`notify-local attention "${e.launchId}"`),i(`notify attention "${e.launchId}"`)]}],Stop:[{hooks:[i(`notify-local stop "${e.launchId}"`)]}],SessionEnd:[{hooks:[i(`notify completion "${e.launchId}"`)]}]},l=[{relPath:t,content:e.foundational.text??""}],c=Number(process.env.SUPERCLAWD_REMIND_EVERY??8),g=process.env.SUPERCLAWD_REPO_MEMORY!=="0",y=process.env.SUPERCLAWD_AGENT_MEMORY!=="0",E=process.env.SUPERCLAWD_PRIVATE_MEMORY==="1",f=process.env.SUPERCLAWD_NO_CAPTURE==="1",d=!f&&!!process.env.SUPERCLAWD_REPO_FINGERPRINT&&(g||E),p=(e.foundational.text??"").trim(),P=p?`REMINDER \u2014 these SuperClawd always-rules remain in effect:
|
|
189
|
+
${p}`:"";if(c>0&&P&&(a.PostToolUse=[{matcher:"*",hooks:[s(`remind "${r}" "${o}"`)]}],l.push({relPath:"hooks/reminder-context.txt",content:P})),d){let h={hooks:[i(`capture "${e.launchId}"`)]};a.Stop.push(h),a.SessionEnd.push(h)}let u=e.agents??[];if(!f&&y&&u.length){let h="hooks/agent-map.json",m=`${e.pluginDir}/${h}`;l.push({relPath:h,content:JSON.stringify(Rt(u))}),a.SubagentStop=[{hooks:[i(`capture-agent "${m}" "${e.launchId}"`)]}]}let w=[];if(e.gate&&w.push({matcher:`${ae}.*`,hooks:[s("gate")]}),e.guardrails?.length){let h="hooks/guardrails.json",m=`${e.pluginDir}/${h}`;l.push({relPath:h,content:JSON.stringify(e.guardrails,null,2)}),w.push({matcher:"*",hooks:[s(`guardrails "${m}"`)]})}if(e.policyGuardrails?.length){let h="hooks/policy-guardrails.json",m=`${e.pluginDir}/${h}`;l.push({relPath:h,content:JSON.stringify(e.policyGuardrails,null,2)}),w.push({matcher:"Bash",hooks:[s(`policy "${m}"`)]})}return process.env.SUPERCLAWD_AUTO_RETRIEVE!=="0"&&(a.UserPromptSubmit=[{hooks:[s("retrieve prompt")]}],w.push({matcher:"Read",hooks:[s("retrieve file")]})),w.length&&(a.PreToolUse=w),l.push({relPath:"hooks/hooks.json",content:JSON.stringify({hooks:a},null,2)}),l}var Mt="# superclawd-report-commit";function xt(e){return`'${String(e).replace(/'/g,"'\\''")}'`}function Lt(e){let{cwd:t,helperPath:n,env:r}=e,o="";try{let c=lr("git rev-parse --git-path hooks",{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();c&&(o=c.startsWith("/")?c:At(t,c))}catch{return{installed:!1,reason:"not a git repo"}}if(!o)return{installed:!1,reason:"no hooks dir"};let s=At(o,"post-commit");if(or(s)){let c="";try{c=sr(s,"utf8")}catch{return{installed:!1,reason:"post-commit unreadable; skipped"}}if(!c.includes(Mt))return{installed:!1,reason:"existing user post-commit hook; skipped"}}let a=["SUPERCLAWD_BACKEND","SUPERCLAWD_MCP_API_URL","SUPERCLAWD_REPO_FINGERPRINT","SUPERCLAWD_MCP_KEY","SUPERCLAWD_MCP_SECRET","SUPERCLAWD_MCP_WORKSPACE","NODE_EXTRA_CA_CERTS","SUPERCLAWD_HOME","SUPERCLAWD_CLAUDE_BIN","SUPERCLAWD_POLICY_MODEL"].filter(c=>r[c]!==void 0&&r[c]!=="").map(c=>`export ${c}=${xt(r[c])}`).join(`
|
|
190
190
|
`),l=`#!/bin/sh
|
|
191
191
|
${Mt}
|
|
192
192
|
# Auto-generated by superclawd \u2014 reports Learned Memory staleness after each
|
|
193
193
|
# commit. Safe to delete; superclawd will not recreate it if you replace it.
|
|
194
194
|
${a}
|
|
195
195
|
node ${xt(n)} report-commit >/dev/null 2>&1 &
|
|
196
|
-
`;try{cr(ur(s),{recursive:!0}),ir(s,l),ar(s,493)}catch(c){return{installed:!1,reason:`write failed: ${String(c)}`}}return{installed:!0,reason:"installed"}}import{spawn as $e,spawnSync as Nt}from"node:child_process";import
|
|
196
|
+
`;try{cr(ur(s),{recursive:!0}),ir(s,l),ar(s,493)}catch(c){return{installed:!1,reason:`write failed: ${String(c)}`}}return{installed:!0,reason:"installed"}}import{spawn as $e,spawnSync as Nt}from"node:child_process";import b from"node:fs";import v from"node:path";import{fileURLToPath as pr}from"node:url";import{createRequire as dr}from"node:module";var j="@superclawd-ai/pipelines",Ie=v.join(x,"pipelines.pid"),De=v.join(x,"pipelines.port"),It=v.join(x,"pipelines.log"),fr=v.join(x,"pipelines-mcp.json"),Gt=63210,jt=2e4;function mr(e){let t="",n=null,r=!1;for(let o=0;o<e.length;o++){let s=e[o],i=e[o+1];if(s==="--port"||s==="-p"){let a=Number(i);i&&Number.isInteger(a)&&a>0&&a<65536&&(n=a,o++)}else s==="-d"||s==="--detach"?r=!0:!s.startsWith("-")&&!t&&(t=s)}return{sub:t,port:n,detach:r}}function Le(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}function Dt(e){try{let t=Number(b.readFileSync(e,"utf8").trim());return Number.isInteger(t)&&t>0?t:null}catch{return null}}function pe(){let e=Dt(Ie),t=Dt(De);return{pid:e,port:t,alive:e!==null&&Le(e)}}function gr(){try{let e=JSON.parse(b.readFileSync(fr,"utf8"));return e&&typeof e=="object"?e:null}catch{return null}}function Ft(){if(!Ve())return null;let e=gr(),t=e?.port??Gt,n=e?.token;return{name:"pipelines",type:"http",url:`http://127.0.0.1:${t}/mcp`,...n?{headers:{Authorization:`Bearer ${n}`}}:{}}}function Tt(e,t){b.mkdirSync(x,{recursive:!0}),b.writeFileSync(Ie,String(e)),b.writeFileSync(De,String(t))}function X(){for(let e of[Ie,De])try{b.unlinkSync(e)}catch{}}function Kt(){let e=process.env.SUPERCLAWD_PIPELINES_DIR;if(e)return b.existsSync(e)?e:null;let t=v.dirname(pr(import.meta.url));for(let n=0;n<8;n++){let r=v.join(t,"apps","pipelines");if(b.existsSync(v.join(r,"server","index.ts"))||b.existsSync(v.join(r,"dist-server","index.mjs")))return r;let o=v.dirname(t);if(o===t)break;t=o}try{let n=dr(import.meta.url),r=v.dirname(n.resolve("@superclawd-ai/pipelines/package.json"));if(b.existsSync(v.join(r,"dist-server","index.mjs")))return r}catch{}return null}function hr(e){let t=[v.join(e,"node_modules",".bin","tsx"),v.join(e,"..","..","node_modules",".bin","tsx")];for(let n of t)if(b.existsSync(n))return n;return"tsx"}function wr(){let e=Kt();if(!e)return null;let t=v.join(e,"dist-server","index.mjs");if(b.existsSync(t))return{cmd:process.execPath,args:[t],cwd:e};let n=v.join(e,"server","index.ts");return b.existsSync(n)?{cmd:hr(e),args:[n],cwd:e}:null}async function Ot(e,t=jt){let n=Date.now()+t;for(;Date.now()<n;){if(await Yt(e))return!0;await new Promise(r=>setTimeout(r,250))}return!1}async function Yt(e){let t=new AbortController,n=setTimeout(()=>t.abort(),1e3);try{return(await fetch(`http://localhost:${e}/api/session`,{signal:t.signal})).ok}catch{return!1}finally{clearTimeout(n)}}function Ut(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";try{$e(t,[e],{stdio:"ignore",detached:!0,shell:process.platform==="win32"}).unref()}catch{}}function L(e){process.stdout.write(e+`
|
|
197
197
|
`)}function F(e){process.stderr.write(e+`
|
|
198
198
|
`)}async function Sr(e){let t=pe(),n=a=>`http://localhost:${a}`;if(t.alive&&t.port)return L(`Pipelines is already running (pid ${t.pid}) at ${n(t.port)}`),e.detach||Ut(n(t.port)),0;t.pid&&!t.alive&&X(),await Cr(!!process.stdin.isTTY&&!e.detach);let r=wr();if(!r)return F(`\u2717 Couldn't locate the Pipelines app.
|
|
199
|
-
Set SUPERCLAWD_PIPELINES_DIR to its directory (the one containing server/index.ts).`),1;let o=e.port??Gt,s={...process.env,PIPELINES_PORT:String(o)};if(e.detach){
|
|
200
|
-
`)}async function Bt(e){let t=mr(e);switch(t.sub){case"start":return Sr(t);case"stop":return kr();case"status":return yr();case"update":return Rr();case"":case"help":return L(Wt()),0;default:return F(`Unknown pipelines command: ${t.sub}`),L(Wt()),1}}function br(e){let t={},n=[];for(let r of e){if(!r.name||r.name===ie||r.name===V||t[r.name])continue;let o={};r.type==="http"?(o.type="http",o.url=r.url,r.headers&&Object.keys(r.headers).length&&(o.headers=r.headers)):(o.command=r.command,r.args&&r.args.length&&(o.args=r.args)),r.env&&Object.keys(r.env).length&&(o.env=r.env),t[r.name]=o,n.push(r.name)}return{map:t,names:n}}function Ar(e,t,n,r,o){let s={SUPERCLAWD_BACKEND:J,SUPERCLAWD_MCP_API_URL:q,SUPERCLAWD_SESSION_ID:n};return
|
|
199
|
+
Set SUPERCLAWD_PIPELINES_DIR to its directory (the one containing server/index.ts).`),1;let o=e.port??Gt,s={...process.env,PIPELINES_PORT:String(o)};if(e.detach){b.mkdirSync(x,{recursive:!0});let a=b.openSync(It,"a"),l=$e(r.cmd,r.args,{cwd:r.cwd,env:s,detached:!0,stdio:["ignore",a,a]});return l.unref(),l.pid?(Tt(l.pid,o),await Ot(o)?(L(`\u2713 Pipelines started (pid ${l.pid}) at ${n(o)}`),0):(F(`\u2717 Daemon didn't become ready within ${jt/1e3}s. See ${It}`),1)):(F("\u2717 Failed to spawn the Pipelines daemon."),1)}L(`Starting Pipelines at ${n(o)} \u2026 (Ctrl-C to stop)`);let i=$e(r.cmd,r.args,{cwd:r.cwd,env:s,stdio:"inherit"});return i.pid&&Tt(i.pid,o),Ot(o).then(a=>{a&&Ut(n(o))}),await new Promise(a=>{i.on("error",l=>{F(`\u2717 Could not launch the daemon: ${l.message}`),X(),a(1)}),i.on("close",l=>{X(),a(l??0)})})}async function kr(){let e=pe();if(!e.pid||!e.alive)return L("Pipelines is not running."),X(),0;let t=n=>{try{process.kill(-e.pid,n)}catch{try{process.kill(e.pid,n)}catch{}}};t("SIGTERM");for(let n=0;n<40&&Le(e.pid);n++)await new Promise(r=>setTimeout(r,100));return Le(e.pid)&&t("SIGKILL"),X(),L("\u2713 Pipelines stopped."),0}async function yr(){let e=pe();if(!e.alive)return L("Pipelines: stopped."),0;let t=e.port?await Yt(e.port):!1;return L(`Pipelines: running (pid ${e.pid}) on port ${e.port??"?"} \u2014 `+(t?"responding \u2713":"not responding yet")),0}function Er(e){try{return JSON.parse(b.readFileSync(v.join(e,"package.json"),"utf8")).version??null}catch{return null}}async function Cr(e){if(process.env.SUPERCLAWD_NO_UPDATE||process.env.SUPERCLAWD_BACKEND==="mock")return;let t=Kt(),n=t?Er(t):null;if(!n)return;let r=await Ee(j,n);if(!r)return;let{latest:o}=r;if(!e){Ce("Pipelines",n,o,"superclawd pipelines update"),Y(j);return}if(await Re("Pipelines",n,o)==="run"){Y(j,o);return}Y(j),L(`Updating Pipelines (npm i -g ${j}@latest) \u2026`);let i=Nt(`npm install -g ${j}@latest`,{stdio:"inherit",shell:!0});i.status!==0?F(`\u2717 Update failed (npm exited ${i.status??"?"}). Starting ${n} for now.`):L(`\u2713 Updated to ${o}.`)}function Rr(){if(pe().alive)return F("\u2717 Stop the daemon first: superclawd pipelines stop"),1;L(`Updating Pipelines (npm i -g ${j}@latest) \u2026`);let t=Nt(`npm install -g ${j}@latest`,{stdio:"inherit",shell:!0});return t.status!==0?(F(`\u2717 Update failed (npm exited ${t.status??"?"}).`),t.status??1):(L("\u2713 Updated. Start again with: superclawd pipelines start"),0)}function Wt(){return["superclawd pipelines \u2014 run the local Pipelines app",""," start [--port <n>] [-d] Start the daemon (foreground; -d detaches). Opens the browser."," stop Stop the running daemon."," status Show whether the daemon is running."," update Update the Pipelines app (daemon must be stopped)."].join(`
|
|
200
|
+
`)}async function Bt(e){let t=mr(e);switch(t.sub){case"start":return Sr(t);case"stop":return kr();case"status":return yr();case"update":return Rr();case"":case"help":return L(Wt()),0;default:return F(`Unknown pipelines command: ${t.sub}`),L(Wt()),1}}function br(e){let t={},n=[];for(let r of e){if(!r.name||r.name===ie||r.name===V||t[r.name])continue;let o={};r.type==="http"?(o.type="http",o.url=r.url,r.headers&&Object.keys(r.headers).length&&(o.headers=r.headers)):(o.command=r.command,r.args&&r.args.length&&(o.args=r.args)),r.env&&Object.keys(r.env).length&&(o.env=r.env),t[r.name]=o,n.push(r.name)}return{map:t,names:n}}function Ar(e,t,n,r,o){let s={SUPERCLAWD_BACKEND:J,SUPERCLAWD_MCP_API_URL:q,SUPERCLAWD_SESSION_ID:n};return S||(s.SUPERCLAWD_MCP_KEY=e.keyId,s.SUPERCLAWD_MCP_SECRET=e.secret,s.SUPERCLAWD_MCP_WORKSPACE=e.workspace),process.env.NODE_EXTRA_CA_CERTS&&(s.NODE_EXTRA_CA_CERTS=process.env.NODE_EXTRA_CA_CERTS),process.env.SUPERCLAWD_HOME&&(s.SUPERCLAWD_HOME=process.env.SUPERCLAWD_HOME),process.env.SUPERCLAWD_LOG_FILE&&(s.SUPERCLAWD_LOG_FILE=process.env.SUPERCLAWD_LOG_FILE),process.env.SUPERCLAWD_DEBUG&&(s.SUPERCLAWD_DEBUG=process.env.SUPERCLAWD_DEBUG),process.env.SUPERCLAWD_MOCK_TIER&&(s.SUPERCLAWD_MOCK_TIER=process.env.SUPERCLAWD_MOCK_TIER),process.env.SUPERCLAWD_MOCK_BALANCE&&(s.SUPERCLAWD_MOCK_BALANCE=process.env.SUPERCLAWD_MOCK_BALANCE),process.env.SUPERCLAWD_EXPERIMENTAL&&(s.SUPERCLAWD_EXPERIMENTAL=process.env.SUPERCLAWD_EXPERIMENTAL),process.env.SUPERCLAWD_REPO_FINGERPRINT&&(s.SUPERCLAWD_REPO_FINGERPRINT=process.env.SUPERCLAWD_REPO_FINGERPRINT),process.env.SUPERCLAWD_TEAM_MEMORY&&(s.SUPERCLAWD_TEAM_MEMORY=process.env.SUPERCLAWD_TEAM_MEMORY),process.env.SUPERCLAWD_REPO_MEMORY&&(s.SUPERCLAWD_REPO_MEMORY=process.env.SUPERCLAWD_REPO_MEMORY),process.env.SUPERCLAWD_AGENT_MEMORY&&(s.SUPERCLAWD_AGENT_MEMORY=process.env.SUPERCLAWD_AGENT_MEMORY),process.env.SUPERCLAWD_PRIVATE_MEMORY&&(s.SUPERCLAWD_PRIVATE_MEMORY=process.env.SUPERCLAWD_PRIVATE_MEMORY),process.env.SUPERCLAWD_PIPELINES_TOOLS&&(s.SUPERCLAWD_PIPELINES_TOOLS=process.env.SUPERCLAWD_PIPELINES_TOOLS),process.env.SUPERCLAWD_PIPELINES_URL&&(s.SUPERCLAWD_PIPELINES_URL=process.env.SUPERCLAWD_PIPELINES_URL),process.env.SUPERCLAWD_PIPELINES_TICKET&&(s.SUPERCLAWD_PIPELINES_TICKET=process.env.SUPERCLAWD_PIPELINES_TICKET),r.length&&(s.SUPERCLAWD_RESOURCES=JSON.stringify(r.map(a=>({name:a.name,description:a.description})))),{relPath:".claude-plugin/plugin.json",content:JSON.stringify({name:V,description:"SuperClawd skills + live, metered directives for Claude Code.",mcpServers:{[ie]:{command:"node",args:[t],env:s},...o}},null,2)}}function Jt(e){let{pluginDir:t,session:n,catalog:r,serverPath:o,launchId:s}=e,i=qt(Ht(o),"hook-helper.mjs"),a=process.env.SUPERCLAWD_GATE==="1",l=br(r.mcpServers),c=Ft();if(c&&!l.map[c.name]){let d={type:"http",url:c.url};c.headers&&(d.headers=c.headers),l.map[c.name]=d,l.names.push(c.name)}let g=[...Pt(r.agents,{foundationalText:r.foundational.text},r.agentTeams),..._t(r.commands,r.agents),...vt(r.workflows),...bt()],y=new Set;for(let d of g){let p=/^commands\/(.+)\.md$/.exec(d.relPath),P=/^skills\/(.+)\/SKILL\.md$/.exec(d.relPath);p&&y.add(p[1]),P&&y.add(P[1])}let E=[Ar(n,o,s,r.resources,l.map),...yt(r.skills,y),...g,...$t({foundational:r.foundational,helperPath:i,pluginDir:t,launchId:s,gate:a,guardrails:r.guardrails,policyGuardrails:r.policyGuardrails,agents:r.agents})],f=[];for(let d of E){let p=qt(t,d.relPath);Pr(Ht(p),{recursive:!0}),_r(p,d.content),d.executable&&vr(p,493),f.push(d.relPath)}return{pluginDir:t,skillCount:r.skills.length,agentCount:r.agents.length,commandCount:r.commands.length,workflowCount:r.workflows.length,mcpServerNames:l.names,files:f}}import{mkdirSync as Mr,rmSync as Vt,readdirSync as xr,statSync as $r}from"node:fs";import{join as Te}from"node:path";import{randomBytes as Lr}from"node:crypto";function Xt(){let e=`${Date.now().toString(36)}-${Lr(4).toString("hex")}`,t=Te(re,e),n=Te(t,"plugin");return Mr(n,{recursive:!0}),{id:e,dir:t,pluginDir:n}}function zt(e){try{Vt(e.dir,{recursive:!0,force:!0})}catch{}}function Qt(e=Date.now()){let t=0,n=[];try{n=xr(re)}catch{return 0}for(let r of n){let o=Te(re,r);try{e-$r(o).mtimeMs>Ze&&(Vt(o,{recursive:!0,force:!0}),t++)}catch{}}return t}import{hostname as Ir}from"node:os";import{spawn as Dr}from"node:child_process";var Tr=e=>new Promise(t=>setTimeout(t,e));function Or(e){try{let t=process.platform,o=Dr(t==="darwin"?"open":t==="win32"?"cmd":"xdg-open",t==="win32"?["/c","start","",e]:[e],{stdio:"ignore",detached:!0});o.on("error",()=>{}),o.unref()}catch{}}async function Zt(){if(S)return process.stdout.write(`Mock mode \u2014 login is not needed.
|
|
201
201
|
`),{ok:!0};let e=Ke(),t=Ir()||"Unknown device",n;try{let c=await fetch(`${ne}/api/auth/cli/device/start`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({machineId:e,hostname:t})});if(!c.ok)return{ok:!1,error:`Couldn't start login (HTTP ${c.status}).`};n=await c.json()}catch{return{ok:!1,error:`Couldn't reach ${ne}.`}}let r=n.verification_uri_complete||n.verification_uri;process.stdout.write(`
|
|
202
202
|
To authorize this machine, open:
|
|
203
203
|
${r}
|
|
@@ -207,16 +207,16 @@ and confirm this code matches: ${n.user_code}
|
|
|
207
207
|
`),Or(r),process.stdout.write(`Waiting for approval\u2026 (Ctrl-C to cancel)
|
|
208
208
|
`);let o=(n.interval||5)*1e3,s=Date.now()+(n.expires_in||600)*1e3,i,a;for(;Date.now()<s;){await Tr(o);let c;try{c=await(await fetch(`${ne}/api/auth/cli/device/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({deviceCode:n.device_code})})).json()}catch{continue}if(c.status==="approved"){i=c.key_id,a=c.secret;break}if(c.status==="denied")return{ok:!1,error:"Request was denied in the browser."};if(c.status==="expired")return{ok:!1,error:"Login request expired. Run `superclawd login` again."}}if(!i||!a)return{ok:!1,error:"Login timed out. Run `superclawd login` again."};process.stdout.write(`\u2713 Authorized.
|
|
209
209
|
|
|
210
|
-
`);let l=
|
|
210
|
+
`);let l=A()??{};return G({...l,credentials:{...l.credentials,keyId:i,secret:a}}),process.stdout.write("\u2713 Logged in. Run `superclawd` to choose a workspace and start.\n\n"),{ok:!0}}var C="\x1B",de=[{key:"notifications",label:"Notifications",description:"Default for new sessions \u2014 ping when Claude needs you or finishes",defaultOn:!1},{key:"skipPermissions",label:"Dangerously skip permissions",description:"Launch Claude Code with --dangerously-skip-permissions (no approval prompts)",defaultOn:!1},{key:"chooseWorkspaceAtStartup",label:"Choose workspace at startup",description:"Pick the workspace to boot into each time you run superclawd",defaultOn:!0},{key:"experimental",label:"Experimental mode",description:"Run the latest unpublished (draft) versions instead of the stable release",defaultOn:!1},{key:"keepAwake",label:"Keep Awake",description:"Prevent your computer from sleeping while a session is running",defaultOn:!1},{key:"privateMemory",label:"Private Memory",description:"Remember your personal preferences across all your sessions (private to you, never shared)",defaultOn:!0},{key:"pipelinesMcp",label:"Pipelines MCP",description:"Let Claude Code drive your Pipelines board (requires SuperClawd Pipelines running)",defaultOn:!1}].sort((e,t)=>e.label.localeCompare(t.label)),Oe=(e,t)=>e.preferences?.[t.key]??t.defaultOn;async function en(){let e=A()??{},t=process.stdin;if(!t.isTTY){process.stdout.write(`SuperClawd options:
|
|
211
211
|
`);for(let n of de)process.stdout.write(` ${Oe(e,n)?"on ":"off"} ${n.label}
|
|
212
|
-
`);return}await new Promise(n=>{let r=de.length,o=r+2,s=0,i=
|
|
212
|
+
`);return}await new Promise(n=>{let r=de.length,o=r+2,s=0,i=d=>{d||process.stdout.write(`${C}[${o}A`);for(let p=0;p<r;p++){let P=de[p],u=p===s?`${C}[38;5;208m\u276F `:" ",w=Oe(e,P)?`${C}[38;5;208m[\u2713]${C}[0m`:"[ ]";process.stdout.write(`${C}[2K${u}${w} ${P.label}${C}[0m ${C}[2m${P.description}${C}[0m
|
|
213
213
|
`)}process.stdout.write(`${C}[2K
|
|
214
214
|
`),process.stdout.write(`${C}[2K${C}[2mPress Esc (or Ctrl-C) to exit${C}[0m
|
|
215
215
|
`)};process.stdout.write(`
|
|
216
216
|
SuperClawd options ${C}[2m(\u2191/\u2193 move \xB7 Space/Enter to toggle)${C}[0m
|
|
217
|
-
${C}[?7l${C}[?25l`),i(!0),t.setRawMode(!0),t.resume();let a=!1,l=()=>{if(!a){a=!0;try{t.setRawMode(!1)}catch{}process.stdout.write(`${C}[?7h${C}[?25h`)}},c=["SIGINT","SIGTERM","SIGHUP"],g=()=>l(),
|
|
218
|
-
`)},
|
|
219
|
-
`||
|
|
217
|
+
${C}[?7l${C}[?25l`),i(!0),t.setRawMode(!0),t.resume();let a=!1,l=()=>{if(!a){a=!0;try{t.setRawMode(!1)}catch{}process.stdout.write(`${C}[?7h${C}[?25h`)}},c=["SIGINT","SIGTERM","SIGHUP"],g=()=>l(),y=d=>{l(),process.kill(process.pid,d)};process.once("exit",g);for(let d of c)process.once(d,y);let E=()=>{t.off("data",f),process.off("exit",g);for(let d of c)process.off(d,y);t.pause(),l(),process.stdout.write(`
|
|
218
|
+
`)},f=d=>{let p=d.toString();if(p===""||p===C)E(),n();else if(p==="\r"||p===`
|
|
219
|
+
`||p===" "){let P=de[s];e.preferences={...e.preferences,[P.key]:!Oe(e,P)},G(e),i(!1)}else p===`${C}[A`||p==="k"?(s=(s-1+r)%r,i(!1)):(p===`${C}[B`||p==="j")&&(s=(s+1)%r,i(!1))};t.on("data",f)})}import{execSync as sn}from"node:child_process";var k="\x1B",W=`${k}[38;5;208m`,H=`${k}[2m`,ge=`${k}[31m`,R=`${k}[0m`,Ur=`${k}[?1049h`,tn=`${k}[?1049l`,Wr=`${k}[?25l`,Ue=`${k}[?25h`,Nr=`${k}[?1007l`,nn=`${k}[?1007h`,Gr=`${k}[?1000l${k}[?1002l${k}[?1003l${k}[?1004l${k}[?1006l${k}[?1015l`,We=`${k}[2J${k}[H`,fe=[" _ _"," ____ _ _ __ ___ _ _ __| |__ ___ __ ____| |","(_-< || | '_ \\/ -_) '_/ _| / _` \\ V V / _` |","/__/\\_,_| .__/\\___|_| \\__|_\\__,_|\\_/\\_/\\__,_|"," |_|"],rn=45,z=36,jr=140,Fr=350,T=e=>void process.stdout.write(e),Kr=e=>new Promise(t=>setTimeout(t,e)),B=e=>e>0?" ".repeat(e):"",an=process.platform!=="win32";function Yr(){if(!an)return null;try{return sn("stty -g </dev/tty",{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function on(e){if(an)try{sn(`stty ${e} </dev/tty`,{stdio:"ignore"})}catch{}}var me=null;function cn(e){me?.(),me=null,process.stderr.write(`${ge}\u2717 ${e}${R}
|
|
220
220
|
`)}function Br(e,t){return T(`${W}${fe.join(`
|
|
221
221
|
`)}${R} ${H}v${t}${R}
|
|
222
222
|
|
|
@@ -225,20 +225,20 @@ ${C}[?7l${C}[?25l`),i(!0),t.setRawMode(!0),t.resume();let a=!1,l=()=>{if(!a){a=!
|
|
|
225
225
|
`)},async selectWorkspace(n,r){return r?.currentSlug??n[0]?.slug??null},async ready(n){T(`${W} \u2713 ${n}${R}
|
|
226
226
|
`)},fail(n){T(`${ge} \u2717 ${n}${R}
|
|
227
227
|
`)},note(n){T(` ${n}
|
|
228
|
-
`)},handoff(){},finish(){}}}function Hr(e,t){let n=Yr(),r=0,o=!0,s=!1,i=u=>{u.includes(3)&&g()},a=()=>{let u=process.stdin;if(u.isTTY){try{u.setRawMode(!0)}catch{}u.resume(),u.on("data",i),s=!0}},l=()=>{if(!s)return;let u=process.stdin;u.off("data",i);try{u.setRawMode(!1)}catch{}u.pause(),s=!1},c=()=>{l();try{process.stdin.isTTY&&process.stdin.setRawMode(!1)}catch{}T(Ue+nn+tn),n&&on(n)},g=()=>{o&&c(),o=!1,process.exit(130)},
|
|
229
|
-
`.repeat(M),D=Math.max(0,Math.floor((
|
|
228
|
+
`)},handoff(){},finish(){}}}function Hr(e,t){let n=Yr(),r=0,o=!0,s=!1,i=u=>{u.includes(3)&&g()},a=()=>{let u=process.stdin;if(u.isTTY){try{u.setRawMode(!0)}catch{}u.resume(),u.on("data",i),s=!0}},l=()=>{if(!s)return;let u=process.stdin;u.off("data",i);try{u.setRawMode(!1)}catch{}u.pause(),s=!1},c=()=>{l();try{process.stdin.isTTY&&process.stdin.setRawMode(!1)}catch{}T(Ue+nn+tn),n&&on(n)},g=()=>{o&&c(),o=!1,process.exit(130)},y=()=>{l(),o&&T(Ue+nn+tn)},E=()=>{process.off("SIGINT",g),process.off("SIGTERM",g),process.off("exit",y),me=null};on("-echo"),T(Ur+Wr+Nr+Gr),a(),process.on("SIGINT",g),process.on("SIGTERM",g),process.on("exit",y),me=c;let f=(u,w)=>{let _=process.stdout.columns||80,h=process.stdout.rows||24,m=Math.floor(u*z/e);m<0&&(m=0),m>z&&(m=z);let I="\u2588".repeat(m)+"\u2591".repeat(z-m),U=Math.floor(u*100/e),O=z+6,M=Math.max(0,Math.floor((h-9)/2)),N=We+`
|
|
229
|
+
`.repeat(M),D=Math.max(0,Math.floor((_-rn)/2));for(let gn of fe)N+=`${B(D)}${W}${gn}${R}
|
|
230
230
|
`;N+=`
|
|
231
|
-
`;let K=Math.max(0,Math.floor((
|
|
231
|
+
`;let K=Math.max(0,Math.floor((_-w.length)/2));N+=`${B(K)}${H}${w}${R}
|
|
232
232
|
|
|
233
|
-
`;let Q=Math.max(0,Math.floor((
|
|
234
|
-
`;let Z=`v${t}`,we=Math.max(1,h-1),Se=Math.max(1,
|
|
235
|
-
`.repeat(h),I=Math.max(0,Math.floor((
|
|
233
|
+
`;let Q=Math.max(0,Math.floor((_-O)/2));N+=`${B(Q)}${W}${I}${R} ${String(U).padStart(3)}%
|
|
234
|
+
`;let Z=`v${t}`,we=Math.max(1,h-1),Se=Math.max(1,_-Z.length-1);N+=`${k}[${we};${Se}H${W}${Z}${R}`,T(N)},d=async(u,w,_)=>{let h=_-(Date.now()-r);h>0&&await Kr(h),f(u,w),r=Date.now()},p=u=>{let w=process.stdout.columns||80,_=process.stdout.rows||24,h=Math.max(0,Math.floor((_-(fe.length+1+u.length))/2)),m=We+`
|
|
235
|
+
`.repeat(h),I=Math.max(0,Math.floor((w-rn)/2));for(let O of fe)m+=`${B(I)}${W}${O}${R}
|
|
236
236
|
`;m+=`
|
|
237
237
|
`;for(let O of u)m+=`${O}
|
|
238
|
-
`;let U=`v${t}`;m+=`${
|
|
239
|
-
`?(process.stdin.off("data",U),process.stdin.on("data",i),
|
|
240
|
-
`)},note(){},handoff(){s&&(process.stdin.off("data",i),process.stdin.pause(),s=!1),T(We+Ue),process.off("SIGINT",g),process.off("SIGTERM",g)},finish(){o&&c(),o=!1,
|
|
241
|
-
`)},note(){},handoff(){},finish(){}}}function ln(e){if(e.quiet)return Jr();let t=process.stdout.isTTY===!0,n=e.version??"";return e.plain||!t||!qr()?Br(e.total,n):Hr(e.total,n)}var Vr=["low","medium","high","xhigh","max"];function un(e){let t=!1,n="",r=null,o=!1,s=!1,i=null,a=!1,l=!1,c="board",g=null,
|
|
238
|
+
`;let U=`v${t}`;m+=`${k}[${Math.max(1,_-1)};${Math.max(1,w-U.length-1)}H${W}${U}${R}`,T(m)},P=(u,w,_)=>{let h=process.stdout.columns||80,m="Select your workspace \u2191/\u2193 \xB7 enter launches \xB7 d sets default \xB7 esc cancels",I=Math.max(0,Math.floor((h-m.length)/2)),U=D=>` ${D.name} ${D.slug} \xB7 ${D.role}`,O=Math.max(...u.map(D=>U(D).length)),M=Math.max(0,Math.floor((h-O)/2)),N=[`${B(I)}${H}${m}${R}`,""];for(let D=0;D<u.length;D++){let K=u[D],Q=D===w,Z=Q?`${W}\u276F `:" ",we=Q?`${W}${K.name}${R}`:K.name,Se=K.slug===_?` ${W}\u2605 default${R}`:"";N.push(`${B(M)}${Z}${we} ${H}${K.slug} \xB7 ${K.role}${R}${Se}`)}p(N)};return{phase:(u,w)=>d(u-1,w,jr),ready:u=>d(e,u,Fr),message(u){let w=process.stdout.columns||80,_=Math.max(0,Math.floor((w-u.length)/2));p([`${B(_)}${H}${u}${R}`]),r=Date.now()},selectWorkspace(u,w){return new Promise(_=>{let h=w?.currentSlug?u.findIndex(O=>O.slug===w.currentSlug):-1,m=h>=0?h:0,I=w?.defaultSlug;s&&process.stdin.off("data",i),P(u,m,I);let U=O=>{let M=O.toString();M===""||M===k?(process.stdin.off("data",U),_(null)):M==="\r"||M===`
|
|
239
|
+
`?(process.stdin.off("data",U),process.stdin.on("data",i),_(u[m].slug)):M==="d"||M==="D"?(I=u[m].slug,w?.onSetDefault?.(I),P(u,m,I)):M===`${k}[A`||M==="k"?(m=(m-1+u.length)%u.length,P(u,m,I)):(M===`${k}[B`||M==="j")&&(m=(m+1)%u.length,P(u,m,I))};process.stdin.on("data",U)})},fail(u){o&&c(),o=!1,E(),process.stderr.write(`${ge}\u2717 ${u}${R}
|
|
240
|
+
`)},note(){},handoff(){s&&(process.stdin.off("data",i),process.stdin.pause(),s=!1),T(We+Ue),process.off("SIGINT",g),process.off("SIGTERM",g)},finish(){o&&c(),o=!1,E()}}}function qr(){return process.platform!=="win32"?!0:!!(process.env.WT_SESSION||process.env.TERM_PROGRAM||process.env.TERM)}function Jr(){return{async phase(){},message(){},async selectWorkspace(e,t){return t?.currentSlug??e[0]?.slug??null},async ready(){},fail(e){process.stderr.write(`${ge}\u2717 ${e}${R}
|
|
241
|
+
`)},note(){},handoff(){},finish(){}}}function ln(e){if(e.quiet)return Jr();let t=process.stdout.isTTY===!0,n=e.version??"";return e.plain||!t||!qr()?Br(e.total,n):Hr(e.total,n)}var Vr=["low","medium","high","xhigh","max"];function un(e){let t=!1,n="",r=null,o=!1,s=!1,i=null,a=!1,l=!1,c="board",g=null,y=null,E=null;for(let f=0;f<e.length;f++){let d=e[f],p=e[f+1];d==="-p"||d==="--print"?(t=!0,p&&!p.startsWith("-")&&(n=p,f++)):d==="--workspace"||d==="-w"?p&&!p.startsWith("-")&&(r=p,f++):d==="--no-capture"?o=!0:d==="--resume"||d==="-r"?(s=!0,p&&!p.startsWith("-")&&(i=p,f++)):d==="--pipelines"?a=!0:d==="--pipelines-tools"?l=!0:d.startsWith("--pipelines-tools=")?(l=!0,c=d.slice(18)==="restricted"?"restricted":"board"):d==="--session-id"?p&&!p.startsWith("-")&&(g=p,f++):d==="--model"?p&&!p.startsWith("-")&&(y=p,f++):d==="--effort"&&p&&Vr.includes(p)&&(E=p,f++)}return{printMode:t,printPrompt:n,workspace:r,noCapture:o,resume:s,resumeSessionId:i,pipelines:a,pipelinesTools:l,pipelinesToolsMode:c,sessionId:g,model:y,effort:E}}var pn={name:"superclawd",version:"0.1.9",description:"Claude Code, supercharged \u2014 your team's standards, every session. The superclawd CLI loads your workspace's skills, agents, commands, workflows, and live directives into Claude Code as a plugin.",author:"SuperClawd <support@superclawd.com>",license:"SEE LICENSE IN LICENSE",homepage:"https://superclawd.com",repository:{type:"git",url:"https://github.com/superclawd-ai/superclawd"},bugs:{url:"https://github.com/superclawd-ai/superclawd/issues"},keywords:["superclawd","claude-code","claude","plugin","skills","agents","mcp","ai-assistant","coding-standards","model-context-protocol"],engines:{node:">=20"},type:"module",main:"dist/index.js",bin:{superclawd:"dist/index.js"},files:["dist","README.md","LICENSE"],scripts:{build:"node build.mjs",dev:"node build.mjs && tsx src/index.ts",typecheck:"tsc --noEmit",lint:"eslint 'src/**/*.{ts,tsx}'","lint:fix":"eslint 'src/**/*.{ts,tsx}' --fix",format:"prettier --check 'src/**/*.{ts,tsx}'","format:fix":"prettier --write 'src/**/*.{ts,tsx}'",selftest:"tsx test/mcp-selftest.ts","test:guardrails":"tsx test/guardrails-eval.test.ts",test:"node build.mjs && tsx test/mcp-selftest.ts && tsx test/pipelines-tools.test.ts && tsx test/guardrails-eval.test.ts && tsx test/hooks-capture.test.ts && tsx test/translator-teams.test.ts && tsx test/run-args.test.ts && tsx test/pipelines.test.ts && tsx test/update-check.test.ts && tsx test/retrieve.test.ts && tsx test/config-private-memory.test.ts && tsx test/config-choose-workspace.test.ts && tsx test/config.test.ts && tsx test/translator-basics.test.ts && tsx test/hook-helper-guardrails.test.ts && tsx test/capture-prompts.test.ts && tsx test/mcp-backend-real.test.ts && tsx test/catalog.test.ts",prepublishOnly:"npm run build","publish:npm":"npm publish","version:bump":"npm version patch --no-git-tag-version"},dependencies:{"@modelcontextprotocol/sdk":"^1.7.0",zod:"^3.24.2"},devDependencies:{"@eslint/js":"^9.39.1","@types/node":"^22.10.0","@typescript-eslint/eslint-plugin":"^8.44.1","@typescript-eslint/parser":"^8.44.1",esbuild:"^0.24.0",eslint:"^9.36.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4",prettier:"^3.6.2",tsx:"^4.19.0",typescript:"^5.7.0"}};var Ne=pn.version,he=process.env.SUPERCLAWD_DRY_RUN==="1"||process.argv.includes("--dry-run");function no(){try{let e=Qr("git remote get-url origin",{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(e)return e.replace(/\.git$/,"").toLowerCase()}catch{}return`dir:${Zr(process.cwd())}`}function ro(){if(process.env.SUPERCLAWD_MCP_SERVER_PATH)return process.env.SUPERCLAWD_MCP_SERVER_PATH;let e=dn(new URL("./mcp-server.mjs",import.meta.url));return mn(e)?e:dn(new URL("../dist/mcp-server.mjs",import.meta.url))}function oo(){return`superclawd \u2014 Claude Code, supercharged with your SuperClawd workspace.
|
|
242
242
|
|
|
243
243
|
Usage:
|
|
244
244
|
superclawd Launch Claude with your skills/agents/directives loaded
|
|
@@ -265,13 +265,13 @@ Not authenticated yet? Run \`superclawd login\` first.
|
|
|
265
265
|
`),new Promise(e=>{let t=fn("npm install -g superclawd@latest",{stdio:"inherit",shell:!0});t.on("error",n=>{process.stderr.write(`\u2717 Could not run npm: ${n.message}. Is npm on your PATH?
|
|
266
266
|
`),e(127)}),t.on("close",n=>{n===0?process.stdout.write("\u2713 Updated. Run `superclawd version` to confirm.\n"):process.stderr.write(`\u2717 Update failed (npm exited ${n}).
|
|
267
267
|
`),e(n??1)})})}async function co(e){if(e.printMode&&!e.printPrompt.trim())return process.stderr.write(`Provide a prompt: superclawd -p "<your prompt>"
|
|
268
|
-
`),1;if(e.pipelines&&(process.env.SUPERCLAWD_NO_UPDATE="1"),e.pipelinesTools&&(process.env.SUPERCLAWD_PIPELINES_TOOLS=e.pipelinesToolsMode),!he){let
|
|
268
|
+
`),1;if(e.pipelines&&(process.env.SUPERCLAWD_NO_UPDATE="1"),e.pipelinesTools&&(process.env.SUPERCLAWD_PIPELINES_TOOLS=e.pipelinesToolsMode),!he){let f=await ct(Ne,process.argv.slice(2));if(f.exitCode!==void 0)return f.exitCode}if(e.noCapture&&(process.env.SUPERCLAWD_NO_CAPTURE="1"),!he&&!so())return process.stderr.write(`\u2717 Claude Code isn't installed (or isn't on your PATH).
|
|
269
269
|
|
|
270
270
|
SuperClawd supercharges Claude Code, so you'll need it first:
|
|
271
271
|
\u2192 https://claude.com/code
|
|
272
272
|
|
|
273
273
|
Once it's installed, run \`superclawd\` again.
|
|
274
|
-
`),1;
|
|
275
|
-
`),1;let n=t.session;e.workspace&&(n={...n,workspace:e.workspace});let r=ln({total:5,plain:he,quiet:e.printMode,version:Ne});if(!
|
|
276
|
-
`),
|
|
274
|
+
`),1;S||Qe(),!S&&He()&&(process.env.SUPERCLAWD_EXPERIMENTAL="true"),process.env.SUPERCLAWD_REPO_FINGERPRINT=no();let t=et();if(!t.ok&&!S)return process.stderr.write(`${t.error??"Could not resolve credentials."}
|
|
275
|
+
`),1;let n=t.session;e.workspace&&(n={...n,workspace:e.workspace});let r=ln({total:5,plain:he,quiet:e.printMode,version:Ne});if(!S&&!e.printMode&&!e.workspace&&process.stdin.isTTY&&(!n.workspace||Be())){let f=await Pe(r,n);if(f.cancelled)return r.finish(),130;f.workspace&&(n={...n,workspace:f.workspace})}if(!S&&!n.workspace)return r.finish(),process.stderr.write("No workspace selected. Pass --workspace <id>, set SUPERCLAWD_MCP_WORKSPACE, or run `superclawd` interactively once to pick a default.\n"),1;await r.phase(1,"Resolving credentials\u2026"),await r.phase(2,"Authenticating\u2026");let o=await _e(n);if(o.workspaceInvalid&&!S&&!e.printMode&&!e.workspace&&process.stdin.isTTY){oe();let f=await Pe(r,{...n,workspace:""});if(f.cancelled)return r.finish(),130;f.workspace&&(n={...n,workspace:f.workspace},await r.phase(2,"Authenticating\u2026"),o=await _e(n))}if(!o.ok)return r.fail(o.error??"Authentication failed."),1;await r.phase(3,S?"Loading mock catalog\u2026":"Fetching your workspace\u2026");let s;try{s=await St(n)}catch(f){return r.fail(`Catalog fetch failed: ${String(f)}`),1}process.env.SUPERCLAWD_TEAM_MEMORY=s.teamMemoryEnabled?"1":"0",process.env.SUPERCLAWD_REPO_MEMORY=s.repoMemoryEnabled?"1":"0",process.env.SUPERCLAWD_AGENT_MEMORY=s.agentMemoryEnabled?"1":"0",process.env.SUPERCLAWD_PRIVATE_MEMORY=S||Je()?"1":"0",await r.phase(4,"Establishing session\u2026"),Qt();let i=Xt();ze(i.dir,n.workspace,e.pipelines===!0);let a=ro();if(!mn(a))return r.fail(`Bundled MCP server not found at ${a}. Run \`npm run build\` first.`),1;await kt(n,i.id,e.pipelines!==!0),await r.phase(5,"Generating plugin\u2026");let l=Jt({pluginDir:i.pluginDir,session:n,catalog:s,serverPath:a,launchId:i.id});if(!S)try{let f=to(eo(a),"hook-helper.mjs"),d=Lt({cwd:process.cwd(),helperPath:f,env:{SUPERCLAWD_BACKEND:J,SUPERCLAWD_MCP_API_URL:n.apiUrl,SUPERCLAWD_REPO_FINGERPRINT:process.env.SUPERCLAWD_REPO_FINGERPRINT,SUPERCLAWD_MCP_KEY:n.keyId,SUPERCLAWD_MCP_SECRET:n.secret,SUPERCLAWD_MCP_WORKSPACE:n.workspace,NODE_EXTRA_CA_CERTS:process.env.NODE_EXTRA_CA_CERTS,SUPERCLAWD_HOME:process.env.SUPERCLAWD_HOME,SUPERCLAWD_CLAUDE_BIN:process.env.SUPERCLAWD_CLAUDE_BIN,SUPERCLAWD_POLICY_MODEL:process.env.SUPERCLAWD_POLICY_MODEL}});!d.installed&&d.reason!=="not a git repo"&&r.note(`Post-commit hook: ${d.reason}`)}catch{}let c=S?"mock":n.workspace;if(await r.ready(`${c} \xB7 ${l.skillCount} skills \xB7 ${l.commandCount} commands \xB7 ${l.workflowCount} workflows`),he){r.note("Dry run \u2014 not launching Claude. Generated files:");for(let f of l.files)r.note(` ${f}`);return 0}r.handoff();let g=!S&&qe()?nt():null,{code:y,error:E}=await io(i,l.mcpServerNames,e.printMode?{prompt:e.printPrompt}:void 0,e.resume?{sessionId:e.resumeSessionId}:void 0,e.sessionId,e.model,e.effort);return g?.stop(),r.finish(),zt(i),E&&process.stderr.write(`${E}
|
|
276
|
+
`),E?127:y}async function lo(){let e=await Zt();return e.cancelled||e.ok?0:(process.stderr.write(`\u2717 ${e.error??"Login failed."}
|
|
277
277
|
`),1)}async function uo(){let[e]=process.argv.slice(2).filter(t=>t!=="--dry-run");switch(e){case"login":process.exit(await lo());return;case"config":await en(),process.exit(0);return;case"update":process.exit(await ao());return;case"pipelines":{let t=process.argv.slice(2).filter(n=>n!=="--dry-run");process.exit(await Bt(t.slice(t.indexOf("pipelines")+1)));return}case"version":case"--version":case"-v":console.log(Ne);return;case"help":case"--help":case"-h":console.log(oo());return;default:process.exit(await co(un(process.argv.slice(2))))}}uo().catch(e=>{cn(String(e)),process.exit(1)});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "superclawd",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Claude Code, supercharged — your team's standards, every session. The superclawd CLI loads your workspace's skills, agents, commands, workflows, and live directives into Claude Code as a plugin.",
|
|
5
5
|
"author": "SuperClawd <support@superclawd.com>",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|