thinkpool-pair 0.7.395 → 0.7.397

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/hermes-setup.mjs CHANGED
@@ -1 +1 @@
1
- import e from"node:fs";import o from"node:os";import t from"node:path";import{execFileSync as r}from"node:child_process";import i from"yaml";import{probeHermesRuntime as n}from"./hermes-probe.mjs";export const HERMES_PROFILE="thinkpool";export const HERMES_PROVIDER="nous";export const HERMES_DEFAULT_MODEL="openai/gpt-5.6-luna";export const HERMES_GUARD_FILENAME="hermes-delegation-guard.mjs";const s=e=>String(e||"").replace(/[\r\n]+/g," ").trim(),l=e=>`node ${JSON.stringify(e)}`,a=e=>null!=e&&"object"==typeof e&&!Array.isArray(e);export function hermesGuardPath({homeDir:e=o.homedir(),env:r=process.env,platform:i=process.platform}={}){const n="win32"===i?r.LOCALAPPDATA||t.join(e,"AppData","Local"):r.XDG_DATA_HOME||t.join(e,".local","share");return t.join(n,"thinkpool-pair",HERMES_GUARD_FILENAME)}function m(o,r,{fsImpl:i=e,mode:n=384}={}){i.mkdirSync(t.dirname(o),{recursive:!0});const s=`${o}.tmp-${process.pid}-${Date.now()}`;try{i.writeFileSync(s,r,{mode:n}),i.chmodSync?.(s,n),i.renameSync(s,o)}finally{try{i.rmSync(s,{force:!0})}catch{}}}function c(e,o){return o.existsSync(e)?{content:o.readFileSync(e),mode:511&o.statSync(e).mode,atimeMs:o.statSync(e).atimeMs,mtimeMs:o.statSync(e).mtimeMs}:null}function p(e,o,t){o?(m(e,o.content,{fsImpl:t,mode:o.mode}),t.utimesSync?.(e,o.atimeMs/1e3,o.mtimeMs/1e3)):t.rmSync(e,{force:!0})}function h(e,o){const t=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`Alias:\\s+${t}\\s+.*hermes\\s+-p\\s+${t}`,"i").test(String(e||""))}export function setupHermesRuntime({mode:d,profile:f="thinkpool",command:u="hermes",env:g=process.env,homeDir:E=o.homedir(),platform:w=process.platform,execFile:k=r,fsImpl:_=e,guardSource:y=e.readFileSync(new URL("./hermes-delegation-guard.mjs",import.meta.url),"utf8")}={}){if("thinkpool"!==f)throw new Error("thinkpool only manages the isolated Hermes profile thinkpool");if(null!=d&&"clone"!==d&&"clean"!==d)throw new Error("Hermes setup mode must be clone or clean");const S=(e,o={})=>k(u,e,{encoding:"utf8",env:o.env||g,timeout:o.timeout||2e4,stdio:["ignore","pipe","pipe"]}),v=["-p",f];let A="",H=!1;try{A=S(["profile","show",f])}catch{}if(!/Profile:\s*thinkpool/i.test(A)){if(!d)throw new Error("No isolated Hermes thinkpool profile exists; choose --clone or --clean");const e=["profile","create",f,"--description","Isolated thinkpool Code runtime."];"clone"===d?e.push("--clone"):e.push("--no-skills"),S(e,{timeout:6e4}),H=!0,A=S(["profile","show",f])}if(!h(A,f)&&(S(["profile","alias",f,"--name",f]),A=S(["profile","show",f]),!h(A,f)))throw new Error("Hermes did not create the required thinkpool profile alias");const M=s(S([...v,"config","path"]));if(!M)throw new Error("Hermes did not report the thinkpool profile config path");const R=M.startsWith("~")?t.join(E,M.slice(1).replace(/^[/\\]/,"")):t.resolve(M),D=String(A).match(/^Path:\s*(.+)$/im);if(!D)throw new Error("Hermes did not report the isolated thinkpool profile path");const x=D[1].trim().startsWith("~")?t.join(E,D[1].trim().slice(1).replace(/^[/\\]/,"")):t.resolve(D[1].trim()),$=t.relative(x,R);if($.startsWith("..")||t.isAbsolute($))throw new Error("Hermes reported a config path outside the isolated thinkpool profile");let b={};if(_.existsSync(R)){const e=i.parse(_.readFileSync(R,"utf8"));if(null!=e&&!a(e))throw new Error("Hermes thinkpool config is not a YAML mapping; refusing to overwrite it");b=e||{}}if(null!=b.hooks&&!a(b.hooks))throw new Error("Hermes thinkpool hooks config is not a mapping; refusing to overwrite it");if(null!=b.model&&!a(b.model))throw new Error("Hermes thinkpool model config is not a mapping; refusing to overwrite it");const L=b.model||={};L.provider="nous",L.default=HERMES_DEFAULT_MODEL,delete L.base_url,delete L.api_mode;const F=b.hooks||={};if(null!=F.pre_tool_call&&!Array.isArray(F.pre_tool_call))throw new Error("Hermes pre_tool_call hooks are not a list; refusing to overwrite them");const P=F.pre_tool_call||[];F.pre_tool_call=[...P.filter(e=>!(e=>a(e)&&"^delegate_task$"===e.matcher&&new RegExp(`${HERMES_GUARD_FILENAME.replaceAll(".","\\.")}$`).test(String(e.command||"").replace(/["']/g,"")))(e)),{matcher:"^delegate_task$",command:l(hermesGuardPath({homeDir:E,env:g,platform:w})),timeout:5}];const j=hermesGuardPath({homeDir:E,env:g,platform:w}),I=t.join(x,"shell-hooks-allowlist.json"),O=c(j,_),G=c(R,_),U=c(I,_);try{m(j,y,{fsImpl:_,mode:448}),m(R,i.stringify(b,{lineWidth:0}),{fsImpl:_,mode:384});const e={...g,HERMES_ACCEPT_HOOKS:"1"};S([...v,"hooks","revoke",l(j)],{env:e});const o=S([...v,"hooks","test","pre_tool_call","--for-tool","delegate_task"],{env:e});if(!/(?:action|decision)["']?\s*[:=]\s*["']block/i.test(o)||!/thinkpool blocks hidden Hermes delegation/i.test(o))throw new Error("Hermes ran the thinkpool delegation guard but did not report an explicit block");S([...v,"hooks","doctor"],{env:e}),S([...v,"acp","--check"],{env:e});const t=n({command:u,prefixArgs:v,execFile:k,env:e});if(!t.available)throw new Error(`Hermes setup did not pass the final runtime probe: ${t.reason||"unavailable"}`);return{...t,profile:f,created:H,mode:H?d:"existing",guardPath:j,configPath:R}}catch(e){try{p(R,G,_),p(j,O,_),p(I,U,_)}catch(o){e.message=`${e.message}; rollback also failed: ${s(o.message)}`}throw e}}
1
+ import e from"node:fs";import o from"node:os";import t from"node:path";import{execFileSync as r}from"node:child_process";import i from"yaml";import{probeHermesRuntime as n}from"./hermes-probe.mjs";export const HERMES_PROFILE="thinkpool";export const HERMES_PROVIDER="nous";export const HERMES_DEFAULT_MODEL="openai/gpt-5.6-luna";export const HERMES_GUARD_FILENAME="hermes-delegation-guard.mjs";export const HERMES_CATASTROPHIC_FILENAME="catastrophic-command-guard.mjs";const s=e=>String(e||"").replace(/[\r\n]+/g," ").trim(),l=e=>`node ${JSON.stringify(e)}`,a=e=>null!=e&&"object"==typeof e&&!Array.isArray(e);export function hermesGuardPath({homeDir:e=o.homedir(),env:r=process.env,platform:i=process.platform}={}){const n="win32"===i?r.LOCALAPPDATA||t.join(e,"AppData","Local"):r.XDG_DATA_HOME||t.join(e,".local","share");return t.join(n,"thinkpool-pair",HERMES_GUARD_FILENAME)}export function hermesCatastrophicGuardPath(e={}){return t.join(t.dirname(hermesGuardPath(e)),HERMES_CATASTROPHIC_FILENAME)}function m(o,r,{fsImpl:i=e,mode:n=384}={}){i.mkdirSync(t.dirname(o),{recursive:!0});const s=`${o}.tmp-${process.pid}-${Date.now()}`;try{i.writeFileSync(s,r,{mode:n}),i.chmodSync?.(s,n),i.renameSync(s,o)}finally{try{i.rmSync(s,{force:!0})}catch{}}}function c(e,o){return o.existsSync(e)?{content:o.readFileSync(e),mode:511&o.statSync(e).mode,atimeMs:o.statSync(e).atimeMs,mtimeMs:o.statSync(e).mtimeMs}:null}function p(e,o,t){o?(m(e,o.content,{fsImpl:t,mode:o.mode}),t.utimesSync?.(e,o.atimeMs/1e3,o.mtimeMs/1e3)):t.rmSync(e,{force:!0})}function h(e,o){const t=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`Alias:\\s+${t}\\s+.*hermes\\s+-p\\s+${t}`,"i").test(String(e||""))}export function setupHermesRuntime({mode:d,profile:f="thinkpool",command:u="hermes",env:E=process.env,homeDir:g=o.homedir(),platform:w=process.platform,execFile:k=r,fsImpl:_=e,guardSource:S=e.readFileSync(new URL("./hermes-delegation-guard.mjs",import.meta.url),"utf8"),catastrophicSource:y=e.readFileSync(new URL("./catastrophic-command-guard.mjs",import.meta.url),"utf8")}={}){if("thinkpool"!==f)throw new Error("thinkpool only manages the isolated Hermes profile thinkpool");if(null!=d&&"clone"!==d&&"clean"!==d)throw new Error("Hermes setup mode must be clone or clean");const A=(e,o={})=>k(u,e,{encoding:"utf8",env:o.env||E,timeout:o.timeout||2e4,stdio:["ignore","pipe","pipe"]}),H=["-p",f];let v="",M=!1;try{v=A(["profile","show",f])}catch{}if(!/Profile:\s*thinkpool/i.test(v)){if(!d)throw new Error("No isolated Hermes thinkpool profile exists; choose --clone or --clean");const e=["profile","create",f,"--description","Isolated thinkpool Code runtime."];"clone"===d?e.push("--clone"):e.push("--no-skills"),A(e,{timeout:6e4}),M=!0,v=A(["profile","show",f])}if(!h(v,f)&&(A(["profile","alias",f,"--name",f]),v=A(["profile","show",f]),!h(v,f)))throw new Error("Hermes did not create the required thinkpool profile alias");const R=s(A([...H,"config","path"]));if(!R)throw new Error("Hermes did not report the thinkpool profile config path");const x=R.startsWith("~")?t.join(g,R.slice(1).replace(/^[/\\]/,"")):t.resolve(R),D=String(v).match(/^Path:\s*(.+)$/im);if(!D)throw new Error("Hermes did not report the isolated thinkpool profile path");const I=D[1].trim().startsWith("~")?t.join(g,D[1].trim().slice(1).replace(/^[/\\]/,"")):t.resolve(D[1].trim()),P=t.relative(I,x);if(P.startsWith("..")||t.isAbsolute(P))throw new Error("Hermes reported a config path outside the isolated thinkpool profile");let $={};if(_.existsSync(x)){const e=i.parse(_.readFileSync(x,"utf8"));if(null!=e&&!a(e))throw new Error("Hermes thinkpool config is not a YAML mapping; refusing to overwrite it");$=e||{}}if(null!=$.hooks&&!a($.hooks))throw new Error("Hermes thinkpool hooks config is not a mapping; refusing to overwrite it");if(null!=$.model&&!a($.model))throw new Error("Hermes thinkpool model config is not a mapping; refusing to overwrite it");const L=$.model||={};L.provider="nous",L.default=HERMES_DEFAULT_MODEL,delete L.base_url,delete L.api_mode;const F=$.hooks||={};if(null!=F.pre_tool_call&&!Array.isArray(F.pre_tool_call))throw new Error("Hermes pre_tool_call hooks are not a list; refusing to overwrite them");const j=F.pre_tool_call||[];F.pre_tool_call=[...j.filter(e=>!(e=>a(e)&&["^delegate_task$","^(delegate_task|terminal)$"].includes(e.matcher)&&new RegExp(`${HERMES_GUARD_FILENAME.replaceAll(".","\\.")}$`).test(String(e.command||"").replace(/["']/g,"")))(e)),{matcher:"^(delegate_task|terminal)$",command:l(hermesGuardPath({homeDir:g,env:E,platform:w})),timeout:5}];const b=hermesGuardPath({homeDir:g,env:E,platform:w}),O=hermesCatastrophicGuardPath({homeDir:g,env:E,platform:w}),C=t.join(I,"shell-hooks-allowlist.json"),G=c(b,_),T=c(O,_),N=c(x,_),U=c(C,_);try{m(b,S,{fsImpl:_,mode:448}),m(O,y,{fsImpl:_,mode:384}),m(x,i.stringify($,{lineWidth:0}),{fsImpl:_,mode:384});const e={...E,HERMES_ACCEPT_HOOKS:"1"};A([...H,"hooks","revoke",l(b)],{env:e});const o=A([...H,"hooks","test","pre_tool_call","--for-tool","delegate_task"],{env:e});if(!/(?:action|decision)["']?\s*[:=]\s*["']block/i.test(o)||!/thinkpool blocks hidden Hermes delegation/i.test(o))throw new Error("Hermes ran the thinkpool delegation guard but did not report an explicit block");A([...H,"hooks","doctor"],{env:e}),A([...H,"acp","--check"],{env:e});const t=n({command:u,prefixArgs:H,execFile:k,env:e,fsImpl:_});if(!t.available)throw new Error(`Hermes setup did not pass the final runtime probe: ${t.reason||"unavailable"}`);return{...t,profile:f,created:M,mode:M?d:"existing",guardPath:b,configPath:x}}catch(e){try{p(x,N,_),p(b,G,_),p(O,T,_),p(C,U,_)}catch(o){e.message=`${e.message}; rollback also failed: ${s(o.message)}`}throw e}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thinkpool-pair",
3
- "version": "0.7.395",
3
+ "version": "0.7.397",
4
4
  "description": "Connect Claude Code, Codex, or Hermes on your computer to a thinkpool Code room.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",
@@ -51,7 +51,10 @@
51
51
  "hermes-setup.mjs",
52
52
  "hermes-isolation.mjs",
53
53
  "hermes-delegation-guard.mjs",
54
+ "catastrophic-command-guard.mjs",
55
+ "codex-catastrophic-command-hook.mjs",
54
56
  "runtime-registry.mjs",
57
+ "runtime-skill-parity.mjs",
55
58
  "reasoning-effort.mjs",
56
59
  "runtime-contract.mjs",
57
60
  "command-catalog.mjs",
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "format": 1,
3
3
  "package": "thinkpool-pair",
4
- "version": "0.7.395",
4
+ "version": "0.7.397",
5
5
  "kind": "minified",
6
- "minifiedModules": 119,
7
- "sourceModuleBytes": 1754163,
8
- "artifactModuleBytes": 791157,
6
+ "minifiedModules": 122,
7
+ "sourceModuleBytes": 1773421,
8
+ "artifactModuleBytes": 803356,
9
9
  "files": {
10
- "package.json": "c560f2952b7d2a201bfc0787cc8fd022bbcf025eecdfcb52348c73792629fab0",
10
+ "package.json": "134235b6d093ddec034c76f46adf682a3e975058faf672379bdafeb688155d78",
11
11
  "LICENSE": "8a030197ca1cad9669909ca14c9ad15cf48d9fe551da526ccaf1fca993eddb23",
12
- "bridge.mjs": "0c4e67cb580ebaf37e39828f372b57cad5f1b70750ef6c5ec8cf49db965c1bdb",
12
+ "bridge.mjs": "f888decc6642fa4a89f3e0e4e48445986e2d284fb1243fe30bab6048660af88d",
13
13
  "bridge-service.sh": "b64f27c473ca8f3a49190fd08c23947ab14ca9958d70b6fa53c7bddc2be91403",
14
14
  "command-guidance.mjs": "b9b967b59ff4e77c9613abb0f28858bf3ac5b106a509e471039777b53bec3e29",
15
15
  "abort-turn-barrier.mjs": "3734a5b7e2e940ec6d7fa8b5b04935e1429a23d1bd9e92b2ac2a2ecd9f77c75e",
@@ -24,15 +24,15 @@
24
24
  "byok-detect.mjs": "f31f2ca426737581a97c391b3cecfc75f0207cfa31f51c6bf4a9148309c9625d",
25
25
  "context-contract.mjs": "ffebb435dc5d75c289329bf16ab909df9d634a2b508154c250c6b25906a02a91",
26
26
  "context-windows.mjs": "80af664f84d7e95ef2b0a2a3131090ac4ccd522709448ac9a0d96c378bbec0f7",
27
- "claude-session.mjs": "153e940c2234ddac15a499cadf401bd859e85464a52075dd2195009b098df355",
27
+ "claude-session.mjs": "8992a67c66cb5745f7a72c373ea2bf06f3dcc77a68a3735f21dcbe8968623edc",
28
28
  "terminal-name.mjs": "f39bb8d1e148ab9a74cbb96438d31e524d6597b8035f00d7a906c28c306c0cf8",
29
29
  "claude-command-catalog.mjs": "36bd4342b2ae94b43a0072533ef2d1648c7473003964bbad433fdb1a8b2bfec1",
30
- "codex-session.mjs": "e6825e8c95ce9da0520140579d0717b08116d3847707d8005370166748fcdeae",
30
+ "codex-session.mjs": "e33bbf0bbe7c70db9eca1b3cf80a65d74bbdf86ba6884844b309ebb522866bab",
31
31
  "question-response.mjs": "35a7ba53d3eb117717c18004d2a8441f8f37665b231a3c44f4bd9321ff59dd57",
32
32
  "thinkpool-room-prompt.mjs": "055598556558fb17e100d85ea7041d910332cf06ca978d1e648a55ad4377331b",
33
33
  "thinkpool-prompt-contracts.mjs": "051602d7d2fe9b34df92957bd3922c5eeebedbcc60c892adf415243887d8c62f",
34
34
  "thinkpool-capabilities.json": "9884346a9c9d81acb4ecb923e7264dc13b114cc15d9bc509b7c3885066ac33f1",
35
- "codex-app-server.mjs": "06778825aa3c51595d57cce733235cb07874986351b6fea7adac70ca33f32b11",
35
+ "codex-app-server.mjs": "d50e30ba6cb2a383c90d89186bc7a13f4caf900c977dd501572468986009470e",
36
36
  "codex-images.mjs": "31605d6d8b3dd6b73395da63d1b0c513445c95ffa2f4306ee466f201d633ffc0",
37
37
  "codex-mcp-http.mjs": "7472543648a9bb575ce20dc3e3270c2da84174c6ea6e9faf87dfaafb95b6212a",
38
38
  "lane-worktree.mjs": "37583757ab82843412ba565dfba3d7cab517e94782eb33115decd5438d092d8f",
@@ -42,16 +42,19 @@
42
42
  "cumulative-event-relay.mjs": "cf6e6533e33b3c5bb0b462d15ccc86106f2b56f8b1e66fc1f4867dd8f44d7ae6",
43
43
  "codex-commands.mjs": "cae3f617ac42e1316d8980ef97e4255227fe5df5e8e9b556630a3bfb83bb7c2b",
44
44
  "acp-client.mjs": "9e7919ff79825883820019ff7a0ca578f120853ed61c7caab21a8ffc3a67ffc9",
45
- "hermes-session.mjs": "19845e0ef7a6d336ff1f355fc186f9b4f499d6453d9a45895580dbc0976dac76",
45
+ "hermes-session.mjs": "b3d521ea59297edb58ecfcc0daad3c0df88d96131cadc455fa36fc1cca954210",
46
46
  "hermes-model-cache.mjs": "aee23efdebe1aa5e10053f291a9153981fe9b45065c293c9519ca73477251e72",
47
47
  "hermes-policy.mjs": "df6dd384ab130b3626045816b6ac4c1d2aecde37fb7b7a4be0c1bffc375fd8ff",
48
- "hermes-acp-bootstrap.py": "7ed3ba3499db9fc9eb5bc2409c46fdb936e76d1857969d297cc42605bab38da4",
48
+ "hermes-acp-bootstrap.py": "9453b48d1ec0057a1d1754fc828acb949ad3f69c687fd055dc3856823d26c19b",
49
49
  "hermes-event-mapper.mjs": "7c714e15d06d970c4d602e755461bacf8f4d4136a8afc03406e8b3207ff84cdc",
50
- "hermes-probe.mjs": "b128dfaf3c7302d3d5372a16c0148a6de591768a9b7d1c306f0ae1d0a42198f7",
51
- "hermes-setup.mjs": "1e903d0b9d3711669c06ff323323361920fe8827a7605311f74171f47eb6d602",
50
+ "hermes-probe.mjs": "3fc419707f0df9342bc3a5fbfbba2ec2ba1511309dfb1ad8cc79f6f8da4e6b3d",
51
+ "hermes-setup.mjs": "50840b3e0101dc94aa2cd6dd2456efd8377e30bd5d797a00d360fae28e13dddb",
52
52
  "hermes-isolation.mjs": "50e960ce815c520805245cc75719c9c53e2c5af51b7304c8ecef8a4946e23c6d",
53
- "hermes-delegation-guard.mjs": "c2a6311320d2ff26137c4394c27561e5c8bee7a712bbb1188307bd55bfecc38e",
53
+ "hermes-delegation-guard.mjs": "f737d05fb93591848fa3839fd5df2c019779bda828d42ab785cd57213665f922",
54
+ "catastrophic-command-guard.mjs": "65158e59266e4be1e2a72479fb9b2c7e7a4ec7902a8b764d3b26017cd0cdbfd5",
55
+ "codex-catastrophic-command-hook.mjs": "5bf1eb5dd837b77044846af0cb8936a81edbc435e454217ddb15981f3626f7dc",
54
56
  "runtime-registry.mjs": "d0a3d93edb60443df56273025ed3f10ed4b1d06a16b84759267782691cacdda8",
57
+ "runtime-skill-parity.mjs": "933535bc7b70d7843cf7bf8eb83f306693045ccf7154ad781b6d42be75442f1c",
55
58
  "reasoning-effort.mjs": "3a514997656bbcd41ff1aefe9d5e59c5920a90e6bfcc928016d95987db2ceaa3",
56
59
  "runtime-contract.mjs": "eb24b177002ba33353ec0335f4f830fb57fe313552b1a8d7aef8163cc743f6c1",
57
60
  "command-catalog.mjs": "ecad63189f8803eba99e1b797afa57b355ca1b55d09e1cf212cc74dd952baa65",
@@ -0,0 +1 @@
1
+ import e from"node:fs";import t from"node:path";export const THINKPOOL_PROJECT_SKILLS_ENV="THINKPOOL_PROJECT_SKILLS_DIR";export const PROJECT_SKILL_RUNTIMES=Object.freeze(["claude","codex","hermes"]);export function resolveProjectSkillsDir(n,{fsImpl:r=e}={}){let c=t.resolve(n||process.cwd());for(;;){const e=t.join(c,".claude","skills");try{if(r.statSync(e).isDirectory())return e}catch{}const n=t.dirname(c);if(n===c)return null;c=n}}export function hermesProjectSkillEnv(e,t={}){const n=resolveProjectSkillsDir(e,t);return n?{[THINKPOOL_PROJECT_SKILLS_ENV]:n}:{}}const n=(e,t)=>{const n=String(e).match(/^---\s*\n([\s\S]*?)\n---(?:\s*\n|$)/)?.[1]||"";return n.match(new RegExp(`^${t}:\\s*(.+)$`,"m"))?.[1]?.trim().replace(/^['"]|['"]$/g,"")||""};export function canonicalProjectSkills(r,{fsImpl:c=e}={}){const i=t.join(t.resolve(r),".claude","skills");let l=[];try{l=c.readdirSync(i).sort()}catch{return[]}return l.flatMap(e=>{const l=t.join(i,e,"SKILL.md");try{if(!c.statSync(l).isFile())return[];const i=c.readFileSync(l,"utf8");return[{name:n(i,"name")||e,directory:e,description:n(i,"description"),canonicalFile:t.relative(r,l),bytes:Buffer.byteLength(i)}]}catch{return[]}})}export function runtimeSkillManifest(n,{fsImpl:r=e,checkedAt:c=(new Date).toISOString()}={}){const i=t.resolve(n),l=canonicalProjectSkills(i,{fsImpl:r}).map(e=>{const n=t.join(i,e.canonicalFile),c=t.join(i,".agents","skills",e.directory,"SKILL.md");let l="";try{l=r.readFileSync(n,"utf8")}catch{}const s=[...l.matchAll(/`(\.claude\/skills\/[^`\s]+)`/g)].map(e=>e[1].replace(/[),.;:]+$/,"")).filter(e=>!/[<>{}*]/.test(e)),o=[...new Set(s.filter(e=>{try{return!r.existsSync(t.join(i,e))}catch{return!0}}))];let a=!1;try{a=r.realpathSync(c)===r.realpathSync(n)}catch{}return{...e,dependencies:{status:o.length?"missing":"project-paths-checked",missing:o},runtimes:{claude:{discoverable:!0,body:"canonical",path:e.canonicalFile},codex:{discoverable:a,body:a?"canonical-symlink":"missing",path:t.relative(i,c)},hermes:{discoverable:!0,body:"canonical-external-dir",path:e.canonicalFile,tools:["skills_list","skill_view"]}}}});return{schemaVersion:1,checkedAt:c,canonicalDirectory:".claude/skills",runtimes:PROJECT_SKILL_RUNTIMES,skills:l}}