skillcraft 0.1.1 → 0.1.3

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/README.md CHANGED
@@ -1 +1,13 @@
1
- # temp
1
+ # Skillcraft
2
+
3
+ Turn your work into verifiable AI credentials. Capture what you build, share your progress, and earn verifiable credentials that prove measurable real-world AI engineering work.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm i -g skillcraft
9
+ ```
10
+
11
+ ## Documentation
12
+
13
+ For documentation see: https://skillcraft.gg/docs
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import{Command as Zn}from"commander";var Ze={name:"skillcraft",version:"0.1.1",description:"Skillcraft CLI for git-native skill evidence and credential workflow",type:"module",bin:{skillcraft:"dist/index.js"},files:["dist/index.js","dist/index.js.map"],scripts:{build:"tsup",clean:"rm -rf dist",test:"npm run build && node --test tests/*.test.mjs",smoke:"npm test",format:"printf ''",start:"node dist/index.js",check:"tsc --noEmit",prepublishOnly:"npm run build"},publishConfig:{access:"public"},dependencies:{commander:"^13.1.0",ora:"^8.2.0",yaml:"^2.6.0",zod:"^3.24.2"},devDependencies:{"@types/node":"^24.8.0",tsup:"^8.5.0",typescript:"^5.7.2"}};import{execFile as kr}from"child_process";import{promisify as vr}from"util";import Xe from"path";var Ye=vr(kr);async function y(e,t,r={}){try{let{stdout:n}=await Ye("git",e,{cwd:t,encoding:"utf8",maxBuffer:10485760,env:r.env});return n.trim()}catch(n){let o=n.message??String(n);throw new Error(`git command failed in ${t}: ${o}`)}}async function q(e){try{return await y(["rev-parse","--git-dir"],e),!0}catch{return!1}}async function ee(e){return Xe.resolve(await y(["rev-parse","--show-toplevel"],e))}async function T(e,t="origin"){try{return await y(["config","--get",`remote.${t}.url`],e)||void 0}catch{return}}async function Qe(e,t="HEAD"){return y(["log","--format=%B","-n","1",t],e)}async function te(e){return(await y(["rev-parse","HEAD"],e)).trim()}async function M(e,t){try{return await y(["show-ref","--verify","--quiet",t],e),!0}catch{return!1}}async function et(e,t,r){try{let n=await y(["ls-tree","-r","--name-only",t,"--",...r?[r]:[]],e);return n?n.split(`
2
+ import{Command as Zn}from"commander";var Ze={name:"skillcraft",version:"0.1.3",description:"Turn your work into verifiable AI credentials. Capture what you build, share your progress, and earn verifiable credentials that prove measurable real-world AI engineering work.",keywords:["skillcraft","cli","ai","evidence","credentials","skills","loadout","git","verification","developer-tools"],repository:{type:"git",url:"git+https://github.com/skillcraft-gg/skillcraft.git"},homepage:"https://skillcraft.gg",bugs:{url:"https://github.com/skillcraft-gg/skillcraft/issues"},type:"module",bin:{skillcraft:"dist/index.js"},files:["dist/index.js","dist/index.js.map","README.md","LICENSE"],scripts:{build:"tsup",clean:"rm -rf dist",test:"npm run build && node --test tests/*.test.mjs",smoke:"npm test",format:"printf ''",start:"node dist/index.js",check:"tsc --noEmit",prepublishOnly:"npm run build"},publishConfig:{access:"public"},dependencies:{commander:"^13.1.0",ora:"^8.2.0",yaml:"^2.6.0",zod:"^3.24.2"},devDependencies:{"@types/node":"^24.8.0",tsup:"^8.5.0",typescript:"^5.7.2"}};import{execFile as kr}from"child_process";import{promisify as vr}from"util";import Xe from"path";var Ye=vr(kr);async function y(e,t,r={}){try{let{stdout:n}=await Ye("git",e,{cwd:t,encoding:"utf8",maxBuffer:10485760,env:r.env});return n.trim()}catch(n){let o=n.message??String(n);throw new Error(`git command failed in ${t}: ${o}`)}}async function q(e){try{return await y(["rev-parse","--git-dir"],e),!0}catch{return!1}}async function ee(e){return Xe.resolve(await y(["rev-parse","--show-toplevel"],e))}async function T(e,t="origin"){try{return await y(["config","--get",`remote.${t}.url`],e)||void 0}catch{return}}async function Qe(e,t="HEAD"){return y(["log","--format=%B","-n","1",t],e)}async function te(e){return(await y(["rev-parse","HEAD"],e)).trim()}async function M(e,t){try{return await y(["show-ref","--verify","--quiet",t],e),!0}catch{return!1}}async function et(e,t,r){try{let n=await y(["ls-tree","-r","--name-only",t,"--",...r?[r]:[]],e);return n?n.split(`
3
3
  `).filter(Boolean):[]}catch{return[]}}async function tt(e,t,r){try{return await y(["show",`${t}:${r}`],e)}catch{return}}async function me(e,t){let r=t?String(t):"200",n=await y(["log",`--max-count=${r}`,"--pretty=%H%x00%B"],e);return n?n.split("\0").filter(Boolean).map(o=>{let[i,...s]=o.split(`
4
4
  `),a=s.join(`
5
5
  `).trimEnd();return{commit:i,message:a}}):[]}async function rt(e,t){let r={...process.env,SKILLCRAFT_HOOK_DISABLED:"1"},n=Xe.join(e,".git","SKILLCRAFT_COMMIT_MESSAGE"),{writeFile:o}=await import("fs/promises");return await o(n,`${t}
6
- `,"utf8"),await Ye("git",["commit","--amend","--file",n,"--no-gpg-sign"],{cwd:e,encoding:"utf8",env:r}),te(e)}import no from"fs/promises";import k from"path";import xr from"os";function Pr(){return k.resolve(process.env.HOME||xr.homedir(),".skillcraft")}function E(){return Pr()}function $e(){return k.join(E(),"config.json")}function Ee(){return k.join(E(),"repos.json")}function Ie(){return k.join(E(),"credentials.json")}function nt(){return k.join(E(),"cache","credentials","index.json")}function Rr(e){return k.join(e,".skillcraft")}function I(e){return k.join(e,".git","skillcraft")}function A(e){return k.join(Rr(e),".skillcraft.json")}function B(e){return k.join(e,".git","hooks","post-commit")}function pe(e){return k.join(e,".git","hooks","pre-push")}function fe(e){return k.join(e,".git","hooks","post-push")}function L(e){return k.join(I(e),"pending.json")}function b(e){return k.join(I(e),"context.json")}function ge(e){return k.join(I(e),"agent.json")}function de(e){return k.join(e,".opencode","plugins","skillcraft.mjs")}function re(e){return k.join(I(e),"ai-model-context.json")}import le from"fs/promises";import br from"path";async function C(e){await le.mkdir(e,{recursive:!0})}async function Cr(e){return await le.readFile(e,"utf8")}async function J(e,t){await C(br.dirname(e)),await le.writeFile(e,t,"utf8")}async function $(e){try{return await le.access(e),!0}catch{return!1}}async function v(e){if(!await $(e))return null;let t=await Cr(e);return JSON.parse(t)}async function w(e,t){let r=JSON.stringify(t,null,2);await J(e,`${r}
6
+ `,"utf8"),await Ye("git",["commit","--amend","--file",n,"--no-gpg-sign"],{cwd:e,encoding:"utf8",env:r}),te(e)}import no from"fs/promises";import k from"path";import xr from"os";function Pr(){return k.resolve(process.env.HOME||xr.homedir(),".skillcraft")}function E(){return Pr()}function $e(){return k.join(E(),"config.json")}function Ee(){return k.join(E(),"repos.json")}function Ie(){return k.join(E(),"credentials.json")}function nt(){return k.join(E(),"cache","credentials","index.json")}function br(e){return k.join(e,".skillcraft")}function I(e){return k.join(e,".git","skillcraft")}function A(e){return k.join(br(e),".skillcraft.json")}function B(e){return k.join(e,".git","hooks","post-commit")}function pe(e){return k.join(e,".git","hooks","pre-push")}function fe(e){return k.join(e,".git","hooks","post-push")}function L(e){return k.join(I(e),"pending.json")}function R(e){return k.join(I(e),"context.json")}function ge(e){return k.join(I(e),"agent.json")}function de(e){return k.join(e,".opencode","plugins","skillcraft.mjs")}function re(e){return k.join(I(e),"ai-model-context.json")}import le from"fs/promises";import Rr from"path";async function C(e){await le.mkdir(e,{recursive:!0})}async function Cr(e){return await le.readFile(e,"utf8")}async function J(e,t){await C(Rr.dirname(e)),await le.writeFile(e,t,"utf8")}async function $(e){try{return await le.access(e),!0}catch{return!1}}async function v(e){if(!await $(e))return null;let t=await Cr(e);return JSON.parse(t)}async function w(e,t){let r=JSON.stringify(t,null,2);await J(e,`${r}
7
7
  `)}async function N(e){try{await le.rm(e,{force:!0})}catch{}}import ne from"fs/promises";function Ae(e){let t=process.argv[1]||"";return`#!/usr/bin/env sh
8
8
  if [ -n "$SKILLCRAFT_HOOK_DISABLED" ]; then
9
9
  exit 0
@@ -38,15 +38,15 @@ SKILLCRAFT_HOOK_REMOTE="$1"
38
38
  run_skillcraft_hook _hook post-push "$SKILLCRAFT_HOOK_DIR" "$SKILLCRAFT_HOOK_REMOTE" || true`);async function ot(e){await J(B(e),`${Sr}
39
39
  `),await ne.chmod(B(e),493),await J(fe(e),`${$r}
40
40
  `),await ne.chmod(fe(e),493),await J(pe(e),`${Er}
41
- `),await ne.chmod(pe(e),493)}async function it(e){await Promise.all([ne.rm(B(e),{force:!0}),ne.rm(fe(e),{force:!0}),ne.rm(pe(e),{force:!0})])}import{z as f}from"zod";var ho=f.literal(1),U="skillcraft/proofs/v1",st=f.object({skills:f.array(f.string()).default([])}),at=f.object({activeLoadouts:f.array(f.string()).default([])}),wo=f.object({provider:f.string().optional()}),yo=f.object({provider:f.string().optional(),name:f.string().optional()}),G=f.object({githubUser:f.string().optional(),provider:f.enum(["gh"]).default("gh"),version:f.number().int().default(1),proofRef:f.string().default(U)}),Ir=f.object({path:f.string(),remote:f.string().optional(),enabledAt:f.string().optional()}),ct=f.object({repos:f.array(Ir).default([])}),Ar=f.object({id:f.string(),trackedAt:f.string().optional()}),dt=f.object({credentials:f.array(Ar).default([])});async function j(){let e=await v($e()),t=G.safeParse(e??{});return t.success?t.data:G.parse({})}async function he(e){let t=await v(A(e)),r=G.safeParse(t??{});return r.success?r.data:G.parse({})}async function lt(e){await C(E()),await w($e(),e)}async function _(){let e=await v(Ee()),t=ct.safeParse(e??{});return t.success?t.data:{repos:[]}}async function we(e){await C(E()),await w(Ee(),e)}async function ut(e){let r=(await _()).repos.filter(n=>n.path!==e.path);r.push(e),await we({repos:r})}async function mt(e){let r=(await _()).repos.filter(n=>n.path!==e);await we({repos:r})}async function ye(){let e=await v(Ie()),t=dt.safeParse(e??{});return t.success?t.data:{credentials:[]}}async function pt(e){await C(E()),await w(Ie(),e)}async function ft(e){let t=await ye();return t.credentials.some(r=>r.id===e)?!1:(t.credentials.push({id:e,trackedAt:new Date().toISOString()}),t.credentials.sort(Lr),await pt(t),!0)}async function gt(e){let t=await ye(),r=t.credentials.length,n=t.credentials.filter(o=>o.id!==e);return n.length===r?!1:(await pt({credentials:n}),!0)}function Lr(e,t){return e.id.localeCompare(t.id)}async function ht(){let e=process.cwd();if(!await q(e))throw new Error("Current directory is not a git repository");let t=await ee(e);await Promise.all([N(A(t)),N(L(t)),N(b(t)),N(ge(t)),N(de(t)),N(re(t)),N(I(t))]),await it(t),await mt(t),process.stdout.write(`disabled skillcraft for ${t}
42
- `)}import{createHash as Or}from"crypto";import ve from"path";import Tr from"os";import kt from"fs/promises";var jr=/^[a-zA-Z0-9][a-zA-Z0-9._-]*\/[a-zA-Z0-9][a-zA-Z0-9._-]*(?:@[^\s/]+)?$/,qr=/^[a-zA-Z0-9][a-zA-Z0-9._-]*\/[a-zA-Z0-9][a-zA-Z0-9._-]*$/,Nr=/^([a-zA-Z0-9][a-zA-Z0-9._-]*):([a-zA-Z0-9][a-zA-Z0-9._-]*)(?:\/([a-zA-Z0-9][a-zA-Z0-9._-]*))?$/;function wt(e){let t=D(e);if(t.id)return`${t.id}${t.version?`@${t.version}`:""}`}function Le(e){return jr.test(e)}function je(e){return!!D(e).id}function D(e){let t=e.trim(),r=Fr(t),n=r.id||"";if(_r(n)){let[c,g]=n.split("/");return{id:n,owner:c,slug:g,version:r.version}}let o=Nr.exec(n);if(!o)return{id:"",slug:"",version:r.version};let i=o[1],s=o[2],a=o[3];return a===void 0?{id:`${i}:${s}`,source:i,slug:s,version:r.version}:{id:`${i}:${s}/${a}`,source:i,owner:s,slug:a,version:r.version}}function _r(e){return qr.test(e)}function F(e,t){let r=e.trim();if(!r)throw new Error(`Expected ${t} to be provided`);return r}function Fr(e){let t=e.split("@"),r=t[0]||"",n=t.length>1?t.slice(1).join("@"):void 0;return{id:r,version:n}}function ke(e){let[t,r]=e.split("/");if(!t||!r)throw new Error(`Expected <owner>/<slug>, received ${e}`);return{owner:t,slug:r.trim()}}var qe="proofs";function vt(e){return(e?.trim()||U).replace(/^refs\/heads\//,"")}function xt(e){return`${qe}/${e}.json`}async function xe(e){let t=await he(e);return vt(t.proofRef)}async function Pt(e,t){let r=vt(t),n=`refs/heads/${r}`,o=`refs/remotes/origin/${r}`,i=[];return await M(e,n)&&i.push(r),await M(e,o)&&i.push(`origin/${r}`),i.length||i.push(r),i}async function Mr(e,t){let r=`refs/heads/${t}`;await M(e,r)||await y(["branch",t],e)}async function Dr(e,t,r){await zr(e,t);let n=await kt.mkdtemp(ve.join(Tr.tmpdir(),"skillcraft-proof-"));try{return await y(["worktree","add","--quiet",n,t],e),await r(n)}finally{await Rt(e,n)}}async function Rt(e,t){try{await y(["worktree","remove","--force",t],e)}catch{await kt.rm(t,{force:!0,recursive:!0})}}async function zr(e,t){let r=`refs/heads/${t}`;try{let o=(await y(["worktree","list","--porcelain"],e)).split(`
43
- `),i,s,a=async()=>{!i||s!==r||await Rt(e,i)};for(let c of o){if(!c){i=void 0,s=void 0;continue}if(c.startsWith("worktree ")){await a(),i=c.slice(9),s=void 0;continue}c.startsWith("branch ")&&(s=c.slice(7))}await a()}catch{return}}async function Ne(e){let t=await xe(e),r=await Pt(e,t),n=new Set;for(let i of r){let s=await et(e,i,qe);for(let a of s)n.add(a)}let o=[];for(let i of n){if(!i.endsWith(".json"))continue;let s=ve.basename(i,".json"),a=await _e(e,s);a&&o.push(a)}return o}function Hr(e){let t=D(e);if(t.id&&je(t.id))return{id:t.id,version:t.version}}function Pe(e){let t=e.filter(Boolean).map(r=>D(r)).filter(r=>!!r.id).map(r=>`${r.id}${r.version?`@${r.version}`:""}`);return Array.from(new Set(t)).filter(je).sort()}function bt(e,t,r){let n={skills:e,loadouts:r,timestamp:t};return Or("sha256").update(JSON.stringify(n)).digest("hex").slice(0,8)}async function oe(e){let t=await v(L(e)),r=st.safeParse(t??{skills:[]});return r.success?Pe(r.data.skills):[]}async function Kr(e){let t=await v(b(e)),r=at.safeParse(t??{activeLoadouts:[]});return r.success?r.data.activeLoadouts:[]}async function Br(e){let t=await v(re(e));if(!t||typeof t!="object"||Array.isArray(t))return{};let r=t,n=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:void 0,o=r.model&&typeof r.model=="object"&&!Array.isArray(r.model)?r.model:void 0;return{agent:typeof n?.provider=="string"?{provider:yt(n.provider)}:void 0,model:typeof o?.provider=="string"||typeof o?.name=="string"?{provider:typeof o.provider=="string"?yt(o.provider):void 0,name:typeof o.name=="string"?Jr(o.name):void 0}:void 0}}function yt(e){return e.trim().toLowerCase()}function Jr(e){return e.trim()}function Ur(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.version!="number"||typeof t.commit!="string"||!Array.isArray(t.skills)||!t.timestamp||typeof t.timestamp!="string")return;let r=Array.isArray(t.loadouts)?t.loadouts.map(String):[],n=t.skills.map(o=>{if(typeof o=="string")return{id:o};if(o&&typeof o=="object"&&"id"in o&&typeof o.id=="string")return{id:o.id,version:typeof o.version=="string"?o.version:void 0}}).filter(o=>!!o);return{version:t.version,commit:t.commit,skills:n,loadouts:r,timestamp:t.timestamp,agent:Gr(t.agent),model:Wr(t.model)}}function Gr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.provider;if(typeof t!="string")return;let r=t.trim().toLowerCase();return r?{provider:r}:void 0}function Wr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=typeof t.provider=="string"?t.provider.trim().toLowerCase():void 0,n=typeof t.name=="string"?t.name.trim():void 0;if(!(!r&&!n))return{provider:r,name:n}}async function _e(e,t){let r=await xe(e),n=xt(t),o=await Pt(e,r);for(let i of o){let s=await tt(e,i,n);if(!s)continue;let a;try{a=JSON.parse(s)}catch{continue}let c=Ur(a);if(c)return c}}async function Fe(e,t){let r=bt(t.skills.map(i=>i.id),t.timestamp,t.loadouts),n=await xe(e);await Mr(e,n);let o=xt(r);return await Dr(e,n,async i=>{await C(ve.join(i,qe)),await w(ve.join(i,o),t),await y(["add",o],i,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}}),await y(["status","--porcelain","--",o],i,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}})&&await y(["commit","--no-gpg-sign","-m",`add Skillcraft proof ${r}`],i,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}})}),r}async function Ct(e,t="origin"){let r=await xe(e);if(!(!await T(e,t)||!t))try{await y(["push",t,`${r}:${r}`],e,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}})}catch{return}}async function St(e,t){let r=await Ne(e);for(let n of r)if(n.commit===t)return bt(n.skills.map(o=>o.id),n.timestamp,n.loadouts)}async function $t(e,t,r=new Date().toISOString()){let n=await oe(e);if(!n.length)return;let o=await Kr(e),i=await Br(e),s={version:1,commit:t,skills:n.map(c=>Hr(c)).filter(c=>!!c),loadouts:o,timestamp:r,...i};return{proofId:await Fe(e,s),proof:s}}async function Vr(e){return e.replace(/\nSkillcraft-Ref: .*$/gm,"").trimEnd()}async function Et(e,t){let r=await Qe(e),n=await Vr(r);return n.includes("Skillcraft-Ref:")?n:`${n}
41
+ `),await ne.chmod(pe(e),493)}async function it(e){await Promise.all([ne.rm(B(e),{force:!0}),ne.rm(fe(e),{force:!0}),ne.rm(pe(e),{force:!0})])}import{z as f}from"zod";var ho=f.literal(1),U="skillcraft/proofs/v1",st=f.object({skills:f.array(f.string()).default([])}),at=f.object({activeLoadouts:f.array(f.string()).default([])}),wo=f.object({provider:f.string().optional()}),yo=f.object({provider:f.string().optional(),name:f.string().optional()}),G=f.object({githubUser:f.string().optional(),provider:f.enum(["gh"]).default("gh"),version:f.number().int().default(1),proofRef:f.string().default(U)}),Ir=f.object({path:f.string(),remote:f.string().optional(),enabledAt:f.string().optional()}),ct=f.object({repos:f.array(Ir).default([])}),Ar=f.object({id:f.string(),trackedAt:f.string().optional()}),dt=f.object({credentials:f.array(Ar).default([])});async function j(){let e=await v($e()),t=G.safeParse(e??{});return t.success?t.data:G.parse({})}async function he(e){let t=await v(A(e)),r=G.safeParse(t??{});return r.success?r.data:G.parse({})}async function lt(e){await C(E()),await w($e(),e)}async function _(){let e=await v(Ee()),t=ct.safeParse(e??{});return t.success?t.data:{repos:[]}}async function we(e){await C(E()),await w(Ee(),e)}async function ut(e){let r=(await _()).repos.filter(n=>n.path!==e.path);r.push(e),await we({repos:r})}async function mt(e){let r=(await _()).repos.filter(n=>n.path!==e);await we({repos:r})}async function ye(){let e=await v(Ie()),t=dt.safeParse(e??{});return t.success?t.data:{credentials:[]}}async function pt(e){await C(E()),await w(Ie(),e)}async function ft(e){let t=await ye();return t.credentials.some(r=>r.id===e)?!1:(t.credentials.push({id:e,trackedAt:new Date().toISOString()}),t.credentials.sort(Lr),await pt(t),!0)}async function gt(e){let t=await ye(),r=t.credentials.length,n=t.credentials.filter(o=>o.id!==e);return n.length===r?!1:(await pt({credentials:n}),!0)}function Lr(e,t){return e.id.localeCompare(t.id)}async function ht(){let e=process.cwd();if(!await q(e))throw new Error("Current directory is not a git repository");let t=await ee(e);await Promise.all([N(A(t)),N(L(t)),N(R(t)),N(ge(t)),N(de(t)),N(re(t)),N(I(t))]),await it(t),await mt(t),process.stdout.write(`disabled skillcraft for ${t}
42
+ `)}import{createHash as Or}from"crypto";import ve from"path";import Tr from"os";import kt from"fs/promises";var jr=/^[a-zA-Z0-9][a-zA-Z0-9._-]*\/[a-zA-Z0-9][a-zA-Z0-9._-]*(?:@[^\s/]+)?$/,qr=/^[a-zA-Z0-9][a-zA-Z0-9._-]*\/[a-zA-Z0-9][a-zA-Z0-9._-]*$/,Nr=/^([a-zA-Z0-9][a-zA-Z0-9._-]*):([a-zA-Z0-9][a-zA-Z0-9._-]*)(?:\/([a-zA-Z0-9][a-zA-Z0-9._-]*))?$/;function wt(e){let t=D(e);if(t.id)return`${t.id}${t.version?`@${t.version}`:""}`}function Le(e){return jr.test(e)}function je(e){return!!D(e).id}function D(e){let t=e.trim(),r=Fr(t),n=r.id||"";if(_r(n)){let[c,g]=n.split("/");return{id:n,owner:c,slug:g,version:r.version}}let o=Nr.exec(n);if(!o)return{id:"",slug:"",version:r.version};let i=o[1],s=o[2],a=o[3];return a===void 0?{id:`${i}:${s}`,source:i,slug:s,version:r.version}:{id:`${i}:${s}/${a}`,source:i,owner:s,slug:a,version:r.version}}function _r(e){return qr.test(e)}function F(e,t){let r=e.trim();if(!r)throw new Error(`Expected ${t} to be provided`);return r}function Fr(e){let t=e.split("@"),r=t[0]||"",n=t.length>1?t.slice(1).join("@"):void 0;return{id:r,version:n}}function ke(e){let[t,r]=e.split("/");if(!t||!r)throw new Error(`Expected <owner>/<slug>, received ${e}`);return{owner:t,slug:r.trim()}}var qe="proofs";function vt(e){return(e?.trim()||U).replace(/^refs\/heads\//,"")}function xt(e){return`${qe}/${e}.json`}async function xe(e){let t=await he(e);return vt(t.proofRef)}async function Pt(e,t){let r=vt(t),n=`refs/heads/${r}`,o=`refs/remotes/origin/${r}`,i=[];return await M(e,n)&&i.push(r),await M(e,o)&&i.push(`origin/${r}`),i.length||i.push(r),i}async function Mr(e,t){let r=`refs/heads/${t}`;await M(e,r)||await y(["branch",t],e)}async function Dr(e,t,r){await zr(e,t);let n=await kt.mkdtemp(ve.join(Tr.tmpdir(),"skillcraft-proof-"));try{return await y(["worktree","add","--quiet",n,t],e),await r(n)}finally{await bt(e,n)}}async function bt(e,t){try{await y(["worktree","remove","--force",t],e)}catch{await kt.rm(t,{force:!0,recursive:!0})}}async function zr(e,t){let r=`refs/heads/${t}`;try{let o=(await y(["worktree","list","--porcelain"],e)).split(`
43
+ `),i,s,a=async()=>{!i||s!==r||await bt(e,i)};for(let c of o){if(!c){i=void 0,s=void 0;continue}if(c.startsWith("worktree ")){await a(),i=c.slice(9),s=void 0;continue}c.startsWith("branch ")&&(s=c.slice(7))}await a()}catch{return}}async function Ne(e){let t=await xe(e),r=await Pt(e,t),n=new Set;for(let i of r){let s=await et(e,i,qe);for(let a of s)n.add(a)}let o=[];for(let i of n){if(!i.endsWith(".json"))continue;let s=ve.basename(i,".json"),a=await _e(e,s);a&&o.push(a)}return o}function Hr(e){let t=D(e);if(t.id&&je(t.id))return{id:t.id,version:t.version}}function Pe(e){let t=e.filter(Boolean).map(r=>D(r)).filter(r=>!!r.id).map(r=>`${r.id}${r.version?`@${r.version}`:""}`);return Array.from(new Set(t)).filter(je).sort()}function Rt(e,t,r){let n={skills:e,loadouts:r,timestamp:t};return Or("sha256").update(JSON.stringify(n)).digest("hex").slice(0,8)}async function oe(e){let t=await v(L(e)),r=st.safeParse(t??{skills:[]});return r.success?Pe(r.data.skills):[]}async function Kr(e){let t=await v(R(e)),r=at.safeParse(t??{activeLoadouts:[]});return r.success?r.data.activeLoadouts:[]}async function Br(e){let t=await v(re(e));if(!t||typeof t!="object"||Array.isArray(t))return{};let r=t,n=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:void 0,o=r.model&&typeof r.model=="object"&&!Array.isArray(r.model)?r.model:void 0;return{agent:typeof n?.provider=="string"?{provider:yt(n.provider)}:void 0,model:typeof o?.provider=="string"||typeof o?.name=="string"?{provider:typeof o.provider=="string"?yt(o.provider):void 0,name:typeof o.name=="string"?Jr(o.name):void 0}:void 0}}function yt(e){return e.trim().toLowerCase()}function Jr(e){return e.trim()}function Ur(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.version!="number"||typeof t.commit!="string"||!Array.isArray(t.skills)||!t.timestamp||typeof t.timestamp!="string")return;let r=Array.isArray(t.loadouts)?t.loadouts.map(String):[],n=t.skills.map(o=>{if(typeof o=="string")return{id:o};if(o&&typeof o=="object"&&"id"in o&&typeof o.id=="string")return{id:o.id,version:typeof o.version=="string"?o.version:void 0}}).filter(o=>!!o);return{version:t.version,commit:t.commit,skills:n,loadouts:r,timestamp:t.timestamp,agent:Gr(t.agent),model:Wr(t.model)}}function Gr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e.provider;if(typeof t!="string")return;let r=t.trim().toLowerCase();return r?{provider:r}:void 0}function Wr(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,r=typeof t.provider=="string"?t.provider.trim().toLowerCase():void 0,n=typeof t.name=="string"?t.name.trim():void 0;if(!(!r&&!n))return{provider:r,name:n}}async function _e(e,t){let r=await xe(e),n=xt(t),o=await Pt(e,r);for(let i of o){let s=await tt(e,i,n);if(!s)continue;let a;try{a=JSON.parse(s)}catch{continue}let c=Ur(a);if(c)return c}}async function Fe(e,t){let r=Rt(t.skills.map(i=>i.id),t.timestamp,t.loadouts),n=await xe(e);await Mr(e,n);let o=xt(r);return await Dr(e,n,async i=>{await C(ve.join(i,qe)),await w(ve.join(i,o),t),await y(["add",o],i,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}}),await y(["status","--porcelain","--",o],i,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}})&&await y(["commit","--no-gpg-sign","-m",`add Skillcraft proof ${r}`],i,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}})}),r}async function Ct(e,t="origin"){let r=await xe(e);if(!(!await T(e,t)||!t))try{await y(["push",t,`${r}:${r}`],e,{env:{...process.env,SKILLCRAFT_HOOK_DISABLED:"1"}})}catch{return}}async function St(e,t){let r=await Ne(e);for(let n of r)if(n.commit===t)return Rt(n.skills.map(o=>o.id),n.timestamp,n.loadouts)}async function $t(e,t,r=new Date().toISOString()){let n=await oe(e);if(!n.length)return;let o=await Kr(e),i=await Br(e),s={version:1,commit:t,skills:n.map(c=>Hr(c)).filter(c=>!!c),loadouts:o,timestamp:r,...i};return{proofId:await Fe(e,s),proof:s}}async function Vr(e){return e.replace(/\nSkillcraft-Ref: .*$/gm,"").trimEnd()}async function Et(e,t){let r=await Qe(e),n=await Vr(r);return n.includes("Skillcraft-Ref:")?n:`${n}
44
44
 
45
45
  Skillcraft-Ref: ${t}
46
46
  `}async function P(e){let t=A(e);if(!await $(t))return!1;let r=await v(t);return G.safeParse(r??{}).success}async function It(e){return $(I(e))}async function At(){let e=process.cwd(),t=await q(e);process.stdout.write(`git: ${t?"enabled":"not a repository"}
47
47
  `);let r=await P(e);if(process.stdout.write(`skillcraft: ${r?"enabled":"disabled"}
48
48
  `),!t||!r)return;let n=await oe(e);process.stdout.write(`pending skills: ${n.length}
49
- `);let o=await $(b(e)),i=await $(B(e));process.stdout.write(`context file: ${o?"present":"missing"}
49
+ `);let o=await $(R(e)),i=await $(B(e));process.stdout.write(`context file: ${o?"present":"missing"}
50
50
  `),process.stdout.write(`post-commit hook: ${i?"installed":"missing"}
51
51
  `);let s=await te(e),a=await St(e,s);process.stdout.write(`head: ${s}
52
52
  `),process.stdout.write(`latest proof: ${a??"none"}
@@ -56,7 +56,7 @@ Skillcraft-Ref: ${t}
56
56
  `)}async function Lt(){let e=process.cwd(),t=[["node",!!process.version],["git",await q(e)],["skillcraft config",await $(A(e))],["plugin hook",await $(B(e))]];for(let[r,n]of t)process.stdout.write(`${r}: ${n?"ok":"missing"}
57
57
  `);if(!process.env.GITHUB_TOKEN&&!await Zr("gh")){process.stdout.write(`gh: not installed
58
58
  `);return}process.stdout.write(`gh: available
59
- `)}async function Zr(e){try{let{execSync:t}=await import("child_process");return t(`command -v ${e}`),!0}catch{return!1}}import Xr from"path";async function jt(){let e=process.cwd();if(!await q(e))throw new Error("Current directory is not a git repository");let t=await ee(e),r=await j();if(!r.githubUser){let i=process.env.GITHUB_USER||process.env.USER||"developer";await lt({...r,githubUser:i})}await C(I(t)),await C(Xr.dirname(de(t))),await J(de(t),Yr()),await w(re(t),{agent:{provider:"opencode"},model:{}});let n=`refs/heads/${U}`;await M(t,n)||await y(["branch",U],t),await w(A(t),{version:1,proofRef:U}),await C(E()),await w(L(t),{skills:[]}),await w(b(t),{activeLoadouts:[]}),await w(ge(t),{version:1,providers:["opencode"],enabled:!0}),await ot(t);let o=await T(t);await ut({path:t,remote:o,enabledAt:new Date().toISOString()}),process.stdout.write(`enabled skillcraft for ${t}
59
+ `)}async function Zr(e){try{let{execSync:t}=await import("child_process");return t(`command -v ${e}`),!0}catch{return!1}}import Xr from"path";async function jt(){let e=process.cwd();if(!await q(e))throw new Error("Current directory is not a git repository");let t=await ee(e),r=await j();if(!r.githubUser){let i=process.env.GITHUB_USER||process.env.USER||"developer";await lt({...r,githubUser:i})}await C(I(t)),await C(Xr.dirname(de(t))),await J(de(t),Yr()),await w(re(t),{agent:{provider:"opencode"},model:{}});let n=`refs/heads/${U}`;await M(t,n)||await y(["branch",U],t),await w(A(t),{version:1,proofRef:U}),await C(E()),await w(L(t),{skills:[]}),await w(R(t),{activeLoadouts:[]}),await w(ge(t),{version:1,providers:["opencode"],enabled:!0}),await ot(t);let o=await T(t);await ut({path:t,remote:o,enabledAt:new Date().toISOString()}),process.stdout.write(`enabled skillcraft for ${t}
60
60
  `)}function Yr(){return`import fs from 'node:fs/promises'
61
61
  import path from 'node:path'
62
62
 
@@ -216,7 +216,7 @@ export default async function Skillcraft() {
216
216
  `}async function qt(){let e=await _();if(!e.repos.length){process.stdout.write(`no repositories tracked
217
217
  `);return}e.repos.forEach((t,r)=>{process.stdout.write(`${r+1}. ${t.path}`),t.remote&&process.stdout.write(` (${t.remote})`),process.stdout.write(`
218
218
  `)})}async function Nt(){let e=await _(),t=[];for(let r of e.repos)await q(r.path)&&(await ee(r.path),t.push(r));await we({repos:t}),process.stdout.write(`pruned repo list: ${e.repos.length} -> ${t.length}
219
- `)}async function ie(e){return Ne(e)}import Qr from"path";var en="https://skillcraft.gg/credentials/credentials/index.json",tn=360*60*1e3,Te=1,se=nt();function rn(){return process.env.SKILLCRAFT_CREDENTIAL_INDEX_URL?.trim()||en}async function _t(e){try{let t=await v(e);if(!t||!W(t))return null;let r=nn(t.cachedAt);if(r===void 0||r<=0||t.version!==Te||!("entries"in t))return null;let n=Re(t.entries);return{cachedAt:r,version:Te,entries:n}}catch{return null}}function nn(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){let t=Number.parseInt(e,10);if(Number.isFinite(t))return t}}function on(e){return Date.now()-e.cachedAt<tn}async function sn(e={}){let t=process.env.SKILLCRAFT_CREDENTIAL_INDEX_PATH?.trim();if(t)return Ft(t);let r=e.refresh?null:await _t(se);if(r&&on(r))return r.entries;try{let n=await an(rn());return await cn(n),n}catch(n){if(await $(se)){let o=await _t(se);return o?o.entries:Ft(se)}throw n instanceof Error?n:new Error("failed to load credential index")}}async function an(e){let t=await fetch(e,{headers:{"user-agent":"skillcraft-cli"}});if(!t.ok)throw new Error(`failed to download credential index from ${e}`);let r=await t.json();return Re(r)}async function Ft(e){let t=await v(e);return t?W(t)&&Array.isArray(t.entries)?Re(t.entries):Re(t):[]}async function cn(e){await C(Qr.dirname(se));let t={cachedAt:Date.now(),version:Te,entries:e};await w(se,t)}function dn(e){let t=W(e)?e:{};if(t.mode!==void 0)throw new Error("requirements.mode is not supported. Use nested and/or expressions instead.");let r=ln(t);return{minCommits:Mt(t.min_commits??t.minCommits,0),minRepositories:Mt(t.min_repositories??t.minRepositories,0),tree:r}}function ln(e){if(Object.prototype.hasOwnProperty.call(e,"tree"))return De(e.tree,"requirements.tree");let t=Object.prototype.hasOwnProperty.call(e,"and"),r=Object.prototype.hasOwnProperty.call(e,"or");if(t&&r)throw new Error("requirements cannot include both and and or at the same level");if(t){let n=Object.keys(e).filter(o=>!["and","min_commits","min_repositories","minRepositories","minCommits","tree"].includes(o));if(n.length)throw new Error(`Unexpected requirement fields: ${n.join(", ")}`);return{and:Ot(e.and,"requirements.and")}}if(r){let n=Object.keys(e).filter(o=>!["or","min_commits","min_repositories","minRepositories","minCommits","tree"].includes(o));if(n.length)throw new Error(`Unexpected requirement fields: ${n.join(", ")}`);return{or:Ot(e.or,"requirements.or")}}return{and:un(e)}}function Ot(e,t){if(!Array.isArray(e))throw new Error(`Expected array at ${t}`);return e.map((r,n)=>De(r,`${t}[${n}]`))}function Tt(e,t){if(e===void 0)return[];if(Array.isArray(e))return e.map(n=>{let o=S(n);if(o===void 0)throw new Error(`Expected text values for ${t}`);return o});let r=S(e);return r?[r]:[]}function un(e){let t=[],r=["and","or","min_commits","min_repositories","minRepositories","minCommits","tree","skill","loadout","agent","model"];for(let c of Tt(e.skill,"requirements.skill"))t.push({skill:c});for(let c of Tt(e.loadout,"requirements.loadout"))t.push({loadout:c});let n=Object.prototype.hasOwnProperty.call(e,"agent"),o=Dt(e.agent);if(o)t.push(o);else if(n)throw new Error("requirements.agent must be an object with a provider");let i=Object.prototype.hasOwnProperty.call(e,"model"),s=zt(e.model);if(s)t.push(s);else if(i)throw new Error("requirements.model must be an object with optional provider and/or name");let a=Object.keys(e).filter(c=>!r.includes(c)&&!c.startsWith("$"));if(a.length)throw new Error(`Unexpected requirement fields: ${a.join(", ")}`);return t}function De(e,t){if(!W(e))throw new Error(`Invalid requirement node at ${t}`);let r=Object.keys(e);if(!r.length)throw new Error(`Empty requirement node at ${t}`);if(r.length>1)throw new Error(`Requirement node has multiple keys at ${t}`);let[n]=r;if(n==="and"||n==="or"){let o=e[n];if(!Array.isArray(o))throw new Error(`Requirement node ${t} expected array for ${n}`);return{[n]:o.map((i,s)=>De(i,`${t}.${n}[${s}]`))}}if(n==="skill"){let o=S(e[n]);if(!o)throw new Error(`Requirement node ${t} has empty skill`);return{skill:o}}if(n==="loadout"){let o=S(e[n]);if(!o)throw new Error(`Requirement node ${t} has empty loadout`);return{loadout:o}}if(n==="agent"){let o=Dt(e[n]);if(!o)throw new Error(`Requirement node ${t} has invalid agent requirement`);return o}if(n==="model"){let o=zt(e[n]);if(!o)throw new Error(`Requirement node ${t} has invalid model requirement`);return o}throw new Error(`Unexpected requirement key ${n} at ${t}`)}function Dt(e){if(!W(e))return;let t=S(e.provider);if(t)return{agent:{provider:t.toLowerCase()}}}function zt(e){if(!W(e))return;let t=S(e.provider),r=S(e.name);if(!(!t&&!r))return{model:{...t?{provider:t.toLowerCase()}:{},...r?{name:r}:{}}}}function Ht(e,t,r,n){let o=[],i=[],s=[],a=[],c=Array.from(new Set((t||[]).filter(Boolean))),g=Array.from(new Set((r||[]).filter(Boolean)));for(let p of e){let m=p.proof;for(let K of m.skills){let Q=ze(K.id);Q.id&&o.push({id:Q.id,version:Q.version})}for(let K of m.loadouts){let Q=S(K);Q&&i.push(Q)}m.agent?.provider&&typeof m.agent.provider=="string"&&s.push(m.agent.provider);let x=m.model?.provider,Y=m.model?.name;(typeof x=="string"||typeof Y=="string")&&a.push({provider:x,name:Y})}let l=Me(n.tree,{skills:o,loadouts:i,agents:s,models:a}),d=l.checks,u=[...mn(d)];return n.minCommits>c.length&&(u.push(`minimum required commits not met: have ${c.length}, need ${n.minCommits}`),l.passed=!1),n.minRepositories>g.length&&(u.push(`minimum required repositories not met: have ${g.length}, need ${n.minRepositories}`),l.passed=!1),{passed:l.passed,proofs:e,provenCommits:c,provenRepos:g,checks:d,reasons:u,noExplicitChecks:l.noExplicitChecks}}function Me(e,t){if("and"in e){let r=[],n=[],o=!0;for(let i of e.and){let s=Me(i,t);r.push(...s.checks),n.push(s),s.noExplicitChecks||(o=!1)}return{passed:n.every(i=>i.passed),checks:r,noExplicitChecks:o}}if("or"in e){let r=[],n=[],o=!0;for(let i of e.or){let s=Me(i,t);r.push(...s.checks),n.push(s),s.noExplicitChecks||(o=!1)}return{passed:n.some(i=>i.passed),checks:r,noExplicitChecks:o}}if("skill"in e){let r=ze(e.skill),n=pn(t.skills,r);return{passed:n,checks:[{type:"skill",requirement:e.skill,satisfied:n}],noExplicitChecks:!1}}if("loadout"in e){let r=gn(e.loadout),n=t.loadouts.includes(e.loadout)||r&&r.id!==""&&t.loadouts.includes(r.id);return{passed:n,checks:[{type:"loadout",requirement:e.loadout,satisfied:n}],noExplicitChecks:!1}}if("agent"in e){let r=Oe(e.agent.provider),n=t.agents.some(o=>o===r);return{passed:n,checks:[{type:"agent",requirement:`provider=${r}`,satisfied:n}],noExplicitChecks:!1}}if("model"in e){let r=Oe(e.model.provider),n=Oe(e.model.name),o=t.models.some(s=>{let a=!r||s.provider===r,c=!n||s.name&&s.name===n;return a&&c}),i=[];return r&&i.push(`provider=${r}`),n&&i.push(`name=${n}`),{passed:o,checks:[{type:"model",requirement:i.join(",")||"model",satisfied:o}],noExplicitChecks:!1}}throw new Error("Unknown requirement node encountered during evaluation")}function mn(e){return e.filter(t=>!t.satisfied).map(t=>`${t.type} ${t.requirement} not met`)}function pn(e,t){return e.some(r=>fn(r.id,r.version,t))}function fn(e,t,r){return e!==r.id?!1:r.version?t===r.version:!0}function gn(e){return ze(e)}function ze(e){let t=S(e);if(!t)return{id:""};let r=t.split("@");return{id:r[0],version:r.length>1?r.slice(1).join("@"):void 0}}function Oe(e){return typeof e=="string"?e.trim().toLowerCase():""}function S(e){return typeof e!="string"?void 0:e.trim()||void 0}function Mt(e,t){return typeof e!="number"||!Number.isFinite(e)||e<0?t:Math.floor(e)}function W(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Re(e){if(!Array.isArray(e))return[];let t=[];for(let r of e){let n=hn(r);n&&t.push(n)}return t.sort((r,n)=>r.id.localeCompare(n.id))}function hn(e){if(!W(e))return;let t=S(e.id);if(t)try{return{id:t,name:S(e.name),description:S(e.description),requirements:dn(e.requirements)}}catch{return}}async function He(e={}){return sn(e)}function Kt(e){process.stdout.write(`${e.join(`
219
+ `)}async function ie(e){return Ne(e)}import Qr from"path";var en="https://skillcraft.gg/credentials/credentials/index.json",tn=360*60*1e3,Te=1,se=nt();function rn(){return process.env.SKILLCRAFT_CREDENTIAL_INDEX_URL?.trim()||en}async function _t(e){try{let t=await v(e);if(!t||!W(t))return null;let r=nn(t.cachedAt);if(r===void 0||r<=0||t.version!==Te||!("entries"in t))return null;let n=be(t.entries);return{cachedAt:r,version:Te,entries:n}}catch{return null}}function nn(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()){let t=Number.parseInt(e,10);if(Number.isFinite(t))return t}}function on(e){return Date.now()-e.cachedAt<tn}async function sn(e={}){let t=process.env.SKILLCRAFT_CREDENTIAL_INDEX_PATH?.trim();if(t)return Ft(t);let r=e.refresh?null:await _t(se);if(r&&on(r))return r.entries;try{let n=await an(rn());return await cn(n),n}catch(n){if(await $(se)){let o=await _t(se);return o?o.entries:Ft(se)}throw n instanceof Error?n:new Error("failed to load credential index")}}async function an(e){let t=await fetch(e,{headers:{"user-agent":"skillcraft-cli"}});if(!t.ok)throw new Error(`failed to download credential index from ${e}`);let r=await t.json();return be(r)}async function Ft(e){let t=await v(e);return t?W(t)&&Array.isArray(t.entries)?be(t.entries):be(t):[]}async function cn(e){await C(Qr.dirname(se));let t={cachedAt:Date.now(),version:Te,entries:e};await w(se,t)}function dn(e){let t=W(e)?e:{};if(t.mode!==void 0)throw new Error("requirements.mode is not supported. Use nested and/or expressions instead.");let r=ln(t);return{minCommits:Mt(t.min_commits??t.minCommits,0),minRepositories:Mt(t.min_repositories??t.minRepositories,0),tree:r}}function ln(e){if(Object.prototype.hasOwnProperty.call(e,"tree"))return De(e.tree,"requirements.tree");let t=Object.prototype.hasOwnProperty.call(e,"and"),r=Object.prototype.hasOwnProperty.call(e,"or");if(t&&r)throw new Error("requirements cannot include both and and or at the same level");if(t){let n=Object.keys(e).filter(o=>!["and","min_commits","min_repositories","minRepositories","minCommits","tree"].includes(o));if(n.length)throw new Error(`Unexpected requirement fields: ${n.join(", ")}`);return{and:Ot(e.and,"requirements.and")}}if(r){let n=Object.keys(e).filter(o=>!["or","min_commits","min_repositories","minRepositories","minCommits","tree"].includes(o));if(n.length)throw new Error(`Unexpected requirement fields: ${n.join(", ")}`);return{or:Ot(e.or,"requirements.or")}}return{and:un(e)}}function Ot(e,t){if(!Array.isArray(e))throw new Error(`Expected array at ${t}`);return e.map((r,n)=>De(r,`${t}[${n}]`))}function Tt(e,t){if(e===void 0)return[];if(Array.isArray(e))return e.map(n=>{let o=S(n);if(o===void 0)throw new Error(`Expected text values for ${t}`);return o});let r=S(e);return r?[r]:[]}function un(e){let t=[],r=["and","or","min_commits","min_repositories","minRepositories","minCommits","tree","skill","loadout","agent","model"];for(let c of Tt(e.skill,"requirements.skill"))t.push({skill:c});for(let c of Tt(e.loadout,"requirements.loadout"))t.push({loadout:c});let n=Object.prototype.hasOwnProperty.call(e,"agent"),o=Dt(e.agent);if(o)t.push(o);else if(n)throw new Error("requirements.agent must be an object with a provider");let i=Object.prototype.hasOwnProperty.call(e,"model"),s=zt(e.model);if(s)t.push(s);else if(i)throw new Error("requirements.model must be an object with optional provider and/or name");let a=Object.keys(e).filter(c=>!r.includes(c)&&!c.startsWith("$"));if(a.length)throw new Error(`Unexpected requirement fields: ${a.join(", ")}`);return t}function De(e,t){if(!W(e))throw new Error(`Invalid requirement node at ${t}`);let r=Object.keys(e);if(!r.length)throw new Error(`Empty requirement node at ${t}`);if(r.length>1)throw new Error(`Requirement node has multiple keys at ${t}`);let[n]=r;if(n==="and"||n==="or"){let o=e[n];if(!Array.isArray(o))throw new Error(`Requirement node ${t} expected array for ${n}`);return{[n]:o.map((i,s)=>De(i,`${t}.${n}[${s}]`))}}if(n==="skill"){let o=S(e[n]);if(!o)throw new Error(`Requirement node ${t} has empty skill`);return{skill:o}}if(n==="loadout"){let o=S(e[n]);if(!o)throw new Error(`Requirement node ${t} has empty loadout`);return{loadout:o}}if(n==="agent"){let o=Dt(e[n]);if(!o)throw new Error(`Requirement node ${t} has invalid agent requirement`);return o}if(n==="model"){let o=zt(e[n]);if(!o)throw new Error(`Requirement node ${t} has invalid model requirement`);return o}throw new Error(`Unexpected requirement key ${n} at ${t}`)}function Dt(e){if(!W(e))return;let t=S(e.provider);if(t)return{agent:{provider:t.toLowerCase()}}}function zt(e){if(!W(e))return;let t=S(e.provider),r=S(e.name);if(!(!t&&!r))return{model:{...t?{provider:t.toLowerCase()}:{},...r?{name:r}:{}}}}function Ht(e,t,r,n){let o=[],i=[],s=[],a=[],c=Array.from(new Set((t||[]).filter(Boolean))),g=Array.from(new Set((r||[]).filter(Boolean)));for(let p of e){let m=p.proof;for(let K of m.skills){let Q=ze(K.id);Q.id&&o.push({id:Q.id,version:Q.version})}for(let K of m.loadouts){let Q=S(K);Q&&i.push(Q)}m.agent?.provider&&typeof m.agent.provider=="string"&&s.push(m.agent.provider);let x=m.model?.provider,Y=m.model?.name;(typeof x=="string"||typeof Y=="string")&&a.push({provider:x,name:Y})}let l=Me(n.tree,{skills:o,loadouts:i,agents:s,models:a}),d=l.checks,u=[...mn(d)];return n.minCommits>c.length&&(u.push(`minimum required commits not met: have ${c.length}, need ${n.minCommits}`),l.passed=!1),n.minRepositories>g.length&&(u.push(`minimum required repositories not met: have ${g.length}, need ${n.minRepositories}`),l.passed=!1),{passed:l.passed,proofs:e,provenCommits:c,provenRepos:g,checks:d,reasons:u,noExplicitChecks:l.noExplicitChecks}}function Me(e,t){if("and"in e){let r=[],n=[],o=!0;for(let i of e.and){let s=Me(i,t);r.push(...s.checks),n.push(s),s.noExplicitChecks||(o=!1)}return{passed:n.every(i=>i.passed),checks:r,noExplicitChecks:o}}if("or"in e){let r=[],n=[],o=!0;for(let i of e.or){let s=Me(i,t);r.push(...s.checks),n.push(s),s.noExplicitChecks||(o=!1)}return{passed:n.some(i=>i.passed),checks:r,noExplicitChecks:o}}if("skill"in e){let r=ze(e.skill),n=pn(t.skills,r);return{passed:n,checks:[{type:"skill",requirement:e.skill,satisfied:n}],noExplicitChecks:!1}}if("loadout"in e){let r=gn(e.loadout),n=t.loadouts.includes(e.loadout)||r&&r.id!==""&&t.loadouts.includes(r.id);return{passed:n,checks:[{type:"loadout",requirement:e.loadout,satisfied:n}],noExplicitChecks:!1}}if("agent"in e){let r=Oe(e.agent.provider),n=t.agents.some(o=>o===r);return{passed:n,checks:[{type:"agent",requirement:`provider=${r}`,satisfied:n}],noExplicitChecks:!1}}if("model"in e){let r=Oe(e.model.provider),n=Oe(e.model.name),o=t.models.some(s=>{let a=!r||s.provider===r,c=!n||s.name&&s.name===n;return a&&c}),i=[];return r&&i.push(`provider=${r}`),n&&i.push(`name=${n}`),{passed:o,checks:[{type:"model",requirement:i.join(",")||"model",satisfied:o}],noExplicitChecks:!1}}throw new Error("Unknown requirement node encountered during evaluation")}function mn(e){return e.filter(t=>!t.satisfied).map(t=>`${t.type} ${t.requirement} not met`)}function pn(e,t){return e.some(r=>fn(r.id,r.version,t))}function fn(e,t,r){return e!==r.id?!1:r.version?t===r.version:!0}function gn(e){return ze(e)}function ze(e){let t=S(e);if(!t)return{id:""};let r=t.split("@");return{id:r[0],version:r.length>1?r.slice(1).join("@"):void 0}}function Oe(e){return typeof e=="string"?e.trim().toLowerCase():""}function S(e){return typeof e!="string"?void 0:e.trim()||void 0}function Mt(e,t){return typeof e!="number"||!Number.isFinite(e)||e<0?t:Math.floor(e)}function W(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function be(e){if(!Array.isArray(e))return[];let t=[];for(let r of e){let n=hn(r);n&&t.push(n)}return t.sort((r,n)=>r.id.localeCompare(n.id))}function hn(e){if(!W(e))return;let t=S(e.id);if(t)try{return{id:t,name:S(e.name),description:S(e.description),requirements:dn(e.requirements)}}catch{return}}async function He(e={}){return sn(e)}function Kt(e){process.stdout.write(`${e.join(`
220
220
  `)}
221
221
  `)}async function wn(){let e=await _(),t=new Set,r=[];for(let n of e.repos)t.has(n.path)||(t.add(n.path),await P(n.path)&&r.push(n.path));return r}async function Ut(e={}){let t=await wn(),n=(await ye()).credentials;if(!n.length){if(e.outputMode==="json"){Jt(Bt({tracked:t,trackedCredentialsCount:0,proofFiles:0,provenCommits:0,provenRepositories:0,evaluated:[]}));return}process.stdout.write(`no credentials tracked
222
222
  `);return}let o=Vt(await He({refresh:e.refreshIndex})),i=0,s=[],a=new Set,c=new Set;for(let m of t){let x=await ie(m);if(i+=x.length,!x.length)continue;let Y=await T(m)||m;a.add(Y);for(let K of x)K?.commit&&c.add(K.commit),s.push({proof:K})}let g=Array.from(c),l=Array.from(a),d=Bt({tracked:t,trackedCredentialsCount:n.length,proofFiles:i,provenCommits:g.length,provenRepositories:l.length,evaluated:[]}),u=[];for(let m of n){let x=o.get(m.id);if(!x){u.push(yn(m.id,s.length,g.length,l.length));continue}let Y=Ht(s,g,l,x.requirements);u.push(kn(m.id,x,Y,s.length,g.length,l.length))}if(d.credentials=u,e.outputMode==="json"){Jt(d);return}let p=[];p.push(`tracked credentials: ${n.length}`),p.push(`tracked repositories: ${t.length}`),p.push(`proof files: ${i}`),p.push(`proof commits: ${g.length}`),p.push(`proof repositories: ${l.length}`),p.push("");for(let m of u){if(p.push(`${m.credentialId}: ${m.status}`),p.push(` checks: ${m.passed?"passed":"blocked"}`),p.push(` proof scope: ${m.proofFiles} proofs, ${m.provenCommits}/${m.requiredMinCommits} commits, ${m.provenRepositories}/${m.requiredMinRepositories} repositories`),m.reasons.length){p.push(" reasons:");for(let x of m.reasons)p.push(` - ${x}`)}p.push("")}Kt(p)}async function Gt(e){let t=F(e,"credential id");if(!Vt(await He()).has(t))throw new Error(`credential not found in credential index: ${t}`);if(!await ft(t)){process.stdout.write(`credential already tracked: ${t}
@@ -224,7 +224,7 @@ export default async function Skillcraft() {
224
224
  `)}async function Wt(e){let t=F(e,"credential id");if(!await gt(t)){process.stdout.write(`credential not tracked: ${t}
225
225
  `);return}process.stdout.write(`untracked credential: ${t}
226
226
  `)}function Bt(e){return{trackedCredentials:e.trackedCredentialsCount,trackedRepositories:e.tracked.length,evidence:{proofFiles:e.proofFiles,provenCommits:e.provenCommits,provenRepositories:e.provenRepositories},credentials:e.evaluated}}function Jt(e){process.stdout.write(`${JSON.stringify(e)}
227
- `)}function Vt(e){return new Map(e.map(t=>[t.id,t]))}function yn(e,t,r,n){return{credentialId:e,passed:!1,status:"blocked",reasons:["credential definition is not available"],checks:[],requiredMinCommits:0,requiredMinRepositories:0,provenCommits:r,provenRepositories:n,proofFiles:t}}function kn(e,t,r,n,o,i){return{credentialId:e,name:t.name,description:t.description,passed:r.passed,status:r.passed?"eligible":"blocked",reasons:r.reasons,checks:r.checks,requiredMinCommits:t.requirements.minCommits,requiredMinRepositories:t.requirements.minRepositories,provenCommits:o,provenRepositories:i,proofFiles:n}}import Z from"path";import O from"fs/promises";import z from"fs/promises";import Ke from"path";import{execFile as vn,execSync as xn}from"child_process";import{promisify as Pn}from"util";var Rn=Pn(vn);function bn(){try{return xn("which gh",{stdio:"ignore"}),!0}catch{return!1}}async function V(e){if(!bn())throw new Error("gh CLI is required for this workflow");return(await Rn("gh",e,{encoding:"utf8"})).stdout.trim()}async function Zt(e,t){await z.mkdir(t,{recursive:!0});let r=await z.readdir(e,{withFileTypes:!0});for(let n of r){if(n.name===".git")continue;let o=Ke.join(e,n.name),i=Ke.join(t,n.name);if(n.isDirectory()){await Zt(o,i);continue}if(n.isSymbolicLink()){let s=await z.readlink(o);await z.symlink(s,i);continue}n.isFile()&&await z.copyFile(o,i)}}var be=class{providerName(){return"gh"}async getUser(){let t=await V(["auth","status","--json","user"]);return JSON.parse(t).user?.login||""}async getIssueUrl(t,r){return`https://github.com/${t}/issues/${r}`}async createIssue(t,r,n){let i=(await V(["issue","create","-R",t,"--title",r,"--body",n,"--label","skillcraft-claim"])).match(/\b(\d+)$/);return i?Number(i[1]):0}async createPullRequest(t,r,n){let i=(await V(["pr","create","--repo",t,"--head",r,"--base","main","--title",n,"--body",`Generated by skillcraft for ${n}`,"--fill-first"])).match(/\b(\d+)$/);return i?Number(i[1]):0}async openPullRequestForBranch(t,r,n,o,i){let a=(await V(["pr","create","--repo",t,"--head",`${r}:${n}`,"--base","main","--title",o,"--body",i])).match(/\b(\d+)$/);return a?Number(a[1]):0}async getIssueStatus(t,r){let n=await V(["issue","view",String(r),"--repo",t,"--json","state,labels,url"]),o=JSON.parse(n);return{state:o.state,labels:o.labels?.map(i=>i.name)??[],url:o.url}}async listClaimIssues(t){let r=await V(["issue","list","--repo",t,"--label","skillcraft-claim","--state","all","--json","number,title,state","--limit","50"]);return JSON.parse(r)}async cloneRepo(t,r){let n=Ke.resolve(r);await V(["repo","clone",t,n])}async copyDirectory(t,r){await z.readdir(r).catch(()=>{})&&await z.rm(r,{recursive:!0,force:!0}),await z.mkdir(r,{recursive:!0}),await Zt(t,r)}};var Cn={gh:()=>new be};function H(e){return Cn[e]()}import{execFile as Sn}from"child_process";import{promisify as $n}from"util";import En from"ora";var In=$n(Sn);async function rr(e){let t=F(e,"skill id"),{owner:r,slug:n}=ke(t),o=process.cwd();if(!await P(o))throw new Error("Repository is not enabled");let i=await Promise.all([O.access(Z.join(o,"SKILL.md")).then(()=>!0).catch(()=>!1),O.access(Z.join(o,"skill.yaml")).then(()=>!0).catch(()=>!1)]);if(!i[0]||!i[1])throw new Error("SKILL.md and skill.yaml are required for publishing");let s=await j(),a=H(s.provider??"gh");await a.getUser();let c="skillcraft-gg/skills",g=`skillcraft-skill-${r}-${n}`,l=Z.join(process.cwd(),".skillcraft-temp-skill-publish");try{await O.rm(l,{force:!0,recursive:!0}),await a.cloneRepo(c,l),await Ce(l,["checkout","-B",g]);let d=Z.join(l,"skills",r,n);await O.rm(d,{force:!0,recursive:!0}),await O.mkdir(Z.dirname(d),{recursive:!0}),await O.cp(o,d,{recursive:!0}),await Ce(l,["add",`skills/${r}/${n}`]),await Ce(l,["commit","-m",`Publish skill ${t}`]).catch(()=>{throw new Error("nothing to commit; skill may already be published")}),await Ce(l,["push","-u","origin",g]).catch(()=>{throw new Error("unable to push skill publish branch")}),await a.createPullRequest(c,g,`Publish skill: ${t}`).catch(()=>{process.stdout.write(`unable to create PR automatically. Please open one manually from your branch.
227
+ `)}function Vt(e){return new Map(e.map(t=>[t.id,t]))}function yn(e,t,r,n){return{credentialId:e,passed:!1,status:"blocked",reasons:["credential definition is not available"],checks:[],requiredMinCommits:0,requiredMinRepositories:0,provenCommits:r,provenRepositories:n,proofFiles:t}}function kn(e,t,r,n,o,i){return{credentialId:e,name:t.name,description:t.description,passed:r.passed,status:r.passed?"eligible":"blocked",reasons:r.reasons,checks:r.checks,requiredMinCommits:t.requirements.minCommits,requiredMinRepositories:t.requirements.minRepositories,provenCommits:o,provenRepositories:i,proofFiles:n}}import Z from"path";import O from"fs/promises";import z from"fs/promises";import Ke from"path";import{execFile as vn,execSync as xn}from"child_process";import{promisify as Pn}from"util";var bn=Pn(vn);function Rn(){try{return xn("which gh",{stdio:"ignore"}),!0}catch{return!1}}async function V(e){if(!Rn())throw new Error("gh CLI is required for this workflow");return(await bn("gh",e,{encoding:"utf8"})).stdout.trim()}async function Zt(e,t){await z.mkdir(t,{recursive:!0});let r=await z.readdir(e,{withFileTypes:!0});for(let n of r){if(n.name===".git")continue;let o=Ke.join(e,n.name),i=Ke.join(t,n.name);if(n.isDirectory()){await Zt(o,i);continue}if(n.isSymbolicLink()){let s=await z.readlink(o);await z.symlink(s,i);continue}n.isFile()&&await z.copyFile(o,i)}}var Re=class{providerName(){return"gh"}async getUser(){let t=await V(["auth","status","--json","user"]);return JSON.parse(t).user?.login||""}async getIssueUrl(t,r){return`https://github.com/${t}/issues/${r}`}async createIssue(t,r,n){let i=(await V(["issue","create","-R",t,"--title",r,"--body",n,"--label","skillcraft-claim"])).match(/\b(\d+)$/);return i?Number(i[1]):0}async createPullRequest(t,r,n){let i=(await V(["pr","create","--repo",t,"--head",r,"--base","main","--title",n,"--body",`Generated by skillcraft for ${n}`,"--fill-first"])).match(/\b(\d+)$/);return i?Number(i[1]):0}async openPullRequestForBranch(t,r,n,o,i){let a=(await V(["pr","create","--repo",t,"--head",`${r}:${n}`,"--base","main","--title",o,"--body",i])).match(/\b(\d+)$/);return a?Number(a[1]):0}async getIssueStatus(t,r){let n=await V(["issue","view",String(r),"--repo",t,"--json","state,labels,url"]),o=JSON.parse(n);return{state:o.state,labels:o.labels?.map(i=>i.name)??[],url:o.url}}async listClaimIssues(t){let r=await V(["issue","list","--repo",t,"--label","skillcraft-claim","--state","all","--json","number,title,state","--limit","50"]);return JSON.parse(r)}async cloneRepo(t,r){let n=Ke.resolve(r);await V(["repo","clone",t,n])}async copyDirectory(t,r){await z.readdir(r).catch(()=>{})&&await z.rm(r,{recursive:!0,force:!0}),await z.mkdir(r,{recursive:!0}),await Zt(t,r)}};var Cn={gh:()=>new Re};function H(e){return Cn[e]()}import{execFile as Sn}from"child_process";import{promisify as $n}from"util";import En from"ora";var In=$n(Sn);async function rr(e){let t=F(e,"skill id"),{owner:r,slug:n}=ke(t),o=process.cwd();if(!await P(o))throw new Error("Repository is not enabled");let i=await Promise.all([O.access(Z.join(o,"SKILL.md")).then(()=>!0).catch(()=>!1),O.access(Z.join(o,"skill.yaml")).then(()=>!0).catch(()=>!1)]);if(!i[0]||!i[1])throw new Error("SKILL.md and skill.yaml are required for publishing");let s=await j(),a=H(s.provider??"gh");await a.getUser();let c="skillcraft-gg/skills",g=`skillcraft-skill-${r}-${n}`,l=Z.join(process.cwd(),".skillcraft-temp-skill-publish");try{await O.rm(l,{force:!0,recursive:!0}),await a.cloneRepo(c,l),await Ce(l,["checkout","-B",g]);let d=Z.join(l,"skills",r,n);await O.rm(d,{force:!0,recursive:!0}),await O.mkdir(Z.dirname(d),{recursive:!0}),await O.cp(o,d,{recursive:!0}),await Ce(l,["add",`skills/${r}/${n}`]),await Ce(l,["commit","-m",`Publish skill ${t}`]).catch(()=>{throw new Error("nothing to commit; skill may already be published")}),await Ce(l,["push","-u","origin",g]).catch(()=>{throw new Error("unable to push skill publish branch")}),await a.createPullRequest(c,g,`Publish skill: ${t}`).catch(()=>{process.stdout.write(`unable to create PR automatically. Please open one manually from your branch.
228
228
  `)}),process.stdout.write(`published skill ${t} from ${c}
229
229
  `)}finally{await O.rm(l,{force:!0,recursive:!0})}}async function nr(e){let t=process.cwd();if(!await P(t))throw new Error("Repository is not enabled");let r=F(e,"skill id"),n=D(r);if(!n.id)throw new Error("invalid skill id format");if(!(await On()).has(n.id))throw new Error(`skill ${n.id} is not listed in the search index`);let i=Pe([`${n.id}${n.version?`@${n.version}`:""}`]),s=await oe(t),a=Pe([...s,...i]);await w(L(t),{skills:a}),process.stdout.write(`queued skill: ${i[0]}
230
230
  `)}async function An(){let e=process.cwd(),t=[["SKILL.md",await tr(Z.join(e,"SKILL.md"))],["skill.yaml",await tr(Z.join(e,"skill.yaml"))]];for(let[r,n]of t)process.stdout.write(`${r}: ${n?"ok":"missing"}
@@ -258,10 +258,10 @@ ${l.join(`
258
258
  `)}async function ur(e,t){let r=await Jn(e,{allRepos:t?.allRepos,repo:t?.repo}),n=Bn.stringify(r),o=await j(),s=await H(o.provider??"gh").createIssue("skillcraft-gg/credentials",`claim: ${e}`,n);process.stdout.write(`opened claim: #${s}
259
259
  `),process.stdout.write(`payload:
260
260
  ${n}
261
- `)}async function Jn(e,t){let r=await Un(t),n=[];for(let a of r){let c=await ie(a),g=await T(a)||a,l=Array.from(new Set(c.map(d=>d?.commit).filter(Boolean)));n.push({repo:g,commits:l})}let o=process.env.GITHUB_USER||process.env.USER||"unknown",i=`${o}:${e}:${n.map(a=>`${a.repo}:${a.commits.length}`).join("|")}:${Date.now()}`,s=Kn("sha256").update(i).digest("hex").slice(0,8);return{claim_version:1,claimant:{github:o},credential:{id:e},sources:n,claim_id:`sha256:${s}`}}async function Un(e){let t=e.allRepos?(await _()).repos.map(o=>o.path):[process.cwd()],r=e.repo?e.repo:t,n=[];for(let o of r)await It(o)&&n.push(o);return n}import ue from"path";import X from"fs/promises";import{execFile as Gn}from"child_process";import{promisify as Wn}from"util";var Vn=Wn(Gn);async function mr(e){if(!Le(e))throw new Error("loadout id must be <owner>/<slug>");let t=process.cwd();if(!await P(t))throw new Error("Repository is not enabled");let r=await v(b(t)),n=Array.isArray(r?.activeLoadouts)?r.activeLoadouts.filter(Boolean):[];n.includes(e)||n.push(e),await w(b(t),{activeLoadouts:n}),process.stdout.write(`activated loadout: ${e}
262
- `)}async function pr(){let e=process.cwd();if(!await P(e))throw new Error("Repository is not enabled");await w(b(e),{activeLoadouts:[]}),process.stdout.write(`cleared active loadouts
261
+ `)}async function Jn(e,t){let r=await Un(t),n=[];for(let a of r){let c=await ie(a),g=await T(a)||a,l=Array.from(new Set(c.map(d=>d?.commit).filter(Boolean)));n.push({repo:g,commits:l})}let o=process.env.GITHUB_USER||process.env.USER||"unknown",i=`${o}:${e}:${n.map(a=>`${a.repo}:${a.commits.length}`).join("|")}:${Date.now()}`,s=Kn("sha256").update(i).digest("hex").slice(0,8);return{claim_version:1,claimant:{github:o},credential:{id:e},sources:n,claim_id:`sha256:${s}`}}async function Un(e){let t=e.allRepos?(await _()).repos.map(o=>o.path):[process.cwd()],r=e.repo?e.repo:t,n=[];for(let o of r)await It(o)&&n.push(o);return n}import ue from"path";import X from"fs/promises";import{execFile as Gn}from"child_process";import{promisify as Wn}from"util";var Vn=Wn(Gn);async function mr(e){if(!Le(e))throw new Error("loadout id must be <owner>/<slug>");let t=process.cwd();if(!await P(t))throw new Error("Repository is not enabled");let r=await v(R(t)),n=Array.isArray(r?.activeLoadouts)?r.activeLoadouts.filter(Boolean):[];n.includes(e)||n.push(e),await w(R(t),{activeLoadouts:n}),process.stdout.write(`activated loadout: ${e}
262
+ `)}async function pr(){let e=process.cwd();if(!await P(e))throw new Error("Repository is not enabled");await w(R(e),{activeLoadouts:[]}),process.stdout.write(`cleared active loadouts
263
263
  `)}async function fr(e){let t=F(e,"loadout id");if(!Le(t))throw new Error("loadout id must be <owner>/<slug>");let{owner:r,slug:n}=ke(t),o=process.cwd(),i=ue.join(o,"loadout.yaml");if(await X.access(i),!(await X.stat(i)).isFile())throw new Error("loadout.yaml not found in current directory");let a=await j(),c=H(a.provider??"gh"),g="skillcraft-gg/loadouts",l=ue.join(process.cwd(),".skillcraft-temp-loadout-share"),d=`skillcraft-loadout-${r}-${n}`;try{await X.rm(l,{force:!0,recursive:!0}),await c.cloneRepo(g,l),await Se(l,["checkout","-B",d]);let u=ue.join(l,"loadouts",r,n);await X.rm(u,{force:!0,recursive:!0}).catch(()=>{}),await X.mkdir(ue.dirname(u),{recursive:!0}),await X.copyFile(i,ue.join(u,"loadout.yaml")),await Se(l,["add",u]),await Se(l,["commit","-m",`Loadout: publish ${t}`]).catch(async()=>{throw new Error("nothing to commit; loadout may already be published")}),await Se(l,["push","-u","origin",d]).catch(()=>{throw new Error("unable to push loadout publish branch")}),await c.createPullRequest(g,d,`Loadout publish: ${t}`).catch(()=>{process.stdout.write(`unable to create PR automatically. Please open one manually from your branch.
264
264
  `)}),process.stdout.write(`loadout publish workflow completed for ${t}
265
- `)}finally{await X.rm(l,{force:!0,recursive:!0})}}async function Se(e,t){let{stdout:r}=await Vn("git",t,{cwd:e});return r.trim()}async function gr(e){if(!await P(e))return;let t=await te(e),r=new Date().toISOString(),n=await $t(e,t,r);if(!n)return;let o=await Et(e,n.proofId);await rt(e,o);let i=await te(e);i!==t&&await Fe(e,{...n.proof,commit:i}),await w(L(e),{skills:[]})}async function hr(e,t="origin"){await Ct(e,t)}var R=new Zn;R.name("skillcraft").description("Skillcraft CLI").version(Ze.version);R.option("--json","machine-readable JSON output");R.command("enable").description("Enable Skillcraft in the current repository").action(h(jt));R.command("disable").description("Disable Skillcraft in the current repository").action(h(ht));R.command("status").description("Show repository Skillcraft status").action(h(At));R.command("doctor").description("Check environment and integration readiness").action(h(Lt));var wr=R.command("repos").description("Manage tracked repositories");wr.command("list").description("List tracked repositories").action(h(qt));wr.command("prune").description("Remove unavailable repository entries").action(h(Nt));var Ge=R.command("progress").description("Show progress for tracked credentials");Ge.option("--refresh","refresh the local credential index cache before evaluating progress").action((e,t)=>{let r=t.parent?.opts()?.json?"json":"text";h(()=>Ut({outputMode:r,refreshIndex:e.refresh}))()});Ge.command("track <credential-id>").description("Track a credential for local progress evaluation").action(e=>h(()=>Gt(e))());Ge.command("untrack <credential-id>").description("Untrack a credential from local progress evaluation").action(e=>h(()=>Wt(e))());var ce=R.command("skills").description("Manage local skill publishing");ce.command("add <id>").description("Add a local or external skill from the registry index").action(e=>h(()=>nr(e))());ce.command("publish <owner-slug>").description("Publish a skill to the registry").action(e=>h(()=>rr(e))());ce.command("validate").description("Validate local skill layout").action(h(cr));ce.command("list").description("List detected skills in the current repository").action(h(or));ce.command("inspect <id>").description("Show detailed information for a registry skill").action((e,t,r)=>{let n=r.parent?.parent?.opts()?.json?"json":"text";h(()=>sr(e,{outputMode:n}))()});ce.command("search [query]").description("Search the published skill index").option("--source <source>","filter to a registry source").option("--limit <n>","limit number of results",e=>Number.parseInt(e,10)).action((e,t,r)=>{let n=r.parent?.parent?.opts()?.json?"json":"text";h(()=>ir(e,{source:t.source,limit:t.limit,outputMode:n}))()});R.command("verify").description("Verify local Skillcraft proofs and trailers").action(h(dr));var We=R.command("claim").description("Claim a credential or inspect claim issues");We.argument("[credential]","credential identifier").option("--all-repos","include tracked repositories").option("--repo <path...>","explicit repositories to include").action((e,t)=>{if(!e){h(()=>Ue())();return}h(()=>ur(e,{allRepos:t.allRepos,repo:t.repo}))()});We.command("list").description("List claims in the credentials repository").action(h(Ue));We.command("status <issue>").description("Show claim issue status").action(e=>h(()=>lr(e))());var Ve=R.command("loadout").description("Manage active loadouts");Ve.command("use <id>").description("Activate a loadout in local context").action(e=>h(()=>mr(e))());Ve.command("clear").description("Clear active loadouts").action(h(pr));Ve.command("share <id>").description("Publish local loadout to registry").action(e=>h(()=>fr(e))());R.command("_hook <name> [repoPath] [remote]",{hidden:!0}).description("internal hook command").action((e,t,r)=>h(async()=>{e==="post-commit"&&await gr(t||process.cwd()),(e==="pre-push"||e==="post-push")&&await hr(t||process.cwd(),r||"origin")})());function h(e){return(...t)=>{Promise.resolve(e(...t)).catch(r=>{process.stderr.write(`${r instanceof Error?r.message:String(r)}
266
- `),process.exitCode=1})}}R.parse(process.argv);
265
+ `)}finally{await X.rm(l,{force:!0,recursive:!0})}}async function Se(e,t){let{stdout:r}=await Vn("git",t,{cwd:e});return r.trim()}async function gr(e){if(!await P(e))return;let t=await te(e),r=new Date().toISOString(),n=await $t(e,t,r);if(!n)return;let o=await Et(e,n.proofId);await rt(e,o);let i=await te(e);i!==t&&await Fe(e,{...n.proof,commit:i}),await w(L(e),{skills:[]})}async function hr(e,t="origin"){await Ct(e,t)}var b=new Zn;b.name("skillcraft").description("Skillcraft CLI").version(Ze.version);b.option("--json","machine-readable JSON output");b.command("enable").description("Enable Skillcraft in the current repository").action(h(jt));b.command("disable").description("Disable Skillcraft in the current repository").action(h(ht));b.command("status").description("Show repository Skillcraft status").action(h(At));b.command("doctor").description("Check environment and integration readiness").action(h(Lt));var wr=b.command("repos").description("Manage tracked repositories");wr.command("list").description("List tracked repositories").action(h(qt));wr.command("prune").description("Remove unavailable repository entries").action(h(Nt));var Ge=b.command("progress").description("Show progress for tracked credentials");Ge.option("--refresh","refresh the local credential index cache before evaluating progress").action((e,t)=>{let r=t.parent?.opts()?.json?"json":"text";h(()=>Ut({outputMode:r,refreshIndex:e.refresh}))()});Ge.command("track <credential-id>").description("Track a credential for local progress evaluation").action(e=>h(()=>Gt(e))());Ge.command("untrack <credential-id>").description("Untrack a credential from local progress evaluation").action(e=>h(()=>Wt(e))());var ce=b.command("skills").description("Manage local skill publishing");ce.command("add <id>").description("Add a local or external skill from the registry index").action(e=>h(()=>nr(e))());ce.command("publish <owner-slug>").description("Publish a skill to the registry").action(e=>h(()=>rr(e))());ce.command("validate").description("Validate local skill layout").action(h(cr));ce.command("list").description("List detected skills in the current repository").action(h(or));ce.command("inspect <id>").description("Show detailed information for a registry skill").action((e,t,r)=>{let n=r.parent?.parent?.opts()?.json?"json":"text";h(()=>sr(e,{outputMode:n}))()});ce.command("search [query]").description("Search the published skill index").option("--source <source>","filter to a registry source").option("--limit <n>","limit number of results",e=>Number.parseInt(e,10)).action((e,t,r)=>{let n=r.parent?.parent?.opts()?.json?"json":"text";h(()=>ir(e,{source:t.source,limit:t.limit,outputMode:n}))()});b.command("verify").description("Verify local Skillcraft proofs and trailers").action(h(dr));var We=b.command("claim").description("Claim a credential or inspect claim issues");We.argument("[credential]","credential identifier").option("--all-repos","include tracked repositories").option("--repo <path...>","explicit repositories to include").action((e,t)=>{if(!e){h(()=>Ue())();return}h(()=>ur(e,{allRepos:t.allRepos,repo:t.repo}))()});We.command("list").description("List claims in the credentials repository").action(h(Ue));We.command("status <issue>").description("Show claim issue status").action(e=>h(()=>lr(e))());var Ve=b.command("loadout").description("Manage active loadouts");Ve.command("use <id>").description("Activate a loadout in local context").action(e=>h(()=>mr(e))());Ve.command("clear").description("Clear active loadouts").action(h(pr));Ve.command("share <id>").description("Publish local loadout to registry").action(e=>h(()=>fr(e))());b.command("_hook <name> [repoPath] [remote]",{hidden:!0}).description("internal hook command").action((e,t,r)=>h(async()=>{e==="post-commit"&&await gr(t||process.cwd()),(e==="pre-push"||e==="post-push")&&await hr(t||process.cwd(),r||"origin")})());function h(e){return(...t)=>{Promise.resolve(e(...t)).catch(r=>{process.stderr.write(`${r instanceof Error?r.message:String(r)}
266
+ `),process.exitCode=1})}}b.parse(process.argv);
267
267
  //# sourceMappingURL=index.js.map