@visulima/vis 1.0.0-alpha.45 → 1.0.0-alpha.46

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.
Files changed (113) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/binx.js +1 -1
  4. package/dist/packem_chunks/CONFIG_FILES.js +3 -3
  5. package/dist/packem_chunks/agent-instructions.js +11 -0
  6. package/dist/packem_chunks/bloom-status.js +1 -1
  7. package/dist/packem_chunks/bloom-sync.js +1 -1
  8. package/dist/packem_chunks/catalog.js +1 -1
  9. package/dist/packem_chunks/cli-exec.js +1 -1
  10. package/dist/packem_chunks/cli-main.js +23 -23
  11. package/dist/packem_chunks/defineReleasePlugin.js +3 -0
  12. package/dist/packem_chunks/fix.js +1 -1
  13. package/dist/packem_chunks/group-tags.js +1 -0
  14. package/dist/packem_chunks/handler10.js +1 -1
  15. package/dist/packem_chunks/handler12.js +1 -1
  16. package/dist/packem_chunks/handler13.js +1 -1
  17. package/dist/packem_chunks/handler14.js +1 -1
  18. package/dist/packem_chunks/handler15.js +1 -1
  19. package/dist/packem_chunks/handler19.js +1 -1
  20. package/dist/packem_chunks/handler20.js +1 -1
  21. package/dist/packem_chunks/handler21.js +1 -1
  22. package/dist/packem_chunks/handler24.js +1 -1
  23. package/dist/packem_chunks/handler26.js +1 -1
  24. package/dist/packem_chunks/handler28.js +1 -1
  25. package/dist/packem_chunks/handler32.js +1 -1
  26. package/dist/packem_chunks/handler4.js +1 -1
  27. package/dist/packem_chunks/handler40.js +19 -19
  28. package/dist/packem_chunks/handler5.js +1 -1
  29. package/dist/packem_chunks/handler50.js +1 -1
  30. package/dist/packem_chunks/handler51.js +1 -1
  31. package/dist/packem_chunks/handler54.js +1 -1
  32. package/dist/packem_chunks/handler57.js +11 -5
  33. package/dist/packem_chunks/handler58.js +5 -11
  34. package/dist/packem_chunks/handler59.js +11 -3
  35. package/dist/packem_chunks/handler6.js +1 -1
  36. package/dist/packem_chunks/handler60.js +3 -22
  37. package/dist/packem_chunks/handler61.js +21 -60
  38. package/dist/packem_chunks/handler62.js +61 -3
  39. package/dist/packem_chunks/handler63.js +3 -6
  40. package/dist/packem_chunks/handler64.js +6 -9
  41. package/dist/packem_chunks/handler65.js +9 -2
  42. package/dist/packem_chunks/handler66.js +2 -24
  43. package/dist/packem_chunks/handler67.js +24 -25
  44. package/dist/packem_chunks/handler68.js +25 -153
  45. package/dist/packem_chunks/handler69.js +153 -10
  46. package/dist/packem_chunks/handler7.js +1 -1
  47. package/dist/packem_chunks/handler70.js +10 -23
  48. package/dist/packem_chunks/handler71.js +23 -322
  49. package/dist/packem_chunks/handler72.js +273 -659
  50. package/dist/packem_chunks/handler73.js +708 -48
  51. package/dist/packem_chunks/handler74.js +48 -27
  52. package/dist/packem_chunks/handler75.js +27 -3
  53. package/dist/packem_chunks/handler76.js +3 -190
  54. package/dist/packem_chunks/handler77.js +189 -37
  55. package/dist/packem_chunks/handler78.js +38 -0
  56. package/dist/packem_chunks/heal.js +1 -1
  57. package/dist/packem_chunks/help-command.js +1 -1
  58. package/dist/packem_chunks/index3.js +1 -1
  59. package/dist/packem_chunks/keys-refresh.js +1 -1
  60. package/dist/packem_chunks/list.js +1 -1
  61. package/dist/packem_chunks/orchestrator.js +26 -23
  62. package/dist/packem_chunks/prune.js +1 -1
  63. package/dist/packem_chunks/state.js +3 -3
  64. package/dist/packem_chunks/status.js +1 -1
  65. package/dist/packem_chunks/sync.js +1 -1
  66. package/dist/packem_chunks/sync2.js +1 -1
  67. package/dist/packem_chunks/tripwire.js +1 -1
  68. package/dist/packem_chunks/verify-lockfile.js +1 -1
  69. package/dist/packem_shared/ReleaseClient-BY4OZNCK.js +1 -0
  70. package/dist/packem_shared/{Table-BGIHvenQ-D2oJtNQj.js → Table-CcVkyULl-DLWu6XHL.js} +1 -1
  71. package/dist/packem_shared/{advisories-CefYKEPe.js → advisories-B76fBVL-.js} +1 -1
  72. package/dist/packem_shared/{ai-analysis-rC48NLfB.js → ai-analysis-DF_AfeS3.js} +1 -1
  73. package/dist/packem_shared/{ai-fix-D_ijV3Rn.js → ai-fix-D1bFLkfk.js} +1 -1
  74. package/dist/packem_shared/{bin-CPMo34SM.js → bin-BlGVEhl8.js} +1 -1
  75. package/dist/packem_shared/{build-scripts-MTSK6TNr.js → build-scripts-q__dKE2y.js} +1 -1
  76. package/dist/packem_shared/{cyclonedx-BeUmPgfO.js → cyclonedx-CmrYQ0vx.js} +1 -1
  77. package/dist/packem_shared/{docker-CViFYtmM.js → docker-BYqiD711.js} +1 -1
  78. package/dist/packem_shared/{env-Ct3hMEYB.js → env-DJlbJiFh.js} +1 -1
  79. package/dist/packem_shared/{failure-log-Dy2G-rKi.js → failure-log-Bt7sW4p7.js} +1 -1
  80. package/dist/packem_shared/{index-XAb0QGqA.js → index-C6tpgeIV.js} +2 -2
  81. package/dist/packem_shared/{index-Cntyu-w8.js → index-D6fJJDli.js} +1 -1
  82. package/dist/packem_shared/{lifecycle-CHcFuWf_.js → lifecycle-XeMei1ED.js} +1 -1
  83. package/dist/packem_shared/{manifests-WBnsV_Eb.js → manifests-DSBr3-dw.js} +1 -1
  84. package/dist/packem_shared/{native-config-sync-BFDVK9LH.js → native-config-sync-D-z2Uwqu.js} +1 -1
  85. package/dist/packem_shared/{osv-bloom-DVMlkcAO.js → osv-bloom-DMhXP184.js} +1 -1
  86. package/dist/packem_shared/{packument-C-A3Uhhx.js → packument-CY2QDFml.js} +1 -1
  87. package/dist/packem_shared/plugins.d-ND23R9I3.d.ts +4 -0
  88. package/dist/packem_shared/{provenance-R2csDSNg.js → provenance-DVHiWZrW.js} +1 -1
  89. package/dist/packem_shared/{registry-keys-CMnS_Qt_.js → registry-keys-BKEq72qX.js} +1 -1
  90. package/dist/packem_shared/{resolve-explicit-C4oQMyoB.js → resolve-explicit-UtkNrGKq.js} +1 -1
  91. package/dist/packem_shared/{runtime-check-BXehSP06.js → runtime-check-qnrPTlma.js} +1 -1
  92. package/dist/packem_shared/{s1ngularity-BCDt28u0.js → s1ngularity-DUZtU95L.js} +1 -1
  93. package/dist/packem_shared/{scan-progress-YRpDs90j.js → scan-progress-BgtHexnt.js} +1 -1
  94. package/dist/packem_shared/{signatures-B3srzCEv.js → signatures-QoCuUv9E.js} +1 -1
  95. package/dist/packem_shared/target-merge-Dg25Izl5.js +11 -0
  96. package/dist/packem_shared/{toolchain-C44mPKPu.js → toolchain-Zb3VzZb4.js} +1 -1
  97. package/dist/packem_shared/{typosquats-CQz-1Y6K.js → typosquats-C12CP_2G.js} +1 -1
  98. package/dist/packem_shared/{use-measured-height-DHi0xOPO.js → use-measured-height-BpKmrlkw.js} +1 -1
  99. package/dist/packem_shared/{vis-update-app-B3I14Vfy.js → vis-update-app-BoCQ4ute.js} +1 -1
  100. package/dist/packem_shared/{watch-loop-JfGKIgKB.js → watch-loop-BZudYfcl.js} +1 -1
  101. package/dist/release/index.d.ts +39 -2
  102. package/dist/release/index.js +1 -1
  103. package/dist/release/plugin-sdk.d.ts +2 -1
  104. package/dist/release/plugin-sdk.js +1 -1
  105. package/dist/release/types.d.ts +117 -1
  106. package/dist/release/types.js +1 -1
  107. package/index.js +52 -52
  108. package/package.json +9 -9
  109. package/schemas/vis-config.schema.json +33 -0
  110. package/schemas/vis-release-config.schema.json +33 -0
  111. package/dist/packem_shared/ReleaseClient-YHzBIxYS.js +0 -1
  112. package/dist/packem_shared/target-merge-DOm6h6tW.js +0 -11
  113. /package/dist/packem_shared/{readJsonSync-CvkZyKmL-ihoybKvs.js → readJsonSync-DuMMeB3s-ihoybKvs.js} +0 -0
@@ -0,0 +1,3 @@
1
+ const e=s=>s.config.plugins??[],i=async(s,a)=>{for(const l of e(s))l.applyDraft&&await l.applyDraft({...s,plan:a})},t=async(s,a)=>{for(const l of e(s))if(l.willPublish&&await l.willPublish({...s,package:a})===!1)return{by:l.name,skip:!0};return{skip:!1}},n=async(s,a)=>{for(const l of e(s))if(l.afterPublish)try{await l.afterPublish({...s,package:a})}catch(r){process.stderr.write(`[vis release] plugin "${l.name}" afterPublish(${a.name}) failed: ${r.message}
2
+ `)}},f=async(s,a)=>{for(const l of e(s))if(l.afterPublishAll)try{await l.afterPublishAll({...s,result:a})}catch(r){process.stderr.write(`[vis release] plugin "${l.name}" afterPublishAll failed: ${r.message}
3
+ `)}},o=s=>s;export{o as defineReleasePlugin,f as runAfterPublishAllHooks,n as runAfterPublishHooks,i as runApplyDraftHooks,t as runWillPublishHooks};
@@ -1,4 +1,4 @@
1
- import{createRequire as F}from"node:module";import{j as w,E as k,s as b,q as T,V as I,I as j}from"../packem_shared/index.server-J83sowC4.js";import{y as R}from"../packem_shared/index-CE6MsgcV.js";import{a as J,r as D,b as m,c as E}from"../packem_shared/ai-fix-D_ijV3Rn.js";import{p}from"./cli-main.js";import{l as N}from"../packem_shared/failure-log-Dy2G-rKi.js";const A=F(import.meta.url),h=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,O=o=>{if(typeof h<"u"&&h.versions&&h.versions.node){const[t,r]=h.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return h.getBuiltinModule(o)}return A(o)},{createInterface:q}=O("node:readline"),B={"ambiguous-match":"ambiguous match",applied:"applied",error:"error","missing-file":"missing file","no-match":"no match","outside-workspace":"outside workspace"},S=(o,t,r)=>{const e=E(o,t,r),s=R(o,e);return s===""||s.startsWith("..")?e:s},L=(o,t,r)=>{const e=[w(`Fix proposal (${o.provider}, confidence: ${o.confidence})`),"",o.explanation||k("<no explanation>")];if(o.cannotFix)return e.push(""),e.push(b(`Cannot fix automatically: ${o.cannotFix}`)),e.join(`
1
+ import{createRequire as F}from"node:module";import{j as w,E as k,s as b,q as T,V as I,I as j}from"../packem_shared/index.server-J83sowC4.js";import{y as R}from"../packem_shared/index-CE6MsgcV.js";import{a as J,r as D,b as m,c as E}from"../packem_shared/ai-fix-D1bFLkfk.js";import{p}from"./cli-main.js";import{l as N}from"../packem_shared/failure-log-Bt7sW4p7.js";const A=F(import.meta.url),h=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,O=o=>{if(typeof h<"u"&&h.versions&&h.versions.node){const[t,r]=h.versions.node.split(".").map(Number);if(t>22||t===22&&r>=3||t===20&&r>=16)return h.getBuiltinModule(o)}return A(o)},{createInterface:q}=O("node:readline"),B={"ambiguous-match":"ambiguous match",applied:"applied",error:"error","missing-file":"missing file","no-match":"no match","outside-workspace":"outside workspace"},S=(o,t,r)=>{const e=E(o,t,r),s=R(o,e);return s===""||s.startsWith("..")?e:s},L=(o,t,r)=>{const e=[w(`Fix proposal (${o.provider}, confidence: ${o.confidence})`),"",o.explanation||k("<no explanation>")];if(o.cannotFix)return e.push(""),e.push(b(`Cannot fix automatically: ${o.cannotFix}`)),e.join(`
2
2
  `);if(o.patches.length===0)return e.push(""),e.push(b("No patches were proposed.")),e.join(`
3
3
  `);e.push(""),e.push(w(`Patches (${String(o.patches.length)}):`));for(const[s,i]of o.patches.entries()){const a=S(t,r,i.file);e.push(""),e.push(T(`[${String(s+1)}] ${a}`)),i.reason&&e.push(k(` reason: ${i.reason}`));for(const u of i.oldString.split(`
4
4
  `))e.push(I(` - ${u}`));for(const u of i.newString.split(`
@@ -0,0 +1 @@
1
+ import{s as l}from"../packem_shared/index-Cg0IHaFI.js";import g from"./index.js";import{normaliseGroup as d}from"../release/types.js";const v=(n,e,r)=>(n??"{name}@{version}").replaceAll("{name}",e).replaceAll("{version}",r),h=n=>{let e=n[0]??"0.0.0";for(const r of n){const s=l.valid(r)!==null,t=l.valid(e)!==null;s&&(!t||l.gt(r,e))&&(e=r)}return e},k=(n,e)=>{const r=[...n.fixed??[],...n.linked??[]].map(a=>d(a)),s=[],t=new Set;return r.forEach((a,f)=>{if(!a.syncGitTag)return;const m=e.filter(o=>!t.has(o.name)&&a.packages.some(i=>o.name===i||g(i,o.name))).map(o=>o.name);if(m.length===0)return;for(const o of m)t.add(o);const u=m.map(o=>e.find(i=>i.name===o)?.version??"0.0.0"),p=h(u),c=a.name??`group-${f}`;s.push({members:m,name:c,tag:v(a.tagPattern,c,p),version:p})}),{grouped:t,groups:s}};export{k as resolveSyncTagGroups};
@@ -1,4 +1,4 @@
1
- import{createRequire as g}from"node:module";import{f as l,v as d,m as r,T as w}from"../packem_shared/index-CE6MsgcV.js";import{b as y}from"../packem_shared/env-Ct3hMEYB.js";const v=g(import.meta.url),t=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,u=o=>{if(typeof t<"u"&&t.versions&&t.versions.node){const[n,i]=t.versions.node.split(".").map(Number);if(n>22||n===22&&i>=3||n===20&&i>=16)return t.getBuiltinModule(o)}return v(o)},{homedir:s}=u("node:os"),{createInterface:_}=u("node:readline"),c=y(),m=[r(s(),".zshrc"),r(s(),".zshenv"),r(s(),".bashrc"),r(s(),".bash_profile"),r(s(),".profile"),r(s(),".config","fish","config.fish")],b=o=>{const n=[];for(const i of m)if(l(i))try{const f=d(i).split(`
1
+ import{createRequire as g}from"node:module";import{f as l,v as d,m as r,T as w}from"../packem_shared/index-CE6MsgcV.js";import{b as y}from"../packem_shared/env-DJlbJiFh.js";const v=g(import.meta.url),t=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,u=o=>{if(typeof t<"u"&&t.versions&&t.versions.node){const[n,i]=t.versions.node.split(".").map(Number);if(n>22||n===22&&i>=3||n===20&&i>=16)return t.getBuiltinModule(o)}return v(o)},{homedir:s}=u("node:os"),{createInterface:_}=u("node:readline"),c=y(),m=[r(s(),".zshrc"),r(s(),".zshenv"),r(s(),".bashrc"),r(s(),".bash_profile"),r(s(),".profile"),r(s(),".config","fish","config.fish")],b=o=>{const n=[];for(const i of m)if(l(i))try{const f=d(i).split(`
2
2
  `),a=f.filter(e=>!e.includes(".vis/bin")&&!e.includes("VIS_HOME")&&!e.includes("# vis "));a.length!==f.length&&(w(i,a.join(`
3
3
  `)),n.push(i))}catch{o.warn(`warning: could not clean ${i}`)}return n},q=async({fs:o,logger:n,options:i})=>{if(!l(c)){n.info("vis is not installed (no ~/.vis directory found).");return}n.info("This will remove:"),n.info(` ${c}/`);const f=m.filter(e=>l(e)&&d(e).includes(".vis"));for(const e of f)n.info(` Lines in ${e}`);if(!i.yes){if(!process.stdin.isTTY)throw new Error("Non-interactive terminal. Use --yes to confirm.");const e=_({input:process.stdin,output:process.stdout}),p=await new Promise(h=>{e.question(`
4
4
  Type "uninstall" to confirm: `,h)});if(e.close(),p.trim()!=="uninstall"){n.info("Aborted.");return}}const a=b(n);for(const e of a)n.info(`Cleaned ${e}`);try{await o.rm(c,{force:!0,recursive:!0}),n.info(`
@@ -1,4 +1,4 @@
1
- import{createRequire as D}from"node:module";import{m,y as B,f as $,T as b}from"../packem_shared/index-CE6MsgcV.js";import{findVisConfigFile as F,DEFAULT_MIN_RELEASE_AGE_MINUTES as h}from"./CONFIG_FILES.js";import{p as e}from"./cli-main.js";import{A as I}from"../packem_shared/pm-runner-CQcraCcu.js";import{w as P}from"../packem_shared/build-scripts-MTSK6TNr.js";import{O as E}from"../packem_shared/native-config-sync-BFDVK9LH.js";import{S as R}from"../packem_shared/min-release-age-C71MO72F.js";const N=D(import.meta.url),g=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,T=t=>{if(typeof g<"u"&&g.versions&&g.versions.node){const[s,o]=g.versions.node.split(".").map(Number);if(s>22||s===22&&o>=3||s===20&&o>=16)return g.getBuiltinModule(t)}return N(t)},{execFileSync:M}=T("node:child_process"),{createInterface:O}=T("node:readline"),G=t=>{const s=[];return $(m(t,"turbo.json"))&&s.push("turborepo"),$(m(t,"nx.json"))&&s.push("nx"),$(m(t,".moon"))&&s.push("moon"),s},x=(t,s)=>new Promise(o=>{t.question(s,i=>{o(i.trim())})}),u=async(t,s,o=!0)=>{const i=await x(t,`${s} ${o?"[Y/n]":"[y/N]"} `);return i===""?o:i.toLowerCase()==="y"||i.toLowerCase()==="yes"},w=(t,s)=>{const o=[],i=Object.entries(s.allowBuilds).filter(([,l])=>l).map(([l])=>` "${l}": true,`).join(`
1
+ import{createRequire as D}from"node:module";import{m,y as B,f as $,T as b}from"../packem_shared/index-CE6MsgcV.js";import{findVisConfigFile as F,DEFAULT_MIN_RELEASE_AGE_MINUTES as h}from"./CONFIG_FILES.js";import{p as e}from"./cli-main.js";import{A as I}from"../packem_shared/pm-runner-CQcraCcu.js";import{w as P}from"../packem_shared/build-scripts-q__dKE2y.js";import{O as E}from"../packem_shared/native-config-sync-D-z2Uwqu.js";import{S as R}from"../packem_shared/min-release-age-C71MO72F.js";const N=D(import.meta.url),g=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,T=t=>{if(typeof g<"u"&&g.versions&&g.versions.node){const[s,o]=g.versions.node.split(".").map(Number);if(s>22||s===22&&o>=3||s===20&&o>=16)return g.getBuiltinModule(t)}return N(t)},{execFileSync:M}=T("node:child_process"),{createInterface:O}=T("node:readline"),G=t=>{const s=[];return $(m(t,"turbo.json"))&&s.push("turborepo"),$(m(t,"nx.json"))&&s.push("nx"),$(m(t,".moon"))&&s.push("moon"),s},x=(t,s)=>new Promise(o=>{t.question(s,i=>{o(i.trim())})}),u=async(t,s,o=!0)=>{const i=await x(t,`${s} ${o?"[Y/n]":"[y/N]"} `);return i===""?o:i.toLowerCase()==="y"||i.toLowerCase()==="yes"},w=(t,s)=>{const o=[],i=Object.entries(s.allowBuilds).filter(([,l])=>l).map(([l])=>` "${l}": true,`).join(`
2
2
  `),a=[` installScripts: {
3
3
  allow: ${i?`{
4
4
  ${i}
@@ -1,4 +1,4 @@
1
- import{I as $,E as u,V as k,s as y}from"../packem_shared/index.server-J83sowC4.js";import{p}from"./cli-main.js";import{r as N,M,a as R,b as S,c as x,d as A,e as V,f as b,g as C,h as E}from"../packem_shared/s1ngularity-BCDt28u0.js";import{g as P,r as j}from"../packem_shared/packument-C-A3Uhhx.js";import{r as B}from"../packem_shared/provenance-R2csDSNg.js";import{r as D}from"../packem_shared/signatures-B3srzCEv.js";const v=new Set(["archivedRepo","author","downloads","expiredDomains","metadata","newBin","provenance","s1ngularity","signatures"]),I=r=>{const s=r.trim();if(s==="")return;if(s.startsWith("@")){const o=s.indexOf("@",1);return o===-1?{name:s,spec:void 0}:{name:s.slice(0,o),spec:s.slice(o+1)||void 0}}const i=s.indexOf("@");return i===-1?{name:s,spec:void 0}:{name:s.slice(0,i),spec:s.slice(i+1)||void 0}},O=r=>{if(r===void 0||r.trim()==="")return;const s=new Set;for(const i of r.split(",")){const o=i.trim();if(!v.has(o))throw new Error(`Unknown marshall in --only: ${o}. Known: ${[...v].sort().join(", ")}.`);s.add(o)}return s},m=(r,s)=>r===void 0||r.has(s),F=r=>r?.has("signatures")??!1,K=async({argument:r,options:s,workspaceRoot:i})=>{if(!r||r.length===0)throw new Error("No package specified. Usage: vis inspect <package>[@<spec>]");const o=I(r[0]);if(o===void 0)throw new Error(`Invalid package argument: "${String(r[0])}". Usage: vis inspect <package>[@<spec>]`);const t=O(s.only),f=await P(o.name,{workspaceRoot:i});if(f===void 0){p.error(`Package ${o.name} not found in the registry.`),process.exitCode=2;return}const g=j(f,o.spec);if(g===void 0){p.error(`Could not resolve ${o.name}@${o.spec??"latest"} to a published version.`),process.exitCode=2;return}const c=[{name:o.name,version:g}],n=new M;if(m(t,"author")){const e=await N(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"author",message:a.message,packageName:a.packageName,severity:a.severity})}if(m(t,"provenance")){const e=await B(c);for(const a of e)n.add({marshall:"provenance",message:`Prior version ${a.priorVersionWithProvenance} had provenance but ${a.version} does not.`,packageName:a.packageName,severity:"error"})}if(m(t,"s1ngularity")){const e=await R(c,{workspaceRoot:i});for(const a of e){const d=a.hookChanges.map(w=>`${w.hook} (${w.kind})`).join(", "),l=a.hookChanges.length===1;n.add({marshall:"s1ngularity",message:`${a.version} ${l?"has an":"has"} install-script ${l?"change":"changes"} [${d}] AND dropped the provenance attestation that ${a.priorVersion} carried — this is the s1ngularity compromised-publish shape.`,packageName:a.packageName,severity:"error"})}}if(m(t,"newBin")){const e=await S(c);for(const a of e){const d=a.newBins.map(l=>l.command).join(", ");n.add({marshall:"newBin",message:`${a.toVersion} adds new bin script${a.newBins.length===1?"":"s"}: ${d} (prior: ${a.fromVersion}).`,packageName:a.packageName,severity:"warning"})}}if(m(t,"metadata")){const e=await x(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"metadata",message:`Missing/invalid metadata: ${a.issues.join(", ")}.`,packageName:a.packageName,severity:"warning"})}if(m(t,"downloads")){const e=await A([o.name]);for(const a of e){const d=a.downloadsLastMonth===void 0?"unknown":String(a.downloadsLastMonth);n.add({marshall:"downloads",message:a.kind==="no-data"?"npm stats API returned no monthly download data.":`Only ${d} downloads in the past month.`,packageName:a.packageName,severity:a.severity})}}if(m(t,"expiredDomains")){const e=await V(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"expiredDomains",message:a.kind==="expired"?`Maintainer email domain ${a.domain} (${a.maintainer}) is unregistered — potential hijack risk.`:`Could not verify maintainer email domain ${a.domain} (${a.maintainer}).`,packageName:a.packageName,severity:a.severity})}if(F(t)){const e=await D(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"signatures",message:a.message,packageName:a.packageName,severity:a.severity})}if(m(t,"archivedRepo")){const e=await b(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"archivedRepo",message:a.kind==="archived"?`Source repo ${a.owner}/${a.repo} is archived${a.archivedAt===void 0?"":` (since ${a.archivedAt})`}.`:`Source repo ${a.owner}/${a.repo} returned 404 from GitHub.`,packageName:a.packageName,severity:"warning"})}const h=n.all();if(s.json===!0)process.stdout.write(`${JSON.stringify(C(h),void 0,2)}
1
+ import{I as $,E as u,V as k,s as y}from"../packem_shared/index.server-J83sowC4.js";import{p}from"./cli-main.js";import{r as N,M,a as R,b as S,c as x,d as A,e as V,f as b,g as C,h as E}from"../packem_shared/s1ngularity-DUZtU95L.js";import{g as P,r as j}from"../packem_shared/packument-CY2QDFml.js";import{r as B}from"../packem_shared/provenance-DVHiWZrW.js";import{r as D}from"../packem_shared/signatures-QoCuUv9E.js";const v=new Set(["archivedRepo","author","downloads","expiredDomains","metadata","newBin","provenance","s1ngularity","signatures"]),I=r=>{const s=r.trim();if(s==="")return;if(s.startsWith("@")){const o=s.indexOf("@",1);return o===-1?{name:s,spec:void 0}:{name:s.slice(0,o),spec:s.slice(o+1)||void 0}}const i=s.indexOf("@");return i===-1?{name:s,spec:void 0}:{name:s.slice(0,i),spec:s.slice(i+1)||void 0}},O=r=>{if(r===void 0||r.trim()==="")return;const s=new Set;for(const i of r.split(",")){const o=i.trim();if(!v.has(o))throw new Error(`Unknown marshall in --only: ${o}. Known: ${[...v].sort().join(", ")}.`);s.add(o)}return s},m=(r,s)=>r===void 0||r.has(s),F=r=>r?.has("signatures")??!1,K=async({argument:r,options:s,workspaceRoot:i})=>{if(!r||r.length===0)throw new Error("No package specified. Usage: vis inspect <package>[@<spec>]");const o=I(r[0]);if(o===void 0)throw new Error(`Invalid package argument: "${String(r[0])}". Usage: vis inspect <package>[@<spec>]`);const t=O(s.only),f=await P(o.name,{workspaceRoot:i});if(f===void 0){p.error(`Package ${o.name} not found in the registry.`),process.exitCode=2;return}const g=j(f,o.spec);if(g===void 0){p.error(`Could not resolve ${o.name}@${o.spec??"latest"} to a published version.`),process.exitCode=2;return}const c=[{name:o.name,version:g}],n=new M;if(m(t,"author")){const e=await N(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"author",message:a.message,packageName:a.packageName,severity:a.severity})}if(m(t,"provenance")){const e=await B(c);for(const a of e)n.add({marshall:"provenance",message:`Prior version ${a.priorVersionWithProvenance} had provenance but ${a.version} does not.`,packageName:a.packageName,severity:"error"})}if(m(t,"s1ngularity")){const e=await R(c,{workspaceRoot:i});for(const a of e){const d=a.hookChanges.map(w=>`${w.hook} (${w.kind})`).join(", "),l=a.hookChanges.length===1;n.add({marshall:"s1ngularity",message:`${a.version} ${l?"has an":"has"} install-script ${l?"change":"changes"} [${d}] AND dropped the provenance attestation that ${a.priorVersion} carried — this is the s1ngularity compromised-publish shape.`,packageName:a.packageName,severity:"error"})}}if(m(t,"newBin")){const e=await S(c);for(const a of e){const d=a.newBins.map(l=>l.command).join(", ");n.add({marshall:"newBin",message:`${a.toVersion} adds new bin script${a.newBins.length===1?"":"s"}: ${d} (prior: ${a.fromVersion}).`,packageName:a.packageName,severity:"warning"})}}if(m(t,"metadata")){const e=await x(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"metadata",message:`Missing/invalid metadata: ${a.issues.join(", ")}.`,packageName:a.packageName,severity:"warning"})}if(m(t,"downloads")){const e=await A([o.name]);for(const a of e){const d=a.downloadsLastMonth===void 0?"unknown":String(a.downloadsLastMonth);n.add({marshall:"downloads",message:a.kind==="no-data"?"npm stats API returned no monthly download data.":`Only ${d} downloads in the past month.`,packageName:a.packageName,severity:a.severity})}}if(m(t,"expiredDomains")){const e=await V(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"expiredDomains",message:a.kind==="expired"?`Maintainer email domain ${a.domain} (${a.maintainer}) is unregistered — potential hijack risk.`:`Could not verify maintainer email domain ${a.domain} (${a.maintainer}).`,packageName:a.packageName,severity:a.severity})}if(F(t)){const e=await D(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"signatures",message:a.message,packageName:a.packageName,severity:a.severity})}if(m(t,"archivedRepo")){const e=await b(c,{workspaceRoot:i});for(const a of e)n.add({marshall:"archivedRepo",message:a.kind==="archived"?`Source repo ${a.owner}/${a.repo} is archived${a.archivedAt===void 0?"":` (since ${a.archivedAt})`}.`:`Source repo ${a.owner}/${a.repo} returned 404 from GitHub.`,packageName:a.packageName,severity:"warning"})}const h=n.all();if(s.json===!0)process.stdout.write(`${JSON.stringify(C(h),void 0,2)}
2
2
  `);else{const e=`${o.name}@${g}`;if(h.length===0)p.info(`${$("✓")} ${e} — no findings.`);else{p.info(`${u("Inspecting")} ${e}`);for(const l of E(h))process.stdout.write(`${l}
3
3
  `);const a=n.errors().length,d=n.warnings().length;process.stdout.write(`
4
4
  ${u("Summary:")} ${k(`${String(a)} error${a===1?"":"s"}`)}, ${y(`${String(d)} warning${d===1?"":"s"}`)}.
@@ -1 +1 @@
1
- import{m as C,f as $,H as A,j as B}from"../packem_shared/index-CE6MsgcV.js";import{p as t}from"./cli-main.js";import{A as F,h,I as H,C as T}from"../packem_shared/pm-runner-CQcraCcu.js";import{a as M,r as N}from"../packem_shared/command-runtime-3FTGuUsK.js";import{s as Q}from"../packem_shared/typosquats-CQz-1Y6K.js";import{h as U,P as V}from"../packem_shared/peer-warnings-BXAzXqY3.js";import{i as W}from"../packem_shared/utils-CRueU43T.js";const G=["pnpm-lock.yaml","yarn.lock","package-lock.json","npm-shrinkwrap.json","bun.lock","bun.lockb"],J=a=>{let r=a;for(;;){for(const l of G)if($(C(r,l)))return!0;const n=A(r);if(n===r||B(r).root===r)return!1;r=n}},g=new Set(["aube","auto","bun","npm","pnpm","yarn"]),se=async a=>{const{argument:r,fs:n,logger:l,options:e,visConfig:i,workspaceRoot:w}=a,s=w??process.cwd();if(r&&r.length>0){const o=e,{default:q}=await import("./handler15.js"),I=o.marshallCheck===!1||o["no-marshall-check"]===!0?!1:void 0,z=o.socketCheck===!1||o["no-socket-check"]===!0?!1:void 0,E=o.typosquatCheck===!1||o["no-typosquat-check"]===!0?!1:void 0,P=o.runScripts===!0||o["run-scripts"]===!0,j=o.workspaceRoot===!0||o["workspace-root"]===!0,D=o.saveOptional===!0||o["save-optional"]===!0,L=e.dev===!0,_={autoInstallPeers:!1,exact:o.exact===!0,filter:e.filter,global:!1,marshallCheck:I,runScripts:P,saveDev:L,saveOptional:D,savePeer:!1,socketCheck:z,to:void 0,typosquatCheck:E,workspace:!1,workspaceRoot:j};await q({...a,argument:r,options:_});return}if(e.typosquatCheck!==!1&&!await Q(s,i?.security?.typosquatAllowlist)){process.exitCode=1;return}const c=e.installer;if(c&&!g.has(c)){t.error(`Invalid --installer value: "${c}". Expected one of: ${[...g].join(", ")}.`),process.exitCode=1;return}const y=c,b=e.aube===!1,f=M(N({logger:l,options:e,visConfig:i},s));let p;try{p=b?f===void 0?F(s):h(s,{backend:f}):h(s,{backend:y??f,configBackend:i?.install?.backend,configCorepack:i?.install?.corepack})}catch(o){t.error(o instanceof Error?o.message:String(o)),process.exitCode=1;return}const m=H(s,p);m&&t.warn(m);const x=W(e.filter),u=e.ci||!1,d=e.frozenLockfile||u,O=e.frozenLockfile===!1||e.force||e.lockfileOnly,R=J(s),v=d||!O&&R;if(!d&&v&&!e.silent&&t.info("Defaulting to frozen lockfile (pass --no-frozen-lockfile to allow lockfile updates)."),u){t.info("Clean install: removing node_modules...");try{await n.rm(C(s,"node_modules"),{force:!0,recursive:!0})}catch(o){t.error(`Failed to remove node_modules: ${o instanceof Error?o.message:String(o)}`),process.exitCode=1;return}}const{code:k,output:S}=await T(p,{dev:e.dev||!1,filter:x,force:e.force||!1,frozenLockfile:v,ignoreScripts:!e.runScripts,lockfileOnly:e.lockfileOnly||!1,noOptional:e.optional===!1,offline:e.offline||!1,prod:e.prod||!1,recursive:e.recursive||!1,silent:e.silent||!1,workspaceRoot:e.workspaceRoot||!1},s,l,{ciMode:u,preferOffline:e.preferOffline||!1});k!==0&&(process.exitCode=k),k===0&&!e.silent&&U(S)&&t.info(V)};export{se as default};
1
+ import{m as C,f as $,H as A,j as B}from"../packem_shared/index-CE6MsgcV.js";import{p as t}from"./cli-main.js";import{A as F,h,I as H,C as T}from"../packem_shared/pm-runner-CQcraCcu.js";import{a as M,r as N}from"../packem_shared/command-runtime-3FTGuUsK.js";import{s as Q}from"../packem_shared/typosquats-C12CP_2G.js";import{h as U,P as V}from"../packem_shared/peer-warnings-BXAzXqY3.js";import{i as W}from"../packem_shared/utils-CRueU43T.js";const G=["pnpm-lock.yaml","yarn.lock","package-lock.json","npm-shrinkwrap.json","bun.lock","bun.lockb"],J=a=>{let r=a;for(;;){for(const l of G)if($(C(r,l)))return!0;const n=A(r);if(n===r||B(r).root===r)return!1;r=n}},g=new Set(["aube","auto","bun","npm","pnpm","yarn"]),se=async a=>{const{argument:r,fs:n,logger:l,options:e,visConfig:i,workspaceRoot:w}=a,s=w??process.cwd();if(r&&r.length>0){const o=e,{default:q}=await import("./handler15.js"),I=o.marshallCheck===!1||o["no-marshall-check"]===!0?!1:void 0,z=o.socketCheck===!1||o["no-socket-check"]===!0?!1:void 0,E=o.typosquatCheck===!1||o["no-typosquat-check"]===!0?!1:void 0,P=o.runScripts===!0||o["run-scripts"]===!0,j=o.workspaceRoot===!0||o["workspace-root"]===!0,D=o.saveOptional===!0||o["save-optional"]===!0,L=e.dev===!0,_={autoInstallPeers:!1,exact:o.exact===!0,filter:e.filter,global:!1,marshallCheck:I,runScripts:P,saveDev:L,saveOptional:D,savePeer:!1,socketCheck:z,to:void 0,typosquatCheck:E,workspace:!1,workspaceRoot:j};await q({...a,argument:r,options:_});return}if(e.typosquatCheck!==!1&&!await Q(s,i?.security?.typosquatAllowlist)){process.exitCode=1;return}const c=e.installer;if(c&&!g.has(c)){t.error(`Invalid --installer value: "${c}". Expected one of: ${[...g].join(", ")}.`),process.exitCode=1;return}const y=c,b=e.aube===!1,f=M(N({logger:l,options:e,visConfig:i},s));let p;try{p=b?f===void 0?F(s):h(s,{backend:f}):h(s,{backend:y??f,configBackend:i?.install?.backend,configCorepack:i?.install?.corepack})}catch(o){t.error(o instanceof Error?o.message:String(o)),process.exitCode=1;return}const m=H(s,p);m&&t.warn(m);const x=W(e.filter),u=e.ci||!1,d=e.frozenLockfile||u,O=e.frozenLockfile===!1||e.force||e.lockfileOnly,R=J(s),v=d||!O&&R;if(!d&&v&&!e.silent&&t.info("Defaulting to frozen lockfile (pass --no-frozen-lockfile to allow lockfile updates)."),u){t.info("Clean install: removing node_modules...");try{await n.rm(C(s,"node_modules"),{force:!0,recursive:!0})}catch(o){t.error(`Failed to remove node_modules: ${o instanceof Error?o.message:String(o)}`),process.exitCode=1;return}}const{code:k,output:S}=await T(p,{dev:e.dev||!1,filter:x,force:e.force||!1,frozenLockfile:v,ignoreScripts:!e.runScripts,lockfileOnly:e.lockfileOnly||!1,noOptional:e.optional===!1,offline:e.offline||!1,prod:e.prod||!1,recursive:e.recursive||!1,silent:e.silent||!1,workspaceRoot:e.workspaceRoot||!1},s,l,{ciMode:u,preferOffline:e.preferOffline||!1});k!==0&&(process.exitCode=k),k===0&&!e.silent&&U(S)&&t.info(V)};export{se as default};
@@ -1 +1 @@
1
- import{createRequire as M}from"node:module";import{I as R,E as j,V as A,s as I}from"../packem_shared/index.server-J83sowC4.js";import{m as L,O as B}from"../packem_shared/index-CE6MsgcV.js";import{i as b,p as f,P as N}from"./cli-main.js";import"../packem_shared/public-api-WqUCiyIe.js";import{c as F,f as z,b as U,R as V,l as H}from"./catalog.js";import{h as J,j as W,y as Y}from"../packem_shared/pm-runner-CQcraCcu.js";import{r as G,a as K}from"../packem_shared/command-runtime-3FTGuUsK.js";import{r as P,a as Q,p as X,b as Z}from"../packem_shared/resolve-explicit-C4oQMyoB.js";import{H as ee,F as C,D as oe,J as te,y,B as se,h as ne}from"../packem_shared/env-Ct3hMEYB.js";import{r as re}from"../packem_shared/typosquats-CQz-1Y6K.js";import{f as D,i as S}from"../packem_shared/utils-CRueU43T.js";import{a as ie}from"../packem_shared/readJsonSync-CvkZyKmL-ihoybKvs.js";const q=M(import.meta.url),w=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,O=t=>{if(typeof w<"u"&&w.versions&&w.versions.node){const[c,e]=w.versions.node.split(".").map(Number);if(c>22||c===22&&e>=3||c===20&&e>=16)return w.getBuiltinModule(t)}return q(t)},{createInterface:T}=O("node:readline"),x=t=>t==="default"?"catalog:":`catalog:${t}`,v=t=>t==="default"?"default catalog":`catalog "${t}"`,ae=(t,c)=>{const e=[];for(const[o,s]of c)o.includes(":")||s.has(t)&&e.push(o);if(e.length===0)return;if(e.length===1){const[o]=e;return{source:v(o),spec:x(o)}}const r=e.find(o=>o==="default")??e[0],i=e.filter(o=>o!==r);return{candidates:[...e],conflict:!0,source:`${v(r)} (also in: ${i.map(o=>v(o)).join(", ")})`,spec:x(r)}},ce=(t,c)=>{const e=new Map;for(const[a,u]of c){if(!a.includes(":"))continue;const p=u.get(t);p!==void 0&&e.set(p,(e.get(p)??0)+1)}if(e.size===0)return;const r=[...e.entries()],i=r.reduce((a,[,u])=>a+u,0);if(r.length===1){const[[a]]=r;return{source:`siblings (${String(i)} pkg${i===1?"":"s"} on ${a})`,spec:a}}const o=[...r].sort((a,u)=>u[1]-a[1]),[s,n]=o[0],l=o.slice(1).map(([a,u])=>`${a} (×${String(u)})`);return{candidates:o.map(([a])=>a),conflict:!0,source:`siblings (most common: ${s} ×${String(n)}; conflicts: ${l.join(", ")})`,spec:s}},le=(t,c)=>ae(t,c)||ce(t,c),pe=(t,c,e)=>{const r=[];for(const i of t.values()){const{overall:o}=i.score,s=se(o),n=`${String(Math.round(o*100))}%`,l=i.alerts.length,a=y(i),u=ee(a,i.version,e),p=s==="red"?A:s==="yellow"?I:R;if(u?f.info(` ${p(n)} ${C(i)} ${j(`[accepted: ${u.reason}]`)}`):f.info(` ${p(n)} ${C(i)}`),l>0){const g=i.alerts.filter(d=>d.severity==="critical"||d.severity==="high").length;g>0&&f.warn(` ${String(g)} critical/high alert${g===1?"":"s"}`)}o<c&&!u&&r.push(i)}return r},fe=async(t,c)=>{const e=T({input:process.stdin,output:process.stdout}),r=n=>new Promise(l=>{e.question(n,a=>{l(a.trim())})}),i=String(Math.round(c*100));f.warn(""),f.warn(`${String(t.length)} package${t.length===1?"":"s"} scored below the minimum threshold (${i}%):`);for(const n of t){const l=y(n),a=`${String(Math.round(n.score.overall*100))}%`;f.warn(` • ${l}@${n.version} — score: ${a} (${oe(n.score.overall)})`)}f.warn("");const o=await r("Continue adding these packages? [y/N] ");if(o.toLowerCase()!=="y"&&o.toLowerCase()!=="yes")return e.close(),!1;const s=await r("Remember this decision? (prints config snippet) [y/N] ");if(e.close(),s.toLowerCase()==="y"||s.toLowerCase()==="yes"){f.notice(""),f.notice("Add the following to security.acceptedRisks in vis.config.ts:"),f.notice("");for(const n of t){const l=y(n),a=te(l,n.version,n.score.overall,"Reviewed and accepted");f.notice(a)}f.notice("")}return!0},ue=async(t,c,e,r)=>{const i=await P(t);if(i.length===0)return!0;f.info(""),f.info(`${c.map(n=>n.displayName).join(" + ")} security check:`);const o=await z(c,i);if(o.size===0)return f.info(" Could not fetch security data. Proceeding."),!0;const s=pe(o,e,r);return s.length===0?(f.info(""),!0):process.stdin.isTTY?fe(s,e):(f.warn(`Aborting: ${String(s.length)} package${s.length===1?"":"s"} below minimum score. Use --no-socket-check to skip.`),!1)},de=["dependencies","devDependencies","peerDependencies","optionalDependencies"],ge=t=>t.savePeer?"peerDependencies":t.saveOptional?"optionalDependencies":t.saveDev?"devDependencies":"dependencies",_=(t,c)=>t.startsWith("catalog:")||!c?t:t.replace(/^[\^~]/,""),me=async(t,c)=>{const e=[];for(const o of t){const{name:s,versionSpec:n}=D(o);if(!s)continue;if(n!==void 0){e.push({explicit:n,name:s});continue}const l=le(s,c);if(l){l.conflict&&f.warn(`${s}: ambiguous constraint — picking ${l.spec} (${l.source}). Pass ${s}@<version> to override.`),e.push({entry:{name:s,source:l.source,spec:l.spec},kind:"resolved",name:s});continue}e.push({kind:"missing",name:s})}const r=e.filter(o=>"kind"in o&&o.kind==="missing").map(o=>o.name),i=r.length>0?await Z(r):new Map;return e.map(o=>{if("explicit"in o)return{name:o.name,source:"explicit",spec:o.explicit};if(o.kind==="resolved")return o.entry;const s=i.get(o.name);if(s===void 0)throw new Error(`--to: cannot resolve a version for "${o.name}" (not in any catalog or sibling, and registry lookup failed). Pass ${o.name}@<version> explicitly.`);const n=`^${s}`;return f.info(`${o.name}: no existing constraint — using registry latest (${n}). Add to a catalog to share this version across workspace packages.`),{name:o.name,source:"registry latest",spec:n}})},he=(t,c,e,r)=>{for(const{name:i,spec:o}of c){const s=_(o,r);for(const l of de){if(l===e)continue;const a=t[l];a?.[i]!==void 0&&(delete a[i],Object.keys(a).length===0&&delete t[l])}let n=t[e];n===void 0&&(n={},t[e]=n),n[i]=s}},ke=async({ignoreScripts:t,logger:c,options:e,packages:r,pm:i,target:o,visConfig:s,workspaceRoot:n})=>{const{workspace:l}=U(n,s??{}),a=l.projects[o];if(!a){const m=Object.keys(l.projects).sort();throw new Error(`--to: workspace package "${o}" not found. Available: ${m.length>0?m.slice(0,10).join(", "):"(none)"}${m.length>10?`, ... (${String(m.length-10)} more)`:""}.`)}const u=L(n,a.root,"package.json"),{packageManager:p}=N(n),g=V(n,p),d=ge(e),k=e.exact??!1,h=await me(r,g);if(h.length===0)return 0;const $=ie(u);he($,h,d,k),B(u,$,{indent:H(u,{useEditorconfig:s?.editorconfig??!0}),overwrite:!0});for(const m of h){const E=_(m.spec,k);f.info(`${R("+")} ${m.name}@${E} → ${o}/${d} (${j(m.source)})`)}return Y(i,{dev:!1,filter:[],force:!1,frozenLockfile:!1,ignoreScripts:t,lockfileOnly:!1,noOptional:!1,offline:!1,prod:!1,recursive:!1,silent:!1,workspaceRoot:!1},n,c)},Ee=async({argument:t,logger:c,options:e,visConfig:r,workspaceRoot:i})=>{let o=t;if(!o||o.length===0)throw new Error("No packages specified. Usage: vis add <packages...>");if(e.typosquatCheck!==!1){const p=o.map(d=>D(d)),g=await re(p.map(d=>d.name),r?.security?.typosquatAllowlist);if(!g.ok){process.exitCode=1;return}o=p.map((d,k)=>{const h=g.packages[k];return h!==d.name?d.versionSpec?`${h}@${d.versionSpec}`:h??"":o[k]??""})}if(e.marshallCheck!==!1){const p=await P(o);if(p.length>0){const g=await Q(p,{config:r?.security?.marshalls,workspaceRoot:i});if(!await X(g)){process.exitCode=1;return}}}if(e.socketCheck!==!1){const p=new Set;b("socket")&&p.add("socket"),b("depsDev")&&p.add("deps-dev");const g=F(r?.security,{disabled:p,minimumScore:r?.security?.policies?.score?.minimum});if(g.length>0){const d=r?.security?.policies?.score?.minimum??ne;if(!await ue(o,g,d,r?.security?.acceptedRisks)){process.exitCode=1;return}}}const s=process.cwd(),n=G({logger:c,options:e,visConfig:r},i??s),l=J(i??s,{backend:K(n),configBackend:r?.install?.backend,configCorepack:r?.install?.corepack}),a=!e.runScripts;if(e.to){if(e.global||e.workspaceRoot)throw new Error("--to is incompatible with --global / --workspace-root.");if(e.filter&&S(e.filter).length>0)throw new Error("--to and --filter are mutually exclusive — --to already targets one package.");if(!i)throw new Error("--to requires a monorepo workspace. Run from inside a pnpm/bun/yarn/npm workspace.");const p=await ke({ignoreScripts:a,logger:c,options:e,packages:o,pm:l,target:e.to,visConfig:r,workspaceRoot:i});p!==0&&(process.exitCode=p);return}const u=W(l,{exact:e.exact||!1,filter:S(e.filter),global:e.global||!1,optional:e.saveOptional||!1,packages:o,peer:e.savePeer||!1,saveDev:e.saveDev||!1,workspace:e.workspace||!1,workspaceRoot:e.workspaceRoot||!1},s,c,{autoInstallPeers:e.autoInstallPeers||!1,ignoreScripts:a});u!==0&&(process.exitCode=u)};export{Ee as default};
1
+ import{createRequire as M}from"node:module";import{I as R,E as j,V as A,s as I}from"../packem_shared/index.server-J83sowC4.js";import{m as L,O as B}from"../packem_shared/index-CE6MsgcV.js";import{i as b,p as f,P as N}from"./cli-main.js";import"../packem_shared/public-api-WqUCiyIe.js";import{c as F,f as z,b as U,R as V,l as H}from"./catalog.js";import{h as J,j as W,y as Y}from"../packem_shared/pm-runner-CQcraCcu.js";import{r as G,a as K}from"../packem_shared/command-runtime-3FTGuUsK.js";import{r as P,a as Q,p as X,b as Z}from"../packem_shared/resolve-explicit-UtkNrGKq.js";import{H as ee,F as C,D as oe,J as te,y,B as se,h as ne}from"../packem_shared/env-DJlbJiFh.js";import{r as re}from"../packem_shared/typosquats-C12CP_2G.js";import{f as D,i as S}from"../packem_shared/utils-CRueU43T.js";import{a as ie}from"../packem_shared/readJsonSync-DuMMeB3s-ihoybKvs.js";const q=M(import.meta.url),w=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,O=t=>{if(typeof w<"u"&&w.versions&&w.versions.node){const[c,e]=w.versions.node.split(".").map(Number);if(c>22||c===22&&e>=3||c===20&&e>=16)return w.getBuiltinModule(t)}return q(t)},{createInterface:T}=O("node:readline"),x=t=>t==="default"?"catalog:":`catalog:${t}`,v=t=>t==="default"?"default catalog":`catalog "${t}"`,ae=(t,c)=>{const e=[];for(const[o,s]of c)o.includes(":")||s.has(t)&&e.push(o);if(e.length===0)return;if(e.length===1){const[o]=e;return{source:v(o),spec:x(o)}}const r=e.find(o=>o==="default")??e[0],i=e.filter(o=>o!==r);return{candidates:[...e],conflict:!0,source:`${v(r)} (also in: ${i.map(o=>v(o)).join(", ")})`,spec:x(r)}},ce=(t,c)=>{const e=new Map;for(const[a,u]of c){if(!a.includes(":"))continue;const p=u.get(t);p!==void 0&&e.set(p,(e.get(p)??0)+1)}if(e.size===0)return;const r=[...e.entries()],i=r.reduce((a,[,u])=>a+u,0);if(r.length===1){const[[a]]=r;return{source:`siblings (${String(i)} pkg${i===1?"":"s"} on ${a})`,spec:a}}const o=[...r].sort((a,u)=>u[1]-a[1]),[s,n]=o[0],l=o.slice(1).map(([a,u])=>`${a} (×${String(u)})`);return{candidates:o.map(([a])=>a),conflict:!0,source:`siblings (most common: ${s} ×${String(n)}; conflicts: ${l.join(", ")})`,spec:s}},le=(t,c)=>ae(t,c)||ce(t,c),pe=(t,c,e)=>{const r=[];for(const i of t.values()){const{overall:o}=i.score,s=se(o),n=`${String(Math.round(o*100))}%`,l=i.alerts.length,a=y(i),u=ee(a,i.version,e),p=s==="red"?A:s==="yellow"?I:R;if(u?f.info(` ${p(n)} ${C(i)} ${j(`[accepted: ${u.reason}]`)}`):f.info(` ${p(n)} ${C(i)}`),l>0){const g=i.alerts.filter(d=>d.severity==="critical"||d.severity==="high").length;g>0&&f.warn(` ${String(g)} critical/high alert${g===1?"":"s"}`)}o<c&&!u&&r.push(i)}return r},fe=async(t,c)=>{const e=T({input:process.stdin,output:process.stdout}),r=n=>new Promise(l=>{e.question(n,a=>{l(a.trim())})}),i=String(Math.round(c*100));f.warn(""),f.warn(`${String(t.length)} package${t.length===1?"":"s"} scored below the minimum threshold (${i}%):`);for(const n of t){const l=y(n),a=`${String(Math.round(n.score.overall*100))}%`;f.warn(` • ${l}@${n.version} — score: ${a} (${oe(n.score.overall)})`)}f.warn("");const o=await r("Continue adding these packages? [y/N] ");if(o.toLowerCase()!=="y"&&o.toLowerCase()!=="yes")return e.close(),!1;const s=await r("Remember this decision? (prints config snippet) [y/N] ");if(e.close(),s.toLowerCase()==="y"||s.toLowerCase()==="yes"){f.notice(""),f.notice("Add the following to security.acceptedRisks in vis.config.ts:"),f.notice("");for(const n of t){const l=y(n),a=te(l,n.version,n.score.overall,"Reviewed and accepted");f.notice(a)}f.notice("")}return!0},ue=async(t,c,e,r)=>{const i=await P(t);if(i.length===0)return!0;f.info(""),f.info(`${c.map(n=>n.displayName).join(" + ")} security check:`);const o=await z(c,i);if(o.size===0)return f.info(" Could not fetch security data. Proceeding."),!0;const s=pe(o,e,r);return s.length===0?(f.info(""),!0):process.stdin.isTTY?fe(s,e):(f.warn(`Aborting: ${String(s.length)} package${s.length===1?"":"s"} below minimum score. Use --no-socket-check to skip.`),!1)},de=["dependencies","devDependencies","peerDependencies","optionalDependencies"],ge=t=>t.savePeer?"peerDependencies":t.saveOptional?"optionalDependencies":t.saveDev?"devDependencies":"dependencies",_=(t,c)=>t.startsWith("catalog:")||!c?t:t.replace(/^[\^~]/,""),me=async(t,c)=>{const e=[];for(const o of t){const{name:s,versionSpec:n}=D(o);if(!s)continue;if(n!==void 0){e.push({explicit:n,name:s});continue}const l=le(s,c);if(l){l.conflict&&f.warn(`${s}: ambiguous constraint — picking ${l.spec} (${l.source}). Pass ${s}@<version> to override.`),e.push({entry:{name:s,source:l.source,spec:l.spec},kind:"resolved",name:s});continue}e.push({kind:"missing",name:s})}const r=e.filter(o=>"kind"in o&&o.kind==="missing").map(o=>o.name),i=r.length>0?await Z(r):new Map;return e.map(o=>{if("explicit"in o)return{name:o.name,source:"explicit",spec:o.explicit};if(o.kind==="resolved")return o.entry;const s=i.get(o.name);if(s===void 0)throw new Error(`--to: cannot resolve a version for "${o.name}" (not in any catalog or sibling, and registry lookup failed). Pass ${o.name}@<version> explicitly.`);const n=`^${s}`;return f.info(`${o.name}: no existing constraint — using registry latest (${n}). Add to a catalog to share this version across workspace packages.`),{name:o.name,source:"registry latest",spec:n}})},he=(t,c,e,r)=>{for(const{name:i,spec:o}of c){const s=_(o,r);for(const l of de){if(l===e)continue;const a=t[l];a?.[i]!==void 0&&(delete a[i],Object.keys(a).length===0&&delete t[l])}let n=t[e];n===void 0&&(n={},t[e]=n),n[i]=s}},ke=async({ignoreScripts:t,logger:c,options:e,packages:r,pm:i,target:o,visConfig:s,workspaceRoot:n})=>{const{workspace:l}=U(n,s??{}),a=l.projects[o];if(!a){const m=Object.keys(l.projects).sort();throw new Error(`--to: workspace package "${o}" not found. Available: ${m.length>0?m.slice(0,10).join(", "):"(none)"}${m.length>10?`, ... (${String(m.length-10)} more)`:""}.`)}const u=L(n,a.root,"package.json"),{packageManager:p}=N(n),g=V(n,p),d=ge(e),k=e.exact??!1,h=await me(r,g);if(h.length===0)return 0;const $=ie(u);he($,h,d,k),B(u,$,{indent:H(u,{useEditorconfig:s?.editorconfig??!0}),overwrite:!0});for(const m of h){const E=_(m.spec,k);f.info(`${R("+")} ${m.name}@${E} → ${o}/${d} (${j(m.source)})`)}return Y(i,{dev:!1,filter:[],force:!1,frozenLockfile:!1,ignoreScripts:t,lockfileOnly:!1,noOptional:!1,offline:!1,prod:!1,recursive:!1,silent:!1,workspaceRoot:!1},n,c)},Ee=async({argument:t,logger:c,options:e,visConfig:r,workspaceRoot:i})=>{let o=t;if(!o||o.length===0)throw new Error("No packages specified. Usage: vis add <packages...>");if(e.typosquatCheck!==!1){const p=o.map(d=>D(d)),g=await re(p.map(d=>d.name),r?.security?.typosquatAllowlist);if(!g.ok){process.exitCode=1;return}o=p.map((d,k)=>{const h=g.packages[k];return h!==d.name?d.versionSpec?`${h}@${d.versionSpec}`:h??"":o[k]??""})}if(e.marshallCheck!==!1){const p=await P(o);if(p.length>0){const g=await Q(p,{config:r?.security?.marshalls,workspaceRoot:i});if(!await X(g)){process.exitCode=1;return}}}if(e.socketCheck!==!1){const p=new Set;b("socket")&&p.add("socket"),b("depsDev")&&p.add("deps-dev");const g=F(r?.security,{disabled:p,minimumScore:r?.security?.policies?.score?.minimum});if(g.length>0){const d=r?.security?.policies?.score?.minimum??ne;if(!await ue(o,g,d,r?.security?.acceptedRisks)){process.exitCode=1;return}}}const s=process.cwd(),n=G({logger:c,options:e,visConfig:r},i??s),l=J(i??s,{backend:K(n),configBackend:r?.install?.backend,configCorepack:r?.install?.corepack}),a=!e.runScripts;if(e.to){if(e.global||e.workspaceRoot)throw new Error("--to is incompatible with --global / --workspace-root.");if(e.filter&&S(e.filter).length>0)throw new Error("--to and --filter are mutually exclusive — --to already targets one package.");if(!i)throw new Error("--to requires a monorepo workspace. Run from inside a pnpm/bun/yarn/npm workspace.");const p=await ke({ignoreScripts:a,logger:c,options:e,packages:o,pm:l,target:e.to,visConfig:r,workspaceRoot:i});p!==0&&(process.exitCode=p);return}const u=W(l,{exact:e.exact||!1,filter:S(e.filter),global:e.global||!1,optional:e.saveOptional||!1,packages:o,peer:e.savePeer||!1,saveDev:e.saveDev||!1,workspace:e.workspace||!1,workspaceRoot:e.workspaceRoot||!1},s,c,{autoInstallPeers:e.autoInstallPeers||!1,ignoreScripts:a});u!==0&&(process.exitCode=u)};export{Ee as default};
@@ -1,4 +1,4 @@
1
- import{readLastRunSummary as k,getLastRunSummaryPath as g}from"@visulima/task-runner";import{p as m,l as S,r as x}from"./cli-main.js";import{c as h,d as p}from"../packem_shared/env-Ct3hMEYB.js";const I=new Set(["json","table"]),v=(t,a)=>t??a,c=t=>t===void 0?"-":t<1e3?`${String(t)}ms`:`${(t/1e3).toFixed(2)}s`,$=t=>t.exitCode===void 0?t.cacheStatus:t.exitCode===0?t.cacheStatus==="MISS"?"OK":t.cacheStatus:`FAIL(${String(t.exitCode)})`,r=(t,a)=>t.length>=a?t:t+" ".repeat(a-t.length),w=t=>t.exitCode!==void 0&&t.exitCode!==0,l=(t,a)=>{a.info(`Run ${t.id}`),a.info(` start: ${t.startTime}`),a.info(` end: ${t.endTime}`),a.info(` duration: ${c(t.duration)}`),a.info(` totals: ${String(t.stats.total)} total · ${String(t.stats.succeeded)} ok · ${String(t.stats.cached)} cached · ${String(t.stats.skipped)} skipped · ${String(t.stats.failed)} failed`),a.info(` env: node ${t.environment.nodeVersion} · ${t.environment.platform}/${t.environment.arch}`),a.info("")},y=(t,a)=>{if(t.length===0){a.info("(no tasks match the current filter)");return}const e=t.map(s=>({duration:c(s.duration),hash:s.hash?s.hash.slice(0,12):"-",status:$(s),taskId:s.taskId})),i={duration:Math.max(8,...e.map(s=>s.duration.length)),hash:Math.max(4,...e.map(s=>s.hash.length)),status:Math.max(6,...e.map(s=>s.status.length)),taskId:Math.max(4,...e.map(s=>s.taskId.length))};a.info(` ${r("task",i.taskId)} ${r("status",i.status)} ${r("duration",i.duration)} ${r("hash",i.hash)}`),a.info(` ${"-".repeat(i.taskId)} ${"-".repeat(i.status)} ${"-".repeat(i.duration)} ${"-".repeat(i.hash)}`);for(const s of e)a.info(` ${r(s.taskId,i.taskId)} ${r(s.status,i.status)} ${r(s.duration,i.duration)} ${r(s.hash,i.hash)}`)},C=(t,a,e)=>{l(t,e),e.info(`Task ${a.taskId}`),e.info(` status: ${$(a)}`),e.info(` cache: ${a.cacheStatus}`),e.info(` duration: ${c(a.duration)}`),e.info(` exit: ${a.exitCode===void 0?"-":String(a.exitCode)}`),e.info(` hash: ${a.hash??"(none)"}`),e.info(` start: ${a.startTime??"-"}`),e.info(` end: ${a.endTime??"-"}`),a.dependencies.length>0&&e.info(` deps: ${a.dependencies.join(", ")}`),e.info(""),m.info(`Drill into hash inputs with: vis cache why ${a.taskId} --run ${t.id}`)},R=t=>{process.stdout.write(`${JSON.stringify(t.map(a=>({id:a.id,mtime:new Date(a.mtimeMs).toISOString(),path:a.path})),void 0,2)}
1
+ import{readLastRunSummary as k,getLastRunSummaryPath as g}from"@visulima/task-runner";import{p as m,l as S,r as x}from"./cli-main.js";import{c as h,d as p}from"../packem_shared/env-DJlbJiFh.js";const I=new Set(["json","table"]),v=(t,a)=>t??a,c=t=>t===void 0?"-":t<1e3?`${String(t)}ms`:`${(t/1e3).toFixed(2)}s`,$=t=>t.exitCode===void 0?t.cacheStatus:t.exitCode===0?t.cacheStatus==="MISS"?"OK":t.cacheStatus:`FAIL(${String(t.exitCode)})`,r=(t,a)=>t.length>=a?t:t+" ".repeat(a-t.length),w=t=>t.exitCode!==void 0&&t.exitCode!==0,l=(t,a)=>{a.info(`Run ${t.id}`),a.info(` start: ${t.startTime}`),a.info(` end: ${t.endTime}`),a.info(` duration: ${c(t.duration)}`),a.info(` totals: ${String(t.stats.total)} total · ${String(t.stats.succeeded)} ok · ${String(t.stats.cached)} cached · ${String(t.stats.skipped)} skipped · ${String(t.stats.failed)} failed`),a.info(` env: node ${t.environment.nodeVersion} · ${t.environment.platform}/${t.environment.arch}`),a.info("")},y=(t,a)=>{if(t.length===0){a.info("(no tasks match the current filter)");return}const e=t.map(s=>({duration:c(s.duration),hash:s.hash?s.hash.slice(0,12):"-",status:$(s),taskId:s.taskId})),i={duration:Math.max(8,...e.map(s=>s.duration.length)),hash:Math.max(4,...e.map(s=>s.hash.length)),status:Math.max(6,...e.map(s=>s.status.length)),taskId:Math.max(4,...e.map(s=>s.taskId.length))};a.info(` ${r("task",i.taskId)} ${r("status",i.status)} ${r("duration",i.duration)} ${r("hash",i.hash)}`),a.info(` ${"-".repeat(i.taskId)} ${"-".repeat(i.status)} ${"-".repeat(i.duration)} ${"-".repeat(i.hash)}`);for(const s of e)a.info(` ${r(s.taskId,i.taskId)} ${r(s.status,i.status)} ${r(s.duration,i.duration)} ${r(s.hash,i.hash)}`)},C=(t,a,e)=>{l(t,e),e.info(`Task ${a.taskId}`),e.info(` status: ${$(a)}`),e.info(` cache: ${a.cacheStatus}`),e.info(` duration: ${c(a.duration)}`),e.info(` exit: ${a.exitCode===void 0?"-":String(a.exitCode)}`),e.info(` hash: ${a.hash??"(none)"}`),e.info(` start: ${a.startTime??"-"}`),e.info(` end: ${a.endTime??"-"}`),a.dependencies.length>0&&e.info(` deps: ${a.dependencies.join(", ")}`),e.info(""),m.info(`Drill into hash inputs with: vis cache why ${a.taskId} --run ${t.id}`)},R=t=>{process.stdout.write(`${JSON.stringify(t.map(a=>({id:a.id,mtime:new Date(a.mtimeMs).toISOString(),path:a.path})),void 0,2)}
2
2
  `)},T=(t,a,e)=>{if(t.length===0){m.info(`No recorded runs found in ${p(a)}/. Run with --summarize to record a run.`);return}const i={id:Math.max(2,...t.map(s=>s.id.length)),mtime:24};e.info(` ${r("id",i.id)} ${r("mtime",i.mtime)}`),e.info(` ${"-".repeat(i.id)} ${"-".repeat(i.mtime)}`);for(const s of t)e.info(` ${r(s.id,i.id)} ${new Date(s.mtimeMs).toISOString()}`)},D=(t,a)=>{let{tasks:e}=t;return a.task!==void 0&&(e=e.filter(i=>i.taskId===a.task)),a.failed&&(e=e.filter(i=>w(i))),e},M=async(t,a)=>{const{failed:e,format:i,runId:s,task:o,workspaceRoot:d}=t,n=s===void 0?await k(d,{dataDirectory:h(d)}):await x(d,s);if(!n){if(i==="json"){process.stdout.write(`${JSON.stringify({error:"no-summary",runId:s??null},void 0,2)}
3
3
  `),process.exitCode=1;return}s===void 0?m.error(`No previous run summary found. Run a task first to populate \`${g(d,{dataDirectory:h(d)})}\`.`):m.error(`Run summary "${s}" not found in ${p(d)}/.`),process.exitCode=1;return}const f=D(n,{failed:e,task:o});if(o!==void 0&&f.length===0){if(i==="json"){process.stdout.write(`${JSON.stringify({error:"task-not-in-summary",runId:n.id,taskId:o},void 0,2)}
4
4
  `),process.exitCode=1;return}m.error(`Task "${o}" was not part of run ${n.id}.`),process.exitCode=1;return}if(n.stats.failed>0&&(process.exitCode=1),i==="json"){process.stdout.write(`${JSON.stringify({duration:n.duration,endTime:n.endTime,environment:n.environment,runId:n.id,startTime:n.startTime,stats:n.stats,tasks:f.map(u=>({cacheStatus:u.cacheStatus,dependencies:u.dependencies,duration:u.duration,endTime:u.endTime,exitCode:u.exitCode,hash:u.hash??null,startTime:u.startTime,taskId:u.taskId}))},void 0,2)}
@@ -1,2 +1,2 @@
1
- import{B as k,a as B,H as g}from"../packem_shared/index-CE6MsgcV.js";import{b as h,O as j}from"./catalog.js";import{p}from"./cli-main.js";import{b as v,s as y}from"../packem_shared/cyclonedx-BeUmPgfO.js";const l=["json","xml"],C=n=>l.includes(n),F=async({fs:n,options:e,visConfig:f,workspaceRoot:o})=>{if(!o)throw new Error("Could not determine workspace root. Run inside a monorepo.");const{packageJsons:d,workspace:i}=h(o,f),u=j(o,i,d),c=e.focus,w=c?c.split(",").map(b=>b.trim()).filter(Boolean):void 0,s=(e.format??"json").toLowerCase();if(!C(s))throw new Error(`Unknown --format: "${s}". Expected one of: ${l.join(", ")}.`);const t=v({focus:w,includeDev:!!e.includeDev,projectGraph:u,workspace:i,workspaceRoot:o}),a=s==="xml"?y(t):`${JSON.stringify(t,void 0,2)}
1
+ import{B as k,a as B,H as g}from"../packem_shared/index-CE6MsgcV.js";import{b as h,O as j}from"./catalog.js";import{p}from"./cli-main.js";import{b as v,s as y}from"../packem_shared/cyclonedx-CmrYQ0vx.js";const l=["json","xml"],C=n=>l.includes(n),F=async({fs:n,options:e,visConfig:f,workspaceRoot:o})=>{if(!o)throw new Error("Could not determine workspace root. Run inside a monorepo.");const{packageJsons:d,workspace:i}=h(o,f),u=j(o,i,d),c=e.focus,w=c?c.split(",").map(b=>b.trim()).filter(Boolean):void 0,s=(e.format??"json").toLowerCase();if(!C(s))throw new Error(`Unknown --format: "${s}". Expected one of: ${l.join(", ")}.`);const t=v({focus:w,includeDev:!!e.includeDev,projectGraph:u,workspace:i,workspaceRoot:o}),a=s==="xml"?y(t):`${JSON.stringify(t,void 0,2)}
2
2
  `,m=e.output??(s==="xml"?"sbom.cdx.xml":"sbom.cdx.json");if(m==="-"){process.stdout.write(a);return}const r=k(o,m);B(g(r)),await n.writeFile(r,a,"utf8");const x=t.components?.length??0,$=t.dependencies?.length??0;p.success(`SBOM written to ${r}`),p.notice(`${x} components, ${$} dependency edges`)};export{F as default};
@@ -1,2 +1,2 @@
1
- import{createRequire as M}from"node:module";import{b as _}from"../packem_shared/index-CE6MsgcV.js";import{C as N,b as I}from"./catalog.js";import{p as c,f as A}from"./cli-main.js";import{p as H,i as E,r as v,s as R,a as C,S as U,b as D,c as P,d as z,e as G}from"../packem_shared/lifecycle-CHcFuWf_.js";import{r as L,l as q}from"../packem_shared/target-options-CR0OuYJr.js";const j=M(import.meta.url),w=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,F=s=>{if(typeof w<"u"&&w.versions&&w.versions.node){const[e,r]=w.versions.node.split(".").map(Number);if(e>22||e===22&&r>=3||e===20&&r>=16)return w.getBuiltinModule(s)}return j(s)},{open:S,stat:k,watch:T}=F("node:fs/promises"),$=async s=>{const e=s?.plugins;if(!e||e.length===0)return;const r=z();return await G(r,e),{callHook:async(d,...o)=>{try{await r.callHook(d,...o)}catch(t){const n=t instanceof Error?t.message:String(t);c.warn(`Plugin error in ${d}: ${n}`)}}}},B=s=>{const e=s.trim(),r=e.lastIndexOf(":");if(!(r<=0||r===e.length-1))return{project:e.slice(0,r),target:e.slice(r+1)}},b=async(s,e,r)=>{const d=B(r);if(!d){c.error(`Invalid target id "${r}". Expected "<project>:<target>", e.g. "@my/api:db".`);return}const o=await N(s),{projectOptions:t,workspace:n}=I(s,e,o),i=n.projects[d.project],a=t.get(d.project)?.[d.target];if(!i||!a){c.error(`Target "${r}" not found in this workspace.`);return}const p=a.options?.service;if(!p){c.error(`Target "${r}" is not a service. Add an \`options.service\` block to make it eligible for \`vis service\`.`);return}if(!a.command){c.error(`Target "${r}" has no command — services must be runnable.`);return}const u=L(s,i.root,a.options?.runFromWorkspaceRoot===!0),f=a.options?.envFile?q(u,a.options.envFile):{};return{command:a.command,cwd:u,env:{...f,...p.env},service:p,target:a,targetId:r}},m=s=>{if(!s)throw new Error("Could not determine workspace root. Run `vis service` inside a workspace.");return s},te=async({argument:s,options:e,visConfig:r,workspaceRoot:d})=>{const o=m(d),t=s[0]?.trim();if(!t){c.error("Missing target id. Usage: vis service start <project>:<target>"),process.exitCode=1;return}const n=await b(o,r,t);if(!n){process.exitCode=1;return}try{const{entry:i}=await C({command:n.command,config:n.service,cwd:n.cwd,env:n.env,id:t,readinessTimeoutMs:e.timeout,skipReadiness:e.readiness===!1,workspaceRoot:o});await(await $(r))?.callHook("service:start",i),c.success(`Started ${t} (pid ${String(i.pid)})`),c.info(` log: ${i.logFile}`)}catch(i){const a=i instanceof Error?i.message:String(i);i instanceof U?c.error(`Readiness probe failed for ${t}: ${a}`):c.error(`Failed to start ${t}: ${a}`),process.exitCode=1}},y=async({graceMs:s,hookSink:e,id:r,workspaceRoot:d})=>{const o=await v(d,r),{stopped:t}=await R({graceMs:s,id:r,workspaceRoot:d});return t?(o&&await e?.callHook("service:stop",o),c.success(`Stopped ${r}`),!0):(c.info(`No running service registered for ${r}`),!1)},re=async({argument:s,options:e,visConfig:r,workspaceRoot:d})=>{const o=m(d),{graceMs:t}=e,n=s[0]?.trim(),i=await $(r);if(e.all===!0){if(n){c.error("Cannot combine --all with a target id. Use one or the other."),process.exitCode=1;return}const a=await P(o);if(a.length===0){c.info("No running services registered for this workspace.");return}for(const p of a)await y({graceMs:t,hookSink:i,id:p.id,workspaceRoot:o});return}if(!n){c.error("Missing target id. Usage: vis service stop <project>:<target> | --all"),process.exitCode=1;return}await y({graceMs:t,hookSink:i,id:n,workspaceRoot:o})||(process.exitCode=1)},O=s=>{const e=s.config.readiness?.tcp.port??s.config.port;return e===void 0?"—":String(e)},x=new Set(["json","table"]),oe=async({logger:s,options:e,workspaceRoot:r})=>{const d=m(r),o=e.format??"table";if(!x.has(o)){c.error(`Invalid --format "${o}". Expected one of: ${[...x].sort().join(", ")}.`),process.exitCode=1;return}const{surviving:t}=await H(d);if(o==="json"){const l=Date.now();process.stdout.write(`${JSON.stringify(t.map(g=>{const h=Date.parse(g.startedAt);return{ageMs:Number.isFinite(h)?l-h:null,alive:E(g.pid),command:g.command,cwd:g.cwd,env:g.env,id:g.id,logFile:g.logFile,pid:g.pid,port:g.config.readiness?.tcp.port??g.config.port??null,startedAt:g.startedAt,visVersion:g.visVersion}}),void 0,2)}
1
+ import{createRequire as M}from"node:module";import{b as _}from"../packem_shared/index-CE6MsgcV.js";import{C as N,b as I}from"./catalog.js";import{p as c,f as A}from"./cli-main.js";import{p as H,i as E,r as v,s as R,a as C,S as U,b as D,c as P,d as z,e as G}from"../packem_shared/lifecycle-XeMei1ED.js";import{r as L,l as q}from"../packem_shared/target-options-CR0OuYJr.js";const j=M(import.meta.url),w=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,F=s=>{if(typeof w<"u"&&w.versions&&w.versions.node){const[e,r]=w.versions.node.split(".").map(Number);if(e>22||e===22&&r>=3||e===20&&r>=16)return w.getBuiltinModule(s)}return j(s)},{open:S,stat:k,watch:T}=F("node:fs/promises"),$=async s=>{const e=s?.plugins;if(!e||e.length===0)return;const r=z();return await G(r,e),{callHook:async(d,...o)=>{try{await r.callHook(d,...o)}catch(t){const n=t instanceof Error?t.message:String(t);c.warn(`Plugin error in ${d}: ${n}`)}}}},B=s=>{const e=s.trim(),r=e.lastIndexOf(":");if(!(r<=0||r===e.length-1))return{project:e.slice(0,r),target:e.slice(r+1)}},b=async(s,e,r)=>{const d=B(r);if(!d){c.error(`Invalid target id "${r}". Expected "<project>:<target>", e.g. "@my/api:db".`);return}const o=await N(s),{projectOptions:t,workspace:n}=I(s,e,o),i=n.projects[d.project],a=t.get(d.project)?.[d.target];if(!i||!a){c.error(`Target "${r}" not found in this workspace.`);return}const p=a.options?.service;if(!p){c.error(`Target "${r}" is not a service. Add an \`options.service\` block to make it eligible for \`vis service\`.`);return}if(!a.command){c.error(`Target "${r}" has no command — services must be runnable.`);return}const u=L(s,i.root,a.options?.runFromWorkspaceRoot===!0),f=a.options?.envFile?q(u,a.options.envFile):{};return{command:a.command,cwd:u,env:{...f,...p.env},service:p,target:a,targetId:r}},m=s=>{if(!s)throw new Error("Could not determine workspace root. Run `vis service` inside a workspace.");return s},te=async({argument:s,options:e,visConfig:r,workspaceRoot:d})=>{const o=m(d),t=s[0]?.trim();if(!t){c.error("Missing target id. Usage: vis service start <project>:<target>"),process.exitCode=1;return}const n=await b(o,r,t);if(!n){process.exitCode=1;return}try{const{entry:i}=await C({command:n.command,config:n.service,cwd:n.cwd,env:n.env,id:t,readinessTimeoutMs:e.timeout,skipReadiness:e.readiness===!1,workspaceRoot:o});await(await $(r))?.callHook("service:start",i),c.success(`Started ${t} (pid ${String(i.pid)})`),c.info(` log: ${i.logFile}`)}catch(i){const a=i instanceof Error?i.message:String(i);i instanceof U?c.error(`Readiness probe failed for ${t}: ${a}`):c.error(`Failed to start ${t}: ${a}`),process.exitCode=1}},y=async({graceMs:s,hookSink:e,id:r,workspaceRoot:d})=>{const o=await v(d,r),{stopped:t}=await R({graceMs:s,id:r,workspaceRoot:d});return t?(o&&await e?.callHook("service:stop",o),c.success(`Stopped ${r}`),!0):(c.info(`No running service registered for ${r}`),!1)},re=async({argument:s,options:e,visConfig:r,workspaceRoot:d})=>{const o=m(d),{graceMs:t}=e,n=s[0]?.trim(),i=await $(r);if(e.all===!0){if(n){c.error("Cannot combine --all with a target id. Use one or the other."),process.exitCode=1;return}const a=await P(o);if(a.length===0){c.info("No running services registered for this workspace.");return}for(const p of a)await y({graceMs:t,hookSink:i,id:p.id,workspaceRoot:o});return}if(!n){c.error("Missing target id. Usage: vis service stop <project>:<target> | --all"),process.exitCode=1;return}await y({graceMs:t,hookSink:i,id:n,workspaceRoot:o})||(process.exitCode=1)},O=s=>{const e=s.config.readiness?.tcp.port??s.config.port;return e===void 0?"—":String(e)},x=new Set(["json","table"]),oe=async({logger:s,options:e,workspaceRoot:r})=>{const d=m(r),o=e.format??"table";if(!x.has(o)){c.error(`Invalid --format "${o}". Expected one of: ${[...x].sort().join(", ")}.`),process.exitCode=1;return}const{surviving:t}=await H(d);if(o==="json"){const l=Date.now();process.stdout.write(`${JSON.stringify(t.map(g=>{const h=Date.parse(g.startedAt);return{ageMs:Number.isFinite(h)?l-h:null,alive:E(g.pid),command:g.command,cwd:g.cwd,env:g.env,id:g.id,logFile:g.logFile,pid:g.pid,port:g.config.readiness?.tcp.port??g.config.port??null,startedAt:g.startedAt,visVersion:g.visVersion}}),void 0,2)}
2
2
  `);return}if(t.length===0){c.info("No running services registered for this workspace.");return}const n=Date.now(),i=t.map(l=>{const g=Date.parse(l.startedAt);return{age:Number.isFinite(g)?A(g,n):"?",id:l.id,log:l.logFile,pid:String(l.pid),port:O(l)}}),a=Math.max(2,...i.map(l=>l.id.length)),p=Math.max(3,...i.map(l=>l.pid.length)),u=Math.max(4,...i.map(l=>l.port.length)),f=Math.max(3,...i.map(l=>l.age.length));s.info(` ${"id".padEnd(a)} ${"pid".padEnd(p)} ${"port".padEnd(u)} ${"age".padEnd(f)} log`),s.info(` ${"-".repeat(a)} ${"-".repeat(p)} ${"-".repeat(u)} ${"-".repeat(f)} ---`);for(const l of i)s.info(` ${l.id.padEnd(a)} ${l.pid.padEnd(p)} ${l.port.padEnd(u)} ${l.age.padEnd(f)} ${l.log}`)},se=async({argument:s,options:e,workspaceRoot:r})=>{const d=m(r),o=s[0]?.trim();if(!o){c.error("Missing target id. Usage: vis service status <project>:<target>"),process.exitCode=1;return}const t=await v(d,o);if(!t){c.error(`No service registered for ${o}.`),process.exitCode=1;return}if(!E(t.pid)){c.error(`Service ${o} is not running (pid ${String(t.pid)} is dead). Run \`vis service start ${o}\` to recover.`),process.exitCode=1;return}try{await D(t.config,{timeoutMs:e.timeout}),c.success(`${o} healthy (pid ${String(t.pid)})`)}catch(n){const i=n instanceof Error?n.message:String(n);c.error(`${o} probe failed: ${i}`),process.exitCode=1}},ie=async({argument:s,options:e,visConfig:r,workspaceRoot:d})=>{const o=m(d),t=s[0]?.trim();if(!t){c.error("Missing target id. Usage: vis service restart <project>:<target>"),process.exitCode=1;return}const n=await $(r),i=await v(o,t);(await R({graceMs:e.graceMs,id:t,workspaceRoot:o})).stopped&&i&&await n?.callHook("service:stop",i);const a=await b(o,r,t);if(!a){process.exitCode=1;return}try{const{entry:p}=await C({command:a.command,config:a.service,cwd:a.cwd,env:a.env,id:t,readinessTimeoutMs:e.timeout,skipReadiness:e.readiness===!1,workspaceRoot:o});await n?.callHook("service:start",p),c.success(`Restarted ${t} (pid ${String(p.pid)})`)}catch(p){const u=p instanceof Error?p.message:String(p);c.error(`Failed to restart ${t}: ${u}`),process.exitCode=1}},V=200,W=1024*1024,J=async s=>{let e=0;try{e=(await k(s)).size}catch{e=0}const r=new AbortController;let d=!1;const o=()=>{d=!0,r.abort()},t=()=>{r.abort()};process.on("SIGINT",o),process.on("SIGTERM",t);let n=!1;const i=async()=>{if(!n){n=!0;try{const a=await k(s).catch(()=>{});if(!a||(a.size<e&&(e=0),a.size===e))return;const p=a.size-e,u=Math.min(p,W),f=await S(s,"r");try{const l=Buffer.alloc(u);await f.read(l,0,u,e),process.stdout.write(l),e+=u}finally{await f.close().catch(()=>{})}}finally{n=!1}}};try{const a=(async()=>{try{const p=T(s,{signal:r.signal});for(;!(await p.next()).done;)await i()}catch{}})();for(;!r.signal.aborted;)await i(),await new Promise(p=>{const u=setTimeout(p,V);r.signal.addEventListener("abort",()=>{clearTimeout(u),p()},{once:!0})});await a.catch(()=>{}),await i().catch(()=>{})}finally{process.off("SIGINT",o),process.off("SIGTERM",t)}d&&(process.exitCode=130)},ae=async({argument:s,options:e,workspaceRoot:r})=>{const d=m(r),o=s[0]?.trim();if(!o){c.error("Missing target id. Usage: vis service logs <project>:<target>"),process.exitCode=1;return}const t=await v(d,o);if(!t){c.error(`No service registered for ${o}.`),process.exitCode=1;return}if(!await _(t.logFile)){c.warn(`Log file is missing for ${o}: ${t.logFile}`),process.exitCode=1;return}if(e.follow===!0){await J(t.logFile);return}const n=await S(t.logFile,"r");try{const i=n.createReadStream();await new Promise((a,p)=>{i.on("end",a),i.on("error",p),i.pipe(process.stdout,{end:!1})})}finally{await n.close().catch(()=>{})}};export{oe as serviceListExecute,ae as serviceLogsExecute,ie as serviceRestartExecute,te as serviceStartExecute,se as serviceStatusExecute,re as serviceStopExecute};
@@ -1 +1 @@
1
- import{E as C,I as a,s as j,V as S}from"../packem_shared/index.server-J83sowC4.js";import{f as R,m as V}from"../packem_shared/index-CE6MsgcV.js";import{enforceProjectConstraints as v}from"@visulima/task-runner";import{b as x,O as F}from"./catalog.js";import{b as I}from"./cli-main.js";import{c as T}from"../packem_shared/runtime-check-BXehSP06.js";import{d as z}from"../packem_shared/env-Ct3hMEYB.js";import{a as D}from"../packem_shared/readJsonSync-CvkZyKmL-ihoybKvs.js";const e=c=>c?a("✓"):S("✗"),P=async({fs:c,logger:t,options:O,visConfig:y,workspaceRoot:s})=>{if(!s)throw new Error("Could not determine workspace root.");const{config:h,packageJsons:w,workspace:f}=x(s,y),b=F(s,f,w),$=Object.keys(f.projects).length,k=new Set(Object.values(f.projects).flatMap(g=>Object.keys(g.targets??{}))).size,n=T(s);let o=0;h.constraints&&(o=v(b,h.constraints).length);const i=I(s,{minRuns:2});let r;const l=z(s);if(R(l)){const g=(await c.readdir(l)).filter(p=>p.endsWith(".json")).sort();let m=0,d=0;for(const p of g.slice(-20))try{const u=D(V(l,p));u.stats&&(m+=u.stats.total??0,d+=u.stats.cached??0)}catch{continue}m>0&&(r=`${(d/m*100).toFixed(0)}%`)}if(O.json){t.info(JSON.stringify({cacheHitRate:r??null,constraintViolations:o,flakyTasks:i.length,projects:$,runtimeIssues:n.length,targets:k},null,2));return}t.info(""),t.info(` ${C("VIS STATUS")}`),t.info(""),t.info(` ${e(!0)} ${String($)} projects · ${String(k)} unique targets`),t.info(` ${e(n.length===0)} Runtime: ${n.length===0?a("OK"):j(`${String(n.length)} issue(s)`)}`),t.info(` ${e(o===0)} Constraints: ${o===0?a("OK"):S(`${String(o)} violation(s)`)}`),t.info(` ${e(i.length===0)} Flaky tasks: ${i.length===0?a("none"):j(String(i.length))}`),r&&t.info(` ${e(!0)} Cache hit rate: ${r} (last 20 runs)`),t.info("")};export{P as default};
1
+ import{E as C,I as a,s as j,V as S}from"../packem_shared/index.server-J83sowC4.js";import{f as R,m as V}from"../packem_shared/index-CE6MsgcV.js";import{enforceProjectConstraints as v}from"@visulima/task-runner";import{b as x,O as F}from"./catalog.js";import{b as I}from"./cli-main.js";import{c as T}from"../packem_shared/runtime-check-qnrPTlma.js";import{d as z}from"../packem_shared/env-DJlbJiFh.js";import{a as D}from"../packem_shared/readJsonSync-DuMMeB3s-ihoybKvs.js";const e=c=>c?a("✓"):S("✗"),P=async({fs:c,logger:t,options:O,visConfig:y,workspaceRoot:s})=>{if(!s)throw new Error("Could not determine workspace root.");const{config:h,packageJsons:w,workspace:f}=x(s,y),b=F(s,f,w),$=Object.keys(f.projects).length,k=new Set(Object.values(f.projects).flatMap(g=>Object.keys(g.targets??{}))).size,n=T(s);let o=0;h.constraints&&(o=v(b,h.constraints).length);const i=I(s,{minRuns:2});let r;const l=z(s);if(R(l)){const g=(await c.readdir(l)).filter(p=>p.endsWith(".json")).sort();let m=0,d=0;for(const p of g.slice(-20))try{const u=D(V(l,p));u.stats&&(m+=u.stats.total??0,d+=u.stats.cached??0)}catch{continue}m>0&&(r=`${(d/m*100).toFixed(0)}%`)}if(O.json){t.info(JSON.stringify({cacheHitRate:r??null,constraintViolations:o,flakyTasks:i.length,projects:$,runtimeIssues:n.length,targets:k},null,2));return}t.info(""),t.info(` ${C("VIS STATUS")}`),t.info(""),t.info(` ${e(!0)} ${String($)} projects · ${String(k)} unique targets`),t.info(` ${e(n.length===0)} Runtime: ${n.length===0?a("OK"):j(`${String(n.length)} issue(s)`)}`),t.info(` ${e(o===0)} Constraints: ${o===0?a("OK"):S(`${String(o)} violation(s)`)}`),t.info(` ${e(i.length===0)} Flaky tasks: ${i.length===0?a("none"):j(String(i.length))}`),r&&t.info(` ${e(!0)} Cache hit rate: ${r} (last 20 runs)`),t.info("")};export{P as default};
@@ -1,4 +1,4 @@
1
- import{createRequire as M}from"node:module";import{E as d,I as F,V as I,s as U}from"../packem_shared/index.server-J83sowC4.js";import{m as A}from"../packem_shared/index-CE6MsgcV.js";import{p as t}from"./cli-main.js";import{p as N,g as C,S as w,w as b,b as S,a as W,f as k,c as E,d as B,u as y,e as q,h as H}from"../packem_shared/toolchain-C44mPKPu.js";const _=M(import.meta.url),$=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,T=e=>{if(typeof $<"u"&&$.versions&&$.versions.node){const[n,i]=$.versions.node.split(".").map(Number);if(n>22||n===22&&i>=3||n===20&&i>=16)return $.getBuiltinModule(e)}return _(e)},{spawnSync:P}=T("node:child_process"),x=["aube","bun","deno","go","node","npm","pnpm","python","ruby","rust","yarn"],O=e=>x.includes(e),v=e=>e?F("✓"):I("✗"),j=U("⚠"),V=e=>{if(e.installed){const n=e.version?` v${e.version}`:"",i=e.configFiles.length>0?` (${e.configFiles.join(", ")})`:"";return`${v(!0)} ${e.name}${n}${i}`}return`${j} ${e.name} — referenced by ${e.configFiles.join(", ")} but not installed`},D=e=>{if(e.matches)return"";const{manager:n}=e;return n.name==="none"?d("→ (no manager)"):n.name==="self-activate"?"":n.installed?d(`→ ${n.name}`):d(`→ ${n.name} (missing)`)},G=e=>e.matches?v(!0):e.actual?j:v(!1),J=e=>{if(t.info(""),t.info(d("── Toolchain ───────────────────────")),e.detected.length===0)t.info(` ${v(!1)} No version manager detected`),t.notice(` Install one of: ${w.join(", ")}`);else for(const n of e.detected)t.info(` ${V(n)}`);if(t.info(""),e.tools.length===0){t.info(` ${d("No tool pins found — add engines.node, .nvmrc, or a manager config file.")}`);return}t.info(d("── Tools ───────────────────────────"));for(const n of e.tools){const i=`${n.expected.tool} ${n.expected.version}`,a=n.actual?`actual ${n.actual}`:"not installed",c=n.matches?"":d(` [${n.expected.source}]`),o=D(n),g=o===""?"":` ${o}`;t.info(` ${G(n)} ${i} — ${a}${c}${g}`),n.manager.note&&t.notice(` ${n.manager.note}`)}},K=(e,n,i)=>{const a=C(e,n);if(i.json){process.stdout.write(`${JSON.stringify({detected:a.detected.map(o=>({binPath:o.binPath??null,configFiles:o.configFiles,installed:o.installed,name:o.name,version:o.version??null})),tools:a.tools.map(o=>({actual:o.actual??null,expected:o.expected.version,manager:o.manager.name,managerInstalled:o.manager.installed,matches:o.matches,note:o.manager.note??null,source:o.expected.source,tool:o.expected.tool}))},void 0,2)}
1
+ import{createRequire as M}from"node:module";import{E as d,I as F,V as I,s as U}from"../packem_shared/index.server-J83sowC4.js";import{m as A}from"../packem_shared/index-CE6MsgcV.js";import{p as t}from"./cli-main.js";import{p as N,g as C,S as w,w as b,b as S,a as W,f as k,c as E,d as B,u as y,e as q,h as H}from"../packem_shared/toolchain-Zb3VzZb4.js";const _=M(import.meta.url),$=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,T=e=>{if(typeof $<"u"&&$.versions&&$.versions.node){const[n,i]=$.versions.node.split(".").map(Number);if(n>22||n===22&&i>=3||n===20&&i>=16)return $.getBuiltinModule(e)}return _(e)},{spawnSync:P}=T("node:child_process"),x=["aube","bun","deno","go","node","npm","pnpm","python","ruby","rust","yarn"],O=e=>x.includes(e),v=e=>e?F("✓"):I("✗"),j=U("⚠"),V=e=>{if(e.installed){const n=e.version?` v${e.version}`:"",i=e.configFiles.length>0?` (${e.configFiles.join(", ")})`:"";return`${v(!0)} ${e.name}${n}${i}`}return`${j} ${e.name} — referenced by ${e.configFiles.join(", ")} but not installed`},D=e=>{if(e.matches)return"";const{manager:n}=e;return n.name==="none"?d("→ (no manager)"):n.name==="self-activate"?"":n.installed?d(`→ ${n.name}`):d(`→ ${n.name} (missing)`)},G=e=>e.matches?v(!0):e.actual?j:v(!1),J=e=>{if(t.info(""),t.info(d("── Toolchain ───────────────────────")),e.detected.length===0)t.info(` ${v(!1)} No version manager detected`),t.notice(` Install one of: ${w.join(", ")}`);else for(const n of e.detected)t.info(` ${V(n)}`);if(t.info(""),e.tools.length===0){t.info(` ${d("No tool pins found — add engines.node, .nvmrc, or a manager config file.")}`);return}t.info(d("── Tools ───────────────────────────"));for(const n of e.tools){const i=`${n.expected.tool} ${n.expected.version}`,a=n.actual?`actual ${n.actual}`:"not installed",c=n.matches?"":d(` [${n.expected.source}]`),o=D(n),g=o===""?"":` ${o}`;t.info(` ${G(n)} ${i} — ${a}${c}${g}`),n.manager.note&&t.notice(` ${n.manager.note}`)}},K=(e,n,i)=>{const a=C(e,n);if(i.json){process.stdout.write(`${JSON.stringify({detected:a.detected.map(o=>({binPath:o.binPath??null,configFiles:o.configFiles,installed:o.installed,name:o.name,version:o.version??null})),tools:a.tools.map(o=>({actual:o.actual??null,expected:o.expected.version,manager:o.manager.name,managerInstalled:o.manager.installed,matches:o.matches,note:o.manager.note??null,source:o.expected.source,tool:o.expected.tool}))},void 0,2)}
2
2
  `);return}J(a);const c=a.tools.filter(o=>!o.matches);c.length>0&&(t.info(""),t.notice(" Run `vis toolchain install` to install pinned versions.")),i.exitCode&&c.length>0&&(process.exitCode=1)},L=e=>{const n=new Map;for(const i of e){const a=n.get(i.manager.name);a?a.push(i):n.set(i.manager.name,[i])}return n},R=(e,n,i)=>P(e,n,{cwd:i,stdio:"inherit"}).status??1,z=(e,n,i)=>{const a=C(e,n),c=a.tools.filter(u=>!u.matches);if(c.length===0){t.success("Everything already matches — nothing to install.");return}const o=c.some(u=>u.manager.name!=="self-activate"&&u.manager.name!=="none");if(a.detected.length===0&&o){t.error(`No version manager detected. Install one of: ${w.join(", ")}.`),process.exitCode=1;return}const g=L(c);let l=!1,r=0;for(const[u,f]of g){if(u==="self-activate"){for(const{expected:s}of f){if(s.source==="packageManager")t.info(`${d("$")} (${s.tool} will self-activate from packageManager on next invocation)`);else if(t.info(`${d("$")} Writing packageManager=${s.tool}@${s.version}`),i.dryRun)l=!0;else try{b(e,s),l=!0}catch(h){t.error(h.message),r=1}t.notice(` ${s.tool} ${s.version} — no install needed`)}continue}if(u==="none"){for(const{expected:s}of f)t.warn(`Cannot install ${s.tool} ${s.version} — no manager can handle it.`);r=1;continue}if(!a.detected.find(s=>s.name===u)?.installed){t.error(`${u} is referenced but not on PATH — install it first, then rerun \`vis toolchain install\`.`),r=1;continue}const m=f.map(s=>S(u,s.expected)).filter(Boolean);for(const s of m){if(!s)continue;if(s.bin==="nvm"&&s.args.length===0){t.error("nvm is a shell function — run `nvm install` in your shell, then rerun `vis toolchain install`."),s.hint&&t.notice(` ${s.hint}`),r=1;continue}if(t.info(`${d("$")} ${s.bin} ${s.args.join(" ")}`),s.hint&&t.notice(` ${s.hint}`),i.dryRun){l=!0;continue}const h=R(s.bin,s.args,e);if(l=!0,h!==0){r=h;break}}}if(r!==0){process.exitCode=r;return}l&&t.success("Toolchain installed.")},Q=async(e,n,i,a,c)=>{if(!a)throw new Error("Usage: vis toolchain use <tool>@<version> (e.g. vis toolchain use node@22.13.0)");const o=W(a);if(!o)throw new Error(`Could not parse "${a}". Expected "<tool>@<version>" where <tool> is one of ${x.join(", ")}.`);const g=k(n),l=E(o,g,i);if(l.name==="none"){t.error(`No manager can pin ${o.tool}. Install one of: ${w.join(", ")}.`),process.exitCode=1;return}if(!l.installed){t.error(`The best manager for ${o.tool} (${l.name}) is not on PATH. ${l.note??""}`),process.exitCode=1;return}const r=B(l.name,o);if(!r){t.error(`${l.name} cannot pin ${o.tool}. Use a different manager, or set \`toolchain.tools.${o.tool}\` in vis.config.ts.`),process.exitCode=1;return}if(l.name==="self-activate"){if(t.info(`${d("→")} Writing packageManager field to package.json...`),c.dryRun){t.notice(` Would set packageManager: "${o.tool}@${o.version}"`);return}try{const f=b(n,o);if(!f){t.error(`Refusing to pin non-package-manager tool ${o.tool} via the packageManager field.`),process.exitCode=1;return}if(t.success(`Set packageManager: "${f}" — ${o.tool} will activate this version on next invocation.`),c.engines!==!1){const m=y(n,o);m&&t.success(`Updated package.json engines.${o.tool} → ${m}.`)}}catch(f){t.error(f.message),process.exitCode=1}return}if(r.args.length===0&&l.name==="nvm"&&o.tool==="node"){const f=A(n,".nvmrc");if(t.info(`${d("→")} Writing ${f}...`),c.dryRun){t.notice(` Would write ${o.version} to .nvmrc`);return}try{await e.writeFile(f,`${o.version}
3
3
  `)}catch(m){t.error(`Failed to write .nvmrc: ${m.message}`),process.exitCode=1;return}t.success(`Wrote ${o.version} to .nvmrc.`),t.notice(" nvm is a shell function — run `nvm use` to activate it in this shell.");return}if(r.args.length===0){t.error(`${l.name} cannot pin ${o.tool} from a subprocess. ${r.configChange?.hint??""}`),r.configChange&&t.notice(` Edit ${r.configChange.file} by hand and rerun \`vis toolchain status\` to verify.`),process.exitCode=1;return}if(t.info(`${d("$")} ${r.bin} ${r.args.join(" ")}`),r.configChange&&t.notice(` Will update ${r.configChange.file} — ${r.configChange.hint}`),c.dryRun)return;const u=R(r.bin,r.args,n);if(u!==0){process.exitCode=u;return}if(t.success(`Pinned ${o.tool} to ${o.version}.`),c.engines!==!1)try{const f=y(n,o);f&&t.success(`Updated package.json engines.${o.tool} → ${f}.`)}catch(f){t.warn(`Could not update engines.${o.tool}: ${f.message}`)}},X=(e,n,i)=>{if(!i)throw new Error("Usage: vis toolchain which <tool> (e.g. vis toolchain which node)");const a=i.toLowerCase();if(!O(a))throw new Error(`Unknown tool "${i}". Known: ${x.join(", ")}.`);const c=k(e),o=E({source:"vis.config.ts",tool:a,version:"*"},c,n),g=o.installed&&o.name!=="self-activate"&&o.name!=="none"?c.find(r=>r.name===o.name):void 0,l=g?q(g,a):H(a);if(!l){t.error(`${i} not found in PATH${g?` or via ${g.name}`:""}.`),process.exitCode=1;return}process.stdout.write(`${l}
4
4
  `)},Y=(e,n)=>{const i=N(e,n);process.stdout.write(`${i.name}
@@ -1,3 +1,3 @@
1
- import{createRequire as u}from"node:module";import{c as p}from"../packem_shared/index-XAb0QGqA.js";const f=u(import.meta.url),r=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,a=s=>{if(typeof r<"u"&&r.versions&&r.versions.node){const[e,i]=r.versions.node.split(".").map(Number);if(e>22||e===22&&i>=3||e===20&&i>=16)return r.getBuiltinModule(s)}return f(s)},{execSync:d,spawnSync:l}=a("node:child_process"),v=async({argument:s,logger:e,options:i})=>{const t=s?.[0];e.info("info: checking for updates...");const n=p.version;let o;try{const c=d("npm view @visulima/vis version",{encoding:"utf8"}).trim();o=t??c}catch{throw new Error("Failed to query npm registry. Check your network connection.")}if(n===o&&!i.force){e.info(`
1
+ import{createRequire as u}from"node:module";import{c as p}from"../packem_shared/index-C6tpgeIV.js";const f=u(import.meta.url),r=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,a=s=>{if(typeof r<"u"&&r.versions&&r.versions.node){const[e,i]=r.versions.node.split(".").map(Number);if(e>22||e===22&&i>=3||e===20&&i>=16)return r.getBuiltinModule(s)}return f(s)},{execSync:d,spawnSync:l}=a("node:child_process"),v=async({argument:s,logger:e,options:i})=>{const t=s?.[0];e.info("info: checking for updates...");const n=p.version;let o;try{const c=d("npm view @visulima/vis version",{encoding:"utf8"}).trim();o=t??c}catch{throw new Error("Failed to query npm registry. Check your network connection.")}if(n===o&&!i.force){e.info(`
2
2
  ✓ Already up to date (${n})`);return}if(i.check){n===o?e.info(`✓ Already up to date (${n})`):e.info(`info: found @visulima/vis@${o} (current: ${n})`);return}if(e.info(`info: found @visulima/vis@${o} (current: ${n})`),e.info("info: installing..."),l("npm",["install","-g",`@visulima/vis@${o}`],{encoding:"utf8",stdio:"inherit"}).status!==0)throw new Error("Failed to update. Try running with sudo or fix npm permissions.");e.info(`
3
3
  ✓ Updated @visulima/vis from ${n} → ${o}`)};export{v as default};
@@ -1,2 +1,2 @@
1
- import{releaseChangelog as l}from"../packem_shared/ReleaseClient-YHzBIxYS.js";const c=async({logger:o,options:t,workspaceRoot:r})=>{const s=r??process.cwd(),i=t.filter?t.filter.split(",").map(e=>e.trim()).filter(Boolean):void 0,n=await l({channel:t.channel,cwd:s,projects:i});if(t.json){process.stdout.write(`${JSON.stringify(n,null,2)}
1
+ import{releaseChangelog as l}from"../packem_shared/ReleaseClient-BY4OZNCK.js";const c=async({logger:o,options:t,workspaceRoot:r})=>{const s=r??process.cwd(),i=t.filter?t.filter.split(",").map(e=>e.trim()).filter(Boolean):void 0,n=await l({channel:t.channel,cwd:s,projects:i});if(t.json){process.stdout.write(`${JSON.stringify(n,null,2)}
2
2
  `),n.projectChangelogs.length===0&&(process.exitCode=1);return}if(n.projectChangelogs.length===0){o.info("No pending releases — no changelog entries to render."),process.exitCode=1;return}for(const e of n.projectChangelogs)o.info(`# ${e.package} → ${e.file}`),o.info(""),o.info(e.content),o.info("")};export{c as default};
@@ -1,4 +1,4 @@
1
- import{P as N}from"./cli-main.js";import"../packem_shared/index-CE6MsgcV.js";import"../packem_shared/public-api-WqUCiyIe.js";import{K as C,Z as P,W as T}from"../packem_shared/ai-analysis-rC48NLfB.js";import{R as I,T as j,a as h,N as q,c as x,f as z,q as A,I as F}from"./catalog.js";const M=/^[\^~>=<]+/,V=async({argument:v,logger:n,options:c,visConfig:l,workspaceRoot:f})=>{if(!f)throw new Error("Could not determine workspace root. Run this command inside a monorepo.");const m=v,e=m[0];if(!e)throw new Error("Package name is required. Usage: vis analyze <package> [version]");const p=m[1],{packageManager:R}=N(f);let t,u="default";const b=I(f,R);for(const[o,i]of b){const a=i.get(e);if(a){t=a,u=o;break}}if(!t)throw new Error(`Package "${e}" not found in any catalog or package.json. Make sure it exists in your workspace dependencies.`);let r;if(p)r=p;else{n.info(`Fetching latest version for ${e}...
1
+ import{P as N}from"./cli-main.js";import"../packem_shared/index-CE6MsgcV.js";import"../packem_shared/public-api-WqUCiyIe.js";import{K as C,Z as P,W as T}from"../packem_shared/ai-analysis-DF_AfeS3.js";import{R as I,T as j,a as h,N as q,c as x,f as z,q as A,I as F}from"./catalog.js";const M=/^[\^~>=<]+/,V=async({argument:v,logger:n,options:c,visConfig:l,workspaceRoot:f})=>{if(!f)throw new Error("Could not determine workspace root. Run this command inside a monorepo.");const m=v,e=m[0];if(!e)throw new Error("Package name is required. Usage: vis analyze <package> [version]");const p=m[1],{packageManager:R}=N(f);let t,u="default";const b=I(f,R);for(const[o,i]of b){const a=i.get(e);if(a){t=a,u=o;break}}if(!t)throw new Error(`Package "${e}" not found in any catalog or package.json. Make sure it exists in your workspace dependencies.`);let r;if(p)r=p;else{n.info(`Fetching latest version for ${e}...
2
2
  `);const o=await j(e);if(!o.latest)throw new Error(`Could not determine latest version for "${e}".`);r=o.latest}const d=h(t),w=h(r);if(!d||!w)throw new Error(`Could not parse versions: current="${t}", target="${r}".`);const k=A(d,w);if(k==="none"){n.info(`${e} is already at ${r}. Nothing to analyze.`);return}const E=F(t),g={catalogName:u,currentRange:t,newRange:`${E}${r}`,packageName:e,targetVersion:r,updateType:k},y=C(c.aiType??"impact");if(y==="security"||c.security){n.info(`Checking for known vulnerabilities...
3
3
  `);const o=t.replace(M,""),i=(await q([{name:e,version:o}])).get(e);i&&i.length>0&&(g.vulnerabilities=i);const a=x(l?.security,{minimumScore:l?.security?.policies?.score?.minimum});if(a.length>0){const s=(await z(a,[{name:e,version:o}])).get(`${e}@${o}`);s&&(g.socketReport={alerts:s.alerts,license:s.license,score:s.score})}}const $=await P([g],n,l?.ai,y);(c.format??"table")==="json"?process.stdout.write(`${JSON.stringify($,void 0,2)}
4
4
  `):n.info(T($))};export{V as default};
@@ -1,25 +1,25 @@
1
- import{createRequire as N}from"node:module";const R=N(import.meta.url),j=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,A=e=>{if(typeof j<"u"&&j.versions&&j.versions.node){const[n,a]=j.versions.node.split(".").map(Number);if(n>22||n===22&&a>=3||n===20&&a>=16)return j.getBuiltinModule(e)}return R(e)},{mkdir:J,readFile:$,writeFile:w,readdir:S,access:M,rm:O}=A("node:fs/promises"),{join:l,relative:v,dirname:P}=A("node:path"),k=async e=>{try{return await M(e),!0}catch{return!1}},_=async e=>await k(l(e,".changeset"))?"changesets":await k(l(e,".bumpy"))?"bumpy":await(async()=>{for(const a of[".releaserc.json",".releaserc.cjs",".releaserc.js"])if(await k(l(e,a)))return!0;const n=[l(e,"packages"),l(e,"apps")];for(;n.length>0;){const a=n.shift();let t;try{t=await S(a,{withFileTypes:!0})}catch{continue}for(const s of t)if(s.isDirectory()){if(s.name==="node_modules"||s.name.startsWith("."))continue;n.push(l(a,s.name))}else if(s.name===".releaserc.json"||s.name===".releaserc.cjs"||s.name===".releaserc.js")return!0;if(n.length>200)break}return!1})()?"semantic-release":"fresh",C=async e=>{const n=[];for(const s of[".releaserc.json",".releaserc.cjs",".releaserc.js"]){const f=l(e,s);await k(f)&&n.push(f)}const a=[l(e,"packages"),l(e,"apps")];let t=0;for(;a.length>0&&t<5e3;){const s=a.shift();t+=1;let f;try{f=await S(s,{withFileTypes:!0})}catch{continue}for(const i of f){const r=l(s,i.name);if(i.isDirectory()){if(i.name==="node_modules"||i.name.startsWith("."))continue;a.push(r)}else(i.name===".releaserc.json"||i.name===".releaserc.cjs"||i.name===".releaserc.js")&&n.push(r)}}return n},F=async e=>{if(!e.endsWith(".json"))return{path:e};try{const n=await $(e,"utf8"),a=JSON.parse(n);return{branches:a.branches,extends:typeof a.extends=="string"?a.extends:void 0,path:e,plugins:Array.isArray(a.plugins)?a.plugins:void 0}}catch{return}},B=e=>Array.isArray(e)?e.map(n=>{if(typeof n=="string")return{name:n};if(typeof n=="object"&&n!==null&&typeof n.name=="string"){const a=n;return{channel:a.channel,name:a.name,prerelease:a.prerelease}}}).filter(n=>n!==void 0):[],T=e=>{const n={};for(const a of e){const t={tag:"latest"};typeof a.prerelease=="string"?(t.prerelease=a.prerelease,t.tag=a.prerelease,t.mode="auto-publish"):a.prerelease===!0?(t.prerelease=a.name,t.tag=a.name,t.mode="auto-publish"):(t.tag=a.channel??(a.name==="main"||a.name==="master"?"latest":a.name),t.mode="version-pr"),n[a.name]=t}return n},z=async({logger:e,options:n,workspaceRoot:a})=>{const t=a??process.cwd(),s=n.dryRun===!0;let f=n.apply===!0;s&&f&&(e.warn("--apply is ignored because --dry-run is set (dry-run takes precedence)."),f=!1);let i;n.fromSemanticRelease?i="semantic-release":n.fromChangesets?i="changesets":n.fromBumpy?i="bumpy":n.fresh?i="fresh":i=await _(t),e.info(`Detected source: ${i}`),e.info("");const r=l(t,".vis","release"),c=".vis/release/.state.json",g=".vis/release/.lock",u=l(t,".gitignore");if(s)e.info(`[dry-run] would create directory: ${r}`),e.info(`[dry-run] would append to .gitignore:
2
- ${c}
3
- ${g}`);else{await J(r,{recursive:!0}),e.info(`Created ${v(t,r)}/`);try{const p=await $(u,"utf8"),h=[];p.includes(c)||h.push(c),p.includes(g)||h.push(g),h.length>0&&(await w(u,`${p.replace(/\n*$/,`
1
+ import{createRequire as J}from"node:module";const R=J(import.meta.url),S=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,A=e=>{if(typeof S<"u"&&S.versions&&S.versions.node){const[n,a]=S.versions.node.split(".").map(Number);if(n>22||n===22&&a>=3||n===20&&a>=16)return S.getBuiltinModule(e)}return R(e)},{mkdir:N,readFile:k,writeFile:w,readdir:x,access:O,rm:M}=A("node:fs/promises"),{join:c,relative:$,dirname:P}=A("node:path"),b=async e=>{try{return await O(e),!0}catch{return!1}},_=async e=>await b(c(e,".changeset"))?"changesets":await b(c(e,".bumpy"))?"bumpy":await(async()=>{for(const a of[".releaserc.json",".releaserc.cjs",".releaserc.js"])if(await b(c(e,a)))return!0;const n=[c(e,"packages"),c(e,"apps")];for(;n.length>0;){const a=n.shift();let t;try{t=await x(a,{withFileTypes:!0})}catch{continue}for(const s of t)if(s.isDirectory()){if(s.name==="node_modules"||s.name.startsWith("."))continue;n.push(c(a,s.name))}else if(s.name===".releaserc.json"||s.name===".releaserc.cjs"||s.name===".releaserc.js")return!0;if(n.length>200)break}return!1})()?"semantic-release":"fresh",C=async e=>{const n=[];for(const s of[".releaserc.json",".releaserc.cjs",".releaserc.js"]){const f=c(e,s);await b(f)&&n.push(f)}const a=[c(e,"packages"),c(e,"apps")];let t=0;for(;a.length>0&&t<5e3;){const s=a.shift();t+=1;let f;try{f=await x(s,{withFileTypes:!0})}catch{continue}for(const i of f){const r=c(s,i.name);if(i.isDirectory()){if(i.name==="node_modules"||i.name.startsWith("."))continue;a.push(r)}else(i.name===".releaserc.json"||i.name===".releaserc.cjs"||i.name===".releaserc.js")&&n.push(r)}}return n},T=async e=>{if(!e.endsWith(".json"))return{path:e};try{const n=await k(e,"utf8"),a=JSON.parse(n);return{branches:a.branches,extends:typeof a.extends=="string"?a.extends:void 0,path:e,plugins:Array.isArray(a.plugins)?a.plugins:void 0}}catch{return}},F=e=>Array.isArray(e)?e.map(n=>{if(typeof n=="string")return{name:n};if(typeof n=="object"&&n!==null&&typeof n.name=="string"){const a=n;return{channel:a.channel,name:a.name,prerelease:a.prerelease}}}).filter(n=>n!==void 0):[],B=e=>{const n={};for(const a of e){const t={tag:"latest"};typeof a.prerelease=="string"?(t.prerelease=a.prerelease,t.tag=a.prerelease,t.mode="auto-publish"):a.prerelease===!0?(t.prerelease=a.name,t.tag=a.name,t.mode="auto-publish"):(t.tag=a.channel??(a.name==="main"||a.name==="master"?"latest":a.name),t.mode="version-pr"),n[a.name]=t}return n},z=async({logger:e,options:n,workspaceRoot:a})=>{const t=a??process.cwd(),s=n.dryRun===!0;let f=n.apply===!0;s&&f&&(e.warn("--apply is ignored because --dry-run is set (dry-run takes precedence)."),f=!1);let i;n.fromSemanticRelease?i="semantic-release":n.fromChangesets?i="changesets":n.fromBumpy?i="bumpy":n.fresh?i="fresh":i=await _(t),e.info(`Detected source: ${i}`),e.info("");const r=c(t,".vis","release"),l=".vis/release/.state.json",h=".vis/release/.lock",u=c(t,".gitignore");if(s)e.info(`[dry-run] would create directory: ${r}`),e.info(`[dry-run] would append to .gitignore:
2
+ ${l}
3
+ ${h}`);else{await N(r,{recursive:!0}),e.info(`Created ${$(t,r)}/`);try{const d=await k(u,"utf8"),g=[];d.includes(l)||g.push(l),d.includes(h)||g.push(h),g.length>0&&(await w(u,`${d.replace(/\n*$/,`
4
4
  `)}
5
5
  # vis release subsystem
6
- ${h.join(`
6
+ ${g.join(`
7
7
  `)}
8
8
  `),e.info("Updated .gitignore."))}catch{await w(u,`# vis release subsystem
9
- ${c}
10
- ${g}
11
- `),e.info("Created .gitignore.")}}const o=".vis/release/**",d=l(t,".secretlintignore");if(s)e.info(`[dry-run] would add to .secretlintignore:
12
- ${o}`);else try{const p=await $(d,"utf8");p.includes(o)||(await w(d,`${p.replace(/\n*$/,`
9
+ ${l}
10
+ ${h}
11
+ `),e.info("Created .gitignore.")}}if(n.agent){const{upsertAgentSection:d}=await import("./agent-instructions.js"),g=c(t,"AGENTS.md");let v;try{v=await k(g,"utf8")}catch(j){if(j.code!=="ENOENT")throw j;v=void 0}const{changed:m,content:y}=d(v);m?s?e.info(`[dry-run] would ${v?"update":"create"} AGENTS.md with the 'Releasing with vis' section`):(await w(g,y),e.info(`${v?"Updated":"Created"} AGENTS.md.`)):e.info("AGENTS.md already up to date.")}const o=".vis/release/**",p=c(t,".secretlintignore");if(s)e.info(`[dry-run] would add to .secretlintignore:
12
+ ${o}`);else try{const d=await k(p,"utf8");d.includes(o)||(await w(p,`${d.replace(/\n*$/,`
13
13
  `)}
14
14
  # vis release change files (author handles false-positive secretlint)
15
15
  ${o}
16
- `),e.info("Updated .secretlintignore."))}catch{await w(d,`# vis release change files (author handles false-positive secretlint)
16
+ `),e.info("Updated .secretlintignore."))}catch{await w(p,`# vis release change files (author handles false-positive secretlint)
17
17
  ${o}
18
- `),e.info("Created .secretlintignore.")}switch(i){case"bumpy":{await U(t,s,e);break}case"changesets":{await E(t,s,e);break}case"semantic-release":{await D(t,s,f,e);break}default:V(e)}await q(t,s,n.yes===!0,e),await G(t,s,n,e),e.info(""),e.info("Next steps:"),e.info(" 1. Add the `release: { ... }` block above to your vis.config.ts"),e.info(" 2. Author your first change file: vis release add"),e.info(" 3. Preview the plan: vis release status"),e.info(" 4. Apply: vis release version --dry-run")},D=async(e,n,a,t)=>{const s=await C(e);if(t.info(`Found ${s.length} .releaserc file(s).`),s.length===0)return;let f=[],i=0;for(const o of s){const d=await F(o);d&&(d.branches&&(f=[...f,...B(d.branches)]),d.plugins?.some(p=>typeof p=="string"&&p.includes("native-addons"))&&(i+=1),d.plugins?.some(p=>Array.isArray(p)&&typeof p[0]=="string"&&p[0].includes("native-addons"))&&(i+=1))}const r=new Set,c=f.filter(o=>r.has(o.name)?!1:(r.add(o.name),!0)),g=c.length>0?T(c):{alpha:{mode:"auto-publish",prerelease:"alpha",tag:"alpha"},main:{mode:"version-pr",tag:"latest"}};t.info(""),t.info("Suggested vis.config.ts release block (paste into your existing config):"),t.info("");const u=` release: {
18
+ `),e.info("Created .secretlintignore.")}switch(i){case"bumpy":{await G(t,s,e);break}case"changesets":{await W(t,s,e);break}case"semantic-release":{await E(t,s,f,e);break}default:V(e)}await U(t,s,n.yes===!0,e),await q(t,s,n,e),e.info(""),e.info("Next steps:"),e.info(" 1. Add the `release: { ... }` block above to your vis.config.ts"),e.info(" 2. Author your first change file: vis release add"),e.info(" 3. Preview the plan: vis release status"),e.info(" 4. Apply: vis release version --dry-run")},E=async(e,n,a,t)=>{const s=await C(e);if(t.info(`Found ${s.length} .releaserc file(s).`),s.length===0)return;let f=[],i=0;for(const o of s){const p=await T(o);p&&(p.branches&&(f=[...f,...F(p.branches)]),p.plugins?.some(d=>typeof d=="string"&&d.includes("native-addons"))&&(i+=1),p.plugins?.some(d=>Array.isArray(d)&&typeof d[0]=="string"&&d[0].includes("native-addons"))&&(i+=1))}const r=new Set,l=f.filter(o=>r.has(o.name)?!1:(r.add(o.name),!0)),h=l.length>0?B(l):{alpha:{mode:"auto-publish",prerelease:"alpha",tag:"alpha"},main:{mode:"version-pr",tag:"latest"}};t.info(""),t.info("Suggested vis.config.ts release block (paste into your existing config):"),t.info("");const u=` release: {
19
19
  baseBranch: "main",
20
20
  defaultManaged: false, // flip to true after Phase 6
21
21
  channels: {
22
- ${Object.entries(g).map(([o,d])=>` ${JSON.stringify(o)}: ${JSON.stringify(d)},`).join(`
22
+ ${Object.entries(h).map(([o,p])=>` ${JSON.stringify(o)}: ${JSON.stringify(p)},`).join(`
23
23
  `)}
24
24
  },
25
25
  publish: {
@@ -31,17 +31,17 @@ ${Object.entries(g).map(([o,d])=>` ${JSON.stringify(o)}: ${JSON.stringify
31
31
  cleanPackageJson: true,
32
32
  },
33
33
  gitUser: { name: "release-bot", email: "release-bot@example.com" },
34
- },`;if(t.info(u),t.info(""),i>0&&(t.info(`Found ${i} package(s) using a NAPI native-addons plugin.`),t.info("These will auto-detect via the `napi` field in package.json — no config needed."),t.info("")),t.info("Migration is per-package opt-in (RFC §17.1). For each package you want to migrate:"),t.info(' 1. Add to its package.json: "vis-release": { "managed": true }'),t.info(" 2. Backfill any missing git tags so already-published detection works."),t.info(" 3. Add to multi-semantic-release's --ignore-packages list in your release workflow."),t.info(""),!a){t.info("Existing .releaserc.json files are kept in place during transition (deleted in Phase 6)."),t.info("Re-run with `--apply` to perform the writes automatically.");return}t.info(""),t.info("Applying migration writes (--apply set)…"),await I(e,s,u,t),t.info(""),t.info("Migration writes complete. Follow-up steps you still need to do manually:"),t.info(" - Update your CI workflow: remove `multi-semantic-release` step, add `vis release ci/release` step (see `.github/workflows/vis-release.yml` example in the vis package)"),t.info(" - Run `pnpm install` to drop semantic-release deps once you remove them from root package.json"),t.info(" - Run `vis release doctor` to verify the migration")},I=async(e,n,a,t)=>{const s=l(e,"vis.config.ts"),f=await $(s,"utf8").catch(()=>{});if(f===void 0){const i=`import { defineConfig } from "@visulima/vis/config";
34
+ },`;if(t.info(u),t.info(""),i>0&&(t.info(`Found ${i} package(s) using a NAPI native-addons plugin.`),t.info("These will auto-detect via the `napi` field in package.json — no config needed."),t.info("")),t.info("Migration is per-package opt-in (RFC §17.1). For each package you want to migrate:"),t.info(' 1. Add to its package.json: "vis-release": { "managed": true }'),t.info(" 2. Backfill any missing git tags so already-published detection works."),t.info(" 3. Add to multi-semantic-release's --ignore-packages list in your release workflow."),t.info(""),!a){t.info("Existing .releaserc.json files are kept in place during transition (deleted in Phase 6)."),t.info("Re-run with `--apply` to perform the writes automatically.");return}t.info(""),t.info("Applying migration writes (--apply set)…"),await D(e,s,u,t),t.info(""),t.info("Migration writes complete. Follow-up steps you still need to do manually:"),t.info(" - Update your CI workflow: remove `multi-semantic-release` step, add `vis release ci/release` step (see `.github/workflows/vis-release.yml` example in the vis package)"),t.info(" - Run `pnpm install` to drop semantic-release deps once you remove them from root package.json"),t.info(" - Run `vis release doctor` to verify the migration")},D=async(e,n,a,t)=>{const s=c(e,"vis.config.ts"),f=await k(s,"utf8").catch(()=>{});if(f===void 0){const i=`import { defineConfig } from "@visulima/vis/config";
35
35
 
36
36
  export default defineConfig({
37
37
  ${a}
38
38
  });
39
- `;await w(s,i),t.info(` wrote ${v(e,s)}`)}else if(/\brelease\s*:/.test(f))t.warn(` skipped ${v(e,s)} — already has a \`release\` key; merge the suggested block manually.`);else{const i=W(f,a);i===void 0?t.warn(` skipped ${v(e,s)} — could not locate \`defineConfig({\` or \`export default {\` to inject into; merge the suggested block manually.`):(await w(s,i),t.info(` updated ${v(e,s)} (injected release block)`))}for(const i of n){const r=P(i),c=l(r,"package.json");if(!await k(c))continue;const g=await $(c,"utf8");let u;try{u=JSON.parse(g)}catch{t.warn(` skipped ${v(e,c)} — invalid JSON.`);continue}const o=u["vis-release"];if(o!==null&&typeof o=="object"&&o.managed===!0)continue;const d=o!==null&&typeof o=="object"?{...o,managed:!0}:{managed:!0};u["vis-release"]=d,await w(c,`${JSON.stringify(u,void 0,4)}
40
- `),t.info(` updated ${v(e,c)} (added vis-release.managed = true)`)}for(const i of n)await O(i,{force:!0}),t.info(` deleted ${v(e,i)}`)},W=(e,n)=>{const a=/defineConfig\s*\(\s*\{/.exec(e);if(a!==null){const s=a.index+a[0].length;return`${e.slice(0,s)}
39
+ `;await w(s,i),t.info(` wrote ${$(e,s)}`)}else if(/\brelease\s*:/.test(f))t.warn(` skipped ${$(e,s)} — already has a \`release\` key; merge the suggested block manually.`);else{const i=I(f,a);i===void 0?t.warn(` skipped ${$(e,s)} — could not locate \`defineConfig({\` or \`export default {\` to inject into; merge the suggested block manually.`):(await w(s,i),t.info(` updated ${$(e,s)} (injected release block)`))}for(const i of n){const r=P(i),l=c(r,"package.json");if(!await b(l))continue;const h=await k(l,"utf8");let u;try{u=JSON.parse(h)}catch{t.warn(` skipped ${$(e,l)} — invalid JSON.`);continue}const o=u["vis-release"];if(o!==null&&typeof o=="object"&&o.managed===!0)continue;const p=o!==null&&typeof o=="object"?{...o,managed:!0}:{managed:!0};u["vis-release"]=p,await w(l,`${JSON.stringify(u,void 0,4)}
40
+ `),t.info(` updated ${$(e,l)} (added vis-release.managed = true)`)}for(const i of n)await M(i,{force:!0}),t.info(` deleted ${$(e,i)}`)},I=(e,n)=>{const a=/defineConfig\s*\(\s*\{/.exec(e);if(a!==null){const s=a.index+a[0].length;return`${e.slice(0,s)}
41
41
  ${n}
42
42
  ${e.slice(s)}`}const t=/export\s+default\s+\{/.exec(e);if(t!==null){const s=t.index+t[0].length;return`${e.slice(0,s)}
43
43
  ${n}
44
- ${e.slice(s)}`}},E=async(e,n,a)=>{const t=l(e,".changeset"),s=l(t,"config.json"),f=l(t,"pre.json");if(await k(f)){a.error("Pre-release mode is active in changesets (.changeset/pre.json exists)."),a.error("Run `changeset pre exit && changeset version` to consume pending changes, then re-run `vis release init`."),process.exitCode=1;return}let i={};try{i=JSON.parse(await $(s,"utf8"))}catch{a.warn(".changeset/config.json missing or unreadable; using defaults.")}const r={access:i.access==="restricted"?"restricted":"public",baseBranch:typeof i.baseBranch=="string"?i.baseBranch:"main",defaultManaged:!0,fixed:Array.isArray(i.fixed)?i.fixed:[],ignore:Array.isArray(i.ignore)?i.ignore:[],linked:Array.isArray(i.linked)?i.linked:[],privatePackages:i.privatePackages??{tag:!1,version:!1},updateInternalDependencies:i.updateInternalDependencies??"out-of-range"},c=i.changelog,g=typeof c=="string"?c:Array.isArray(c)&&typeof c[0]=="string"?c[0]:void 0;let u;c===!1?u="false":g?.includes("@changesets/changelog-github")?u='"github"':(g?.includes("@changesets/cli"),u='"default"');const o=[];let d=0;try{const p=await S(t);for(const h of p)!h.endsWith(".md")||h==="README.md"||o.push(h)}catch{}if(o.length>0){const p=l(e,".vis","release");let h=0;for(const b of o){const m=l(t,b),y=l(p,b);if(n){a.info(`[dry-run] would copy ${m} → ${y}`);continue}if(await k(y)){a.info(`Skipping existing ${v(e,y)}.`),h+=1;continue}const x=await $(m,"utf8");await w(y,x),d+=1}h>0&&a.info(`Skipped ${h} file(s) that already exist in .vis/release/.`)}a.info(`Found ${o.length} pending .changeset/*.md file(s); ${d>0?`copied ${d} to .vis/release/`:"(dry-run — would copy)"}.`),a.info(""),a.info("Suggested vis.config.ts release block:"),a.info(""),a.info(` release: {
44
+ ${e.slice(s)}`}},W=async(e,n,a)=>{const t=c(e,".changeset"),s=c(t,"config.json"),f=c(t,"pre.json");if(await b(f)){a.error("Pre-release mode is active in changesets (.changeset/pre.json exists)."),a.error("Run `changeset pre exit && changeset version` to consume pending changes, then re-run `vis release init`."),process.exitCode=1;return}let i={};try{i=JSON.parse(await k(s,"utf8"))}catch{a.warn(".changeset/config.json missing or unreadable; using defaults.")}const r={access:i.access==="restricted"?"restricted":"public",baseBranch:typeof i.baseBranch=="string"?i.baseBranch:"main",defaultManaged:!0,fixed:Array.isArray(i.fixed)?i.fixed:[],ignore:Array.isArray(i.ignore)?i.ignore:[],linked:Array.isArray(i.linked)?i.linked:[],privatePackages:i.privatePackages??{tag:!1,version:!1},updateInternalDependencies:i.updateInternalDependencies??"out-of-range"},l=i.changelog,h=typeof l=="string"?l:Array.isArray(l)&&typeof l[0]=="string"?l[0]:void 0;let u;l===!1?u="false":h?.includes("@changesets/changelog-github")?u='"github"':(h?.includes("@changesets/cli"),u='"default"');const o=[];let p=0;try{const d=await x(t);for(const g of d)!g.endsWith(".md")||g==="README.md"||o.push(g)}catch{}if(o.length>0){const d=c(e,".vis","release");let g=0;for(const v of o){const m=c(t,v),y=c(d,v);if(n){a.info(`[dry-run] would copy ${m} → ${y}`);continue}if(await b(y)){a.info(`Skipping existing ${$(e,y)}.`),g+=1;continue}const j=await k(m,"utf8");await w(y,j),p+=1}g>0&&a.info(`Skipped ${g} file(s) that already exist in .vis/release/.`)}a.info(`Found ${o.length} pending .changeset/*.md file(s); ${p>0?`copied ${p} to .vis/release/`:"(dry-run — would copy)"}.`),a.info(""),a.info("Suggested vis.config.ts release block:"),a.info(""),a.info(` release: {
45
45
  baseBranch: ${JSON.stringify(r.baseBranch)},
46
46
  access: ${JSON.stringify(r.access)},
47
47
  defaultManaged: ${r.defaultManaged},
@@ -56,11 +56,11 @@ ${e.slice(s)}`}},E=async(e,n,a)=>{const t=l(e,".changeset"),s=l(t,"config.json")
56
56
  publishStrategy: "npm-publish-tarball",
57
57
  cleanPackageJson: true,
58
58
  },
59
- },`),a.info(""),a.info("After confirming the config, you can delete `.changeset/` (or run `vis release init --remove-changesets`).")},U=async(e,n,a)=>{const t=l(e,".bumpy"),s=l(t,"_config.json");let f={};try{f=JSON.parse(await $(s,"utf8"))}catch{a.warn(".bumpy/_config.json missing or unreadable; using defaults.")}const i=JSON.stringify(f,null,4).split(`
60
- `).map(g=>` ${g}`).join(`
61
- `),r=[];let c=0;try{const g=await S(t);for(const u of g)!u.endsWith(".md")||u==="README.md"||r.push(u)}catch{}if(r.length>0){const g=l(e,".vis","release");let u=0;for(const o of r){const d=l(t,o),p=l(g,o);if(n){a.info(`[dry-run] would copy ${d} → ${p}`);continue}if(await k(p)){a.info(`Skipping existing ${v(e,p)}.`),u+=1;continue}const h=await $(d,"utf8");await w(p,h),c+=1}u>0&&a.info(`Skipped ${u} file(s) that already exist in .vis/release/.`)}a.info(`Found ${r.length} pending .bumpy/*.md file(s); ${c>0?`copied ${c} to .vis/release/`:"(dry-run)"}.`),a.info(""),a.info("Suggested vis.config.ts release block (bumpy config translates 1:1):"),a.info(""),a.info(` release: ${i.trimStart()},`),a.info(""),a.info("After confirming, delete `.bumpy/`.")},q=async(e,n,a,t)=>{const s=l(e,".husky","pre-commit");if(!await k(s))return;const f=await $(s,"utf8").catch(()=>"");if(f.includes("vis release check"))return;const i="vis release check --hook pre-commit --no-fail";if(!await(async()=>{if(!process.stdout.isTTY||process.env.CI==="true")return!1;if(a)return!0;try{const{confirmPrompt:c}=await import("./prompts.js");return await c(`Wire \`${i}\` into your .husky/pre-commit hook?`,!0)}catch{return!1}})()){t.info(""),t.info("Optional: add this line to .husky/pre-commit:"),t.info(` ${i}`);return}if(n){t.info(`[dry-run] would append \`${i}\` to .husky/pre-commit`);return}const r=`${f.replace(/\n*$/,`
59
+ },`),a.info(""),a.info("After confirming the config, you can delete `.changeset/` (or run `vis release init --remove-changesets`).")},G=async(e,n,a)=>{const t=c(e,".bumpy"),s=c(t,"_config.json");let f={};try{f=JSON.parse(await k(s,"utf8"))}catch{a.warn(".bumpy/_config.json missing or unreadable; using defaults.")}const i=JSON.stringify(f,null,4).split(`
60
+ `).map(h=>` ${h}`).join(`
61
+ `),r=[];let l=0;try{const h=await x(t);for(const u of h)!u.endsWith(".md")||u==="README.md"||r.push(u)}catch{}if(r.length>0){const h=c(e,".vis","release");let u=0;for(const o of r){const p=c(t,o),d=c(h,o);if(n){a.info(`[dry-run] would copy ${p} → ${d}`);continue}if(await b(d)){a.info(`Skipping existing ${$(e,d)}.`),u+=1;continue}const g=await k(p,"utf8");await w(d,g),l+=1}u>0&&a.info(`Skipped ${u} file(s) that already exist in .vis/release/.`)}a.info(`Found ${r.length} pending .bumpy/*.md file(s); ${l>0?`copied ${l} to .vis/release/`:"(dry-run)"}.`),a.info(""),a.info("Suggested vis.config.ts release block (bumpy config translates 1:1):"),a.info(""),a.info(` release: ${i.trimStart()},`),a.info(""),a.info("After confirming, delete `.bumpy/`.")},U=async(e,n,a,t)=>{const s=c(e,".husky","pre-commit");if(!await b(s))return;const f=await k(s,"utf8").catch(()=>"");if(f.includes("vis release check"))return;const i="vis release check --hook pre-commit --no-fail";if(!await(async()=>{if(!process.stdout.isTTY||process.env.CI==="true")return!1;if(a)return!0;try{const{confirmPrompt:l}=await import("./prompts.js");return await l(`Wire \`${i}\` into your .husky/pre-commit hook?`,!0)}catch{return!1}})()){t.info(""),t.info("Optional: add this line to .husky/pre-commit:"),t.info(` ${i}`);return}if(n){t.info(`[dry-run] would append \`${i}\` to .husky/pre-commit`);return}const r=`${f.replace(/\n*$/,`
62
62
  `)}${i}
63
- `;await w(s,r),t.info("Wired vis release check into .husky/pre-commit.")},G=async(e,n,a,t)=>{const s=a.workflows===!0,f=a.yes===!0;if(!s&&(!process.stdout.isTTY||process.env.CI==="true"))return;if(!(s||f||await(async()=>{try{const{confirmPrompt:m}=await import("./prompts.js");return await m("Generate CI workflow files for the active provider?",!0)}catch{return!1}})())){t.info(""),t.info("Skipped workflow generation. Re-run with `vis release init --workflows` later.");return}const{detectRemoteProvider:i}=await import("./detect2.js"),{generateWorkflowFiles:r}=await import("./workflow-templates.js"),{detectPackageManager:c}=await import("../packem_shared/createAdapter-bU4DIP3F.js"),{createShellRunner:g}=await import("./shell-runner.js"),u=g(),o=await i(e,u,void 0),d=await c(e,u),p=a.packageManager??d;let h={};try{const{loadVisConfig:m}=await import("./CONFIG_FILES.js"),y=await m(e);y.release&&(h=y.release)}catch{}const b=r(h,{packageManager:p,provider:o});t.info(""),t.info(`Generating ${b.length} workflow file(s) for ${o}:`);for(const m of b){const y=l(e,m.path);if(await k(y)){t.warn(` ${m.path} — already exists, skipping`);continue}if(n){t.info(` ${m.path} — [dry-run] would write ${m.content.length} bytes`);continue}const x=await import("node:path");await J(x.dirname(y),{recursive:!0}),await w(y,m.content),t.info(` ${m.path} — wrote ${m.content.length} bytes`)}},V=e=>{e.info(""),e.info("Suggested vis.config.ts release block:"),e.info(""),e.info(` release: {
63
+ `;await w(s,r),t.info("Wired vis release check into .husky/pre-commit.")},q=async(e,n,a,t)=>{const s=a.workflows===!0,f=a.yes===!0;if(!s&&(!process.stdout.isTTY||process.env.CI==="true"))return;if(!(s||f||await(async()=>{try{const{confirmPrompt:m}=await import("./prompts.js");return await m("Generate CI workflow files for the active provider?",!0)}catch{return!1}})())){t.info(""),t.info("Skipped workflow generation. Re-run with `vis release init --workflows` later.");return}const{detectRemoteProvider:i}=await import("./detect2.js"),{generateWorkflowFiles:r}=await import("./workflow-templates.js"),{detectPackageManager:l}=await import("../packem_shared/createAdapter-bU4DIP3F.js"),{createShellRunner:h}=await import("./shell-runner.js"),u=h(),o=await i(e,u,void 0),p=await l(e,u),d=a.packageManager??p;let g={};try{const{loadVisConfig:m}=await import("./CONFIG_FILES.js"),y=await m(e);y.release&&(g=y.release)}catch{}const v=r(g,{packageManager:d,provider:o});t.info(""),t.info(`Generating ${v.length} workflow file(s) for ${o}:`);for(const m of v){const y=c(e,m.path);if(await b(y)){t.warn(` ${m.path} — already exists, skipping`);continue}if(n){t.info(` ${m.path} — [dry-run] would write ${m.content.length} bytes`);continue}const j=await import("node:path");await N(j.dirname(y),{recursive:!0}),await w(y,m.content),t.info(` ${m.path} — wrote ${m.content.length} bytes`)}},V=e=>{e.info(""),e.info("Suggested vis.config.ts release block:"),e.info(""),e.info(` release: {
64
64
  baseBranch: "main",
65
65
  defaultManaged: true,
66
66
  channels: {
@@ -1,4 +1,4 @@
1
- import{createRequire as b}from"node:module";import{h as _,d as O,E as j}from"./catalog.js";import"../packem_shared/env-Ct3hMEYB.js";import{A as R}from"../packem_shared/pm-runner-CQcraCcu.js";import{l as E}from"../packem_shared/dependency-scan-DpOFiZuI.js";import{r as I}from"../packem_shared/provenance-R2csDSNg.js";import{r as P}from"../packem_shared/signatures-B3srzCEv.js";import{loadOptionalSigstore as C}from"./loader.js";const N=b(import.meta.url),u=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,$=r=>{if(typeof u<"u"&&u.versions&&u.versions.node){const[o,t]=u.versions.node.split(".").map(Number);if(o>22||o===22&&t>=3||o===20&&t>=16)return u.getBuiltinModule(r)}return N(r)},{createHash:S}=$("node:crypto"),{isAbsolute:y,resolve:k,basename:v}=$("node:path"),T=r=>(r??"").split(",").map(o=>o.trim()).filter(o=>o.length>0),G=async({logger:r,options:o,workspaceRoot:t})=>{if(!t)throw new Error("Could not determine workspace root. Run this command inside a monorepo.");const n=o.format??"table",c=o.prodOnly??!1,p=o.failOn==="error"?"error":"warning",l=T(o.allowlist),a=R(t),d=E(t,a.name,{includeDev:!c}).map(({name:e,version:i})=>({name:e,version:i})),[m,g]=await Promise.all([I(d,{allowlist:l,workspaceRoot:t}),P(d,{allowlist:l,workspaceRoot:t})]),s=[...m.map(e=>({code:"provenance-regression",message:`Resolved ${e.packageName}@${e.version} has no published provenance attestation, but ${e.packageName}@${e.priorVersionWithProvenance} did — a provenance regression.`,packageName:e.packageName,severity:"warning",version:e.version})),...g.map(e=>({code:e.code,message:e.message,packageName:e.packageName,severity:e.severity,version:e.version}))],f=s.filter(e=>p==="error"?e.severity==="error":!0);if(n==="json")process.stdout.write(`${JSON.stringify({findings:s,ok:f.length===0},void 0,2)}
1
+ import{createRequire as b}from"node:module";import{h as _,d as O,E as j}from"./catalog.js";import"../packem_shared/env-DJlbJiFh.js";import{A as R}from"../packem_shared/pm-runner-CQcraCcu.js";import{l as E}from"../packem_shared/dependency-scan-DpOFiZuI.js";import{r as I}from"../packem_shared/provenance-DVHiWZrW.js";import{r as P}from"../packem_shared/signatures-QoCuUv9E.js";import{loadOptionalSigstore as C}from"./loader.js";const N=b(import.meta.url),u=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,$=r=>{if(typeof u<"u"&&u.versions&&u.versions.node){const[o,t]=u.versions.node.split(".").map(Number);if(o>22||o===22&&t>=3||o===20&&t>=16)return u.getBuiltinModule(r)}return N(r)},{createHash:S}=$("node:crypto"),{isAbsolute:y,resolve:k,basename:v}=$("node:path"),T=r=>(r??"").split(",").map(o=>o.trim()).filter(o=>o.length>0),G=async({logger:r,options:o,workspaceRoot:t})=>{if(!t)throw new Error("Could not determine workspace root. Run this command inside a monorepo.");const n=o.format??"table",c=o.prodOnly??!1,p=o.failOn==="error"?"error":"warning",l=T(o.allowlist),a=R(t),d=E(t,a.name,{includeDev:!c}).map(({name:e,version:i})=>({name:e,version:i})),[m,g]=await Promise.all([I(d,{allowlist:l,workspaceRoot:t}),P(d,{allowlist:l,workspaceRoot:t})]),s=[...m.map(e=>({code:"provenance-regression",message:`Resolved ${e.packageName}@${e.version} has no published provenance attestation, but ${e.packageName}@${e.priorVersionWithProvenance} did — a provenance regression.`,packageName:e.packageName,severity:"warning",version:e.version})),...g.map(e=>({code:e.code,message:e.message,packageName:e.packageName,severity:e.severity,version:e.version}))],f=s.filter(e=>p==="error"?e.severity==="error":!0);if(n==="json")process.stdout.write(`${JSON.stringify({findings:s,ok:f.length===0},void 0,2)}
2
2
  `);else if(n==="ndjson")for(const e of s)process.stdout.write(`${JSON.stringify(e)}
3
3
  `);else if(s.length===0)r.info(`No provenance regressions or signature problems across ${String(d.length)} locked packages.`);else{const e=process.stdout.columns||80;r.info(_(O.createElement(j,{data:s.map(i=>({code:i.code,package:`${i.packageName}@${i.version}`,severity:i.severity}))}),{columns:e}));for(const i of s)r.warn(`${i.packageName}@${i.version}: ${i.message}`)}f.length>0&&(process.exitCode=1)},D=()=>process.env.CI==="true"||typeof process.env.ACTIONS_ID_TOKEN_REQUEST_URL=="string"||typeof process.env.SIGSTORE_ID_TOKEN=="string",q=(r,o,t)=>({_type:"https://in-toto.io/Statement/v1",predicate:{buildDefinition:{buildType:"https://visulima.com/vis/attest/v1",externalParameters:{workspaceRoot:t},internalParameters:{},resolvedDependencies:[]},runDetails:{builder:{id:"https://visulima.com/vis"},metadata:{invocationId:process.env.GITHUB_RUN_ID??"",startedOn:new Date().toISOString()}}},predicateType:"https://slsa.dev/provenance/v1",subject:[{digest:{sha256:o},name:r}]}),H=async({argument:r,fs:o,logger:t,options:n,workspaceRoot:c})=>{if(!c)throw new Error("Could not determine workspace root. Run this command inside a monorepo.");const p=r[0];if(!p)throw new Error("Missing subject. Usage: vis attest <path-to-artifact>");const l=n.predicate??"slsaProvenance";if(l!=="slsaProvenance")throw new Error(`Unsupported predicate '${l}'. Only 'slsaProvenance' is supported.`);const a=y(p)?p:k(c,p),d=n.requireSigning??!1,m=n.format??"table";let g;try{g=await o.readFile(a)}catch{throw new Error(`Cannot read subject artifact at ${a}.`)}const s=S("sha256").update(g).digest("hex");if(!D()){const h="No ambient OIDC token (not running in CI). Keyless signing needs a Fulcio identity from CI OIDC.";if(d)throw new Error(`${h} Re-run in CI or drop --require-signing.`);if(m==="json"){process.stdout.write(`${JSON.stringify({ok:!1,reason:"no-ambient-oidc",sha256:s,skipped:!0,subject:v(a)},void 0,2)}
4
4
  `);return}t.warn(`${h} Skipping signing (subject sha256: ${s}). Pass --require-signing to make this fatal.`);return}const f=q(v(a),s,c),e=Buffer.from(JSON.stringify(f)),i=await(await C({workspaceRoot:c})).attest(e,"application/vnd.in-toto+json"),w=n.output?y(n.output)?n.output:k(c,n.output):`${a}.sigstore`;if(await o.writeFile(w,`${JSON.stringify(i,void 0,2)}
@@ -1,4 +1,4 @@
1
- import{createRequire as $}from"node:module";import{N as y,R as l,S as d,h as b}from"../packem_shared/ai-analysis-rC48NLfB.js";import{h as x,d as _,E as w}from"./catalog.js";import"../packem_shared/env-Ct3hMEYB.js";import{j as S,E as p,q as j,I as E,s as I}from"../packem_shared/index.server-J83sowC4.js";const C=$(import.meta.url),M=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process;const u={command:"ai",description:"AI-assisted commands: provider detection, cache management, and failure-fix proposals."},N=e=>{if(typeof e!="function")return String(e);const{name:t}=e;return t==="Boolean"?"boolean":t==="Number"?"number":t==="String"?"string":t??"unknown"},R=e=>{const t=[...e.commandPath??[],e.name].join(" "),i=(e.examples??[]).map(([o,r])=>({command:o??"",description:r??""})),n=(e.options??[]).map(o=>({defaultValue:o.defaultValue,description:o.description,name:o.name,type:N(o.type)}));return{argument:e.argument?{description:e.argument.description,name:e.argument.name}:void 0,description:e.description??"",examples:i,name:e.name,options:n,path:t}},f=(e,t=u)=>({command:t.command,description:t.description,subcommands:e.map(i=>R(i))}),P=(e,t=u)=>`${JSON.stringify(f(e,t),void 0,2)}
1
+ import{createRequire as $}from"node:module";import{N as y,R as l,S as d,h as b}from"../packem_shared/ai-analysis-DF_AfeS3.js";import{h as x,d as _,E as w}from"./catalog.js";import"../packem_shared/env-DJlbJiFh.js";import{j as S,E as p,q as j,I as E,s as I}from"../packem_shared/index.server-J83sowC4.js";const C=$(import.meta.url),M=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process;const u={command:"ai",description:"AI-assisted commands: provider detection, cache management, and failure-fix proposals."},N=e=>{if(typeof e!="function")return String(e);const{name:t}=e;return t==="Boolean"?"boolean":t==="Number"?"number":t==="String"?"string":t??"unknown"},R=e=>{const t=[...e.commandPath??[],e.name].join(" "),i=(e.examples??[]).map(([o,r])=>({command:o??"",description:r??""})),n=(e.options??[]).map(o=>({defaultValue:o.defaultValue,description:o.description,name:o.name,type:N(o.type)}));return{argument:e.argument?{description:e.argument.description,name:e.argument.name}:void 0,description:e.description??"",examples:i,name:e.name,options:n,path:t}},f=(e,t=u)=>({command:t.command,description:t.description,subcommands:e.map(i=>R(i))}),P=(e,t=u)=>`${JSON.stringify(f(e,t),void 0,2)}
2
2
  `,T=(e,t=u)=>{const i=f(e,t),n=[S(`vis ${i.command} — ${i.description}`),"",p("Subcommands:")];for(const o of i.subcommands){const r=o.argument?` ${j(`<${o.argument.name}>`)}`:"";if(n.push(""),n.push(` ${E(`vis ${o.path}`)}${r}`),o.description&&n.push(` ${o.description}`),o.options.length>0){const s=o.options.map(c=>`--${c.name}${c.type==="boolean"?"":`=<${c.type}>`}`).join(", ");n.push(p(` options: ${s}`))}if(o.examples.length>0){n.push(p(" examples:"));for(const s of o.examples){const c=s.description?p(` — ${s.description}`):"";n.push(` ${I(s.command)}${c}`)}}}return n.push(""),n.push(p(`Run \`vis ${i.command} discover-help\` for the machine-readable JSON catalogue (designed for AI agents).`)),n.push(p(`Run \`vis ${i.command} <subcommand> --help\` for full usage of a specific subcommand.`)),`${n.join(`
3
3
  `)}
4
4
  `},h=async()=>{const{default:e}=await import("./cli-main.js").then(t=>t.as);return e.filter(t=>t.name!=="ai")},B=async()=>{const e=await h();process.stderr.write(T(e))},F=async()=>{const e=await h();process.stdout.write(P(e))},V=async({logger:e,visConfig:t})=>{const i=t?.ai,n=l(i);if(!n){e.error("No AI provider available to test."),process.exitCode=1;return}e.info(`Testing ${n.name}...`);try{const o=await b(n,"Reply with exactly: OK",{timeoutMs:3e4});e.info(`Provider ${n.name} responded: ${o.stdout.trim().slice(0,200)}`)}catch(o){const r=o instanceof Error?o.message:String(o);e.error(`Provider ${n.name} failed: ${r}`),process.exitCode=1}},k=({logger:e,options:t,visConfig:i})=>{const n=t.format??"table",o=i?.ai,r=y(),s=l(o);if(n==="json"){const a=r.map(m=>({available:m.available,method:m.detectionMethod,name:m.name,path:m.path,priority:d[m.name]??0,selected:m.name===s?.name,version:m.version}));process.stdout.write(`${JSON.stringify(a,void 0,2)}
@@ -1,4 +1,4 @@
1
- import{createRequire as P}from"node:module";import{f as D,v as V,T as w}from"../packem_shared/index-CE6MsgcV.js";import{findVisConfigFile as A}from"./CONFIG_FILES.js";import{p as e}from"./cli-main.js";import{A as F}from"../packem_shared/pm-runner-CQcraCcu.js";import{W as O}from"../packem_shared/build-scripts-MTSK6TNr.js";import{O as q}from"../packem_shared/native-config-sync-BFDVK9LH.js";const C=P(import.meta.url),$=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,R=l=>{if(typeof $<"u"&&$.versions&&$.versions.node){const[t,s]=$.versions.node.split(".").map(Number);if(t>22||t===22&&s>=3||t===20&&s>=16)return $.getBuiltinModule(l)}return C(l)},{spawnSync:T}=R("node:child_process"),M=/(defineConfig\s*\(\s*\{)/,W=/(export\s+default\s+\{)/,v=(l,t)=>`${t}${JSON.stringify(l)}: true,`,B=(l,t)=>{if(t.length===0)return{added:[],skipped:[],status:"noop"};const s=A(l);if(!s)return{added:[],skipped:t,status:"no-config"};if(!D(s))return{added:[],skipped:t,status:"no-config"};const i=V(s),h=i.search(/installScripts\s*:\s*\{/);let a=null,r=0;if(h!==-1){const c=i.slice(h),d=/(allow\s*:\s*\{)([^}]*)(\})/.exec(c);d?.index!==void 0&&(a=d,r=h+d.index)}if(a){const c=a[2]??"",d=new Set;for(const g of c.matchAll(/["']([^"']+)["']\s*:/g))d.add(g[1]);for(const g of c.matchAll(/(?:^|,|\{)\s*([a-z_$][\w-]*)\s*:/gi))d.add(g[1]);const u=[],k=[];for(const g of t)d.has(g)?k.push(g):u.push(g);if(u.length===0)return{added:[],configPath:s,skipped:k,status:"noop"};const b=/\n([ \t]+)\S/.exec(c)?.[1]??" ",_=`
1
+ import{createRequire as P}from"node:module";import{f as D,v as V,T as w}from"../packem_shared/index-CE6MsgcV.js";import{findVisConfigFile as A}from"./CONFIG_FILES.js";import{p as e}from"./cli-main.js";import{A as F}from"../packem_shared/pm-runner-CQcraCcu.js";import{W as O}from"../packem_shared/build-scripts-q__dKE2y.js";import{O as q}from"../packem_shared/native-config-sync-D-z2Uwqu.js";const C=P(import.meta.url),$=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,R=l=>{if(typeof $<"u"&&$.versions&&$.versions.node){const[t,s]=$.versions.node.split(".").map(Number);if(t>22||t===22&&s>=3||t===20&&s>=16)return $.getBuiltinModule(l)}return C(l)},{spawnSync:T}=R("node:child_process"),M=/(defineConfig\s*\(\s*\{)/,W=/(export\s+default\s+\{)/,v=(l,t)=>`${t}${JSON.stringify(l)}: true,`,B=(l,t)=>{if(t.length===0)return{added:[],skipped:[],status:"noop"};const s=A(l);if(!s)return{added:[],skipped:t,status:"no-config"};if(!D(s))return{added:[],skipped:t,status:"no-config"};const i=V(s),h=i.search(/installScripts\s*:\s*\{/);let a=null,r=0;if(h!==-1){const c=i.slice(h),d=/(allow\s*:\s*\{)([^}]*)(\})/.exec(c);d?.index!==void 0&&(a=d,r=h+d.index)}if(a){const c=a[2]??"",d=new Set;for(const g of c.matchAll(/["']([^"']+)["']\s*:/g))d.add(g[1]);for(const g of c.matchAll(/(?:^|,|\{)\s*([a-z_$][\w-]*)\s*:/gi))d.add(g[1]);const u=[],k=[];for(const g of t)d.has(g)?k.push(g):u.push(g);if(u.length===0)return{added:[],configPath:s,skipped:k,status:"noop"};const b=/\n([ \t]+)\S/.exec(c)?.[1]??" ",_=`
2
2
  ${u.map(g=>v(g,b)).join(`
3
3
  `)}`,y=c.replace(/\s+$/,""),S=c.slice(y.length),j=`${y}${y.endsWith(",")||y===""?"":","}${_}${S.length>0?S:`
4
4
  `}`,N=`${i.slice(0,r)}${a[1]}${j}${a[3]}${i.slice(r+a[0].length)}`;return w(s,N),{added:u,configPath:s,skipped:k,status:"updated"}}const n=/(installScripts\s*:\s*\{)/;if(n.test(i)){const c=`
@@ -1,4 +1,4 @@
1
- import{E as d}from"../packem_shared/index.server-J83sowC4.js";import{m as g,f as y,v as k,T as w,O as l}from"../packem_shared/index-CE6MsgcV.js";import{a as $,b as h,f as x}from"../packem_shared/subtree-C7bZuiSQ.js";import{a as u}from"../packem_shared/utils-CRueU43T.js";import{k as b,W as A}from"./catalog.js";import{a as R}from"../packem_shared/readJsonSync-CvkZyKmL-ihoybKvs.js";const j=["aube-workspace.yaml","pnpm-workspace.yaml"],v=/^\s*packages\s*:\s*$/,E=/^(\s*)-\s/,q=(c,i)=>{const r=c.includes(`\r
1
+ import{E as d}from"../packem_shared/index.server-J83sowC4.js";import{m as g,f as y,v as k,T as w,O as l}from"../packem_shared/index-CE6MsgcV.js";import{a as $,b as h,f as x}from"../packem_shared/subtree-C7bZuiSQ.js";import{a as u}from"../packem_shared/utils-CRueU43T.js";import{k as b,W as A}from"./catalog.js";import{a as R}from"../packem_shared/readJsonSync-DuMMeB3s-ihoybKvs.js";const j=["aube-workspace.yaml","pnpm-workspace.yaml"],v=/^\s*packages\s*:\s*$/,E=/^(\s*)-\s/,q=(c,i)=>{const r=c.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
4
  `,e=c.split(/\r?\n/),o=e.findIndex(t=>v.test(t));if(o===-1)return;let s=" ";for(let t=o+1;t<e.length;t++){const a=E.exec(e[t]);if(a){s=a[1];break}if(e[t].trim().length>0)break}return e.splice(o+1,0,`${s}- "${i}"`),e.join(r)},I=(c,i,r)=>{const e=g(c,"package.json");let o;try{o=R(e)}catch{return!1}const{workspaces:s}=o;return Array.isArray(s)?s.includes(i)?!1:(r||l(e,{...o,workspaces:[...s,i]},{detectIndent:!0}),!0):s&&typeof s=="object"&&Array.isArray(s.packages)?s.packages.includes(i)?!1:(r||l(e,{...o,workspaces:{...s,packages:[...s.packages,i]}},{detectIndent:!0}),!0):!1},P=({dryRun:c=!1,prefix:i,workspaceRoot:r})=>{const e=u(i),o=b(r);if(!o)return{status:"no-config"};if(A(r,o).some(s=>u(s)===e))return{status:"already-covered"};for(const s of j){const t=g(r,s);if(!y(t))continue;const a=q(k(t),e);if(a!==void 0)return c||w(t,a),{entry:e,file:s,status:"added"}}return I(r,e,c)?{entry:e,file:"package.json",status:"added"}:{status:"no-config"}},H=async({argument:c,fs:i,logger:r,options:e,process:o,workspaceRoot:s})=>{const t=c[0];if(!t)throw new Error("Missing <source>. Pass a git repository URL or local path to import.");if(!e.prefix)throw new Error("Missing --prefix <dir>. Pass the target directory in the monorepo (e.g. packages/tooling/foo).");const a=s??o.cwd,n=u(e.prefix),f=e.ref??"HEAD";if($(a),await(async p=>{try{return await i.access(p),!0}catch{return!1}})(g(a,n)))throw new Error(`Target "${n}" already exists. git subtree add requires a non-existent prefix.`);if(e.dryRun){const p=e.squash?" --squash":"",m=e.message?` -m "${e.message}"`:"";r.info("Dry run — no changes will be made. Planned steps:"),r.info(` git subtree add --prefix=${n}${p}${m} ${t} ${f}`),e.noRegister||r.info(` register ${n} into the workspace config (skipped if already covered by an existing glob)`);return}if(h(a),r.info(`Importing ${d(t)}@${f} → ${n} ...`),x({cwd:a,message:e.message,prefix:n,ref:f,repo:t,squash:e.squash}),r.info(`✓ Imported ${t} into ${n} (history preserved).`),e.noRegister)r.info(d(`Skipped workspace registration (--no-register). Add ${n} to your workspace config manually.`));else{const p=P({prefix:n,workspaceRoot:a});p.status==="already-covered"?r.info(`✓ ${n} is already covered by an existing workspace glob.`):p.status==="added"?r.info(`✓ Registered ${p.entry} in ${p.file}.`):r.warn(`Could not auto-register ${n}: no workspace config found. Add it to pnpm-workspace.yaml or package.json#workspaces manually.`)}r.info(d("Note: project.json / nx tags are not generated. Add them if your tooling needs them."))};export{H as default};