nemar-cli 0.10.4-PR1402.32d1e4a → 0.10.4-PR1402.ea255a8

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 (2) hide show
  1. package/dist/index.js +2 -11
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -99,7 +99,7 @@ ${t}`,i2e,s2e,a2e=(e,t,r)=>{let n=r===""?"":`with ${r.trim()}() `,o=o2e.bind(nul
99
99
  `)}var MD=!1;var{spawn:B7e}=globalThis.Bun;async function k(e,t={}){let r={...process.env,GIT_TERMINAL_PROMPT:"0",...t.env};for(let u of t.unsetEnv??[])delete r[u];let n=B7e({cmd:e,cwd:t.cwd,stdout:"pipe",stderr:"pipe",env:r}),o=!1,i;if(t.timeout)i=setTimeout(()=>{o=!0,n.kill()},t.timeout);if(LD()){let u=t.cwd?` (cwd=${t.cwd})`:"";_f(l.dim(`$ ${e.join(" ")}${u}`))}let s=await new Response(n.stdout).text(),a=await new Response(n.stderr).text(),c=await n.exited;if(i)clearTimeout(i);if(LD()){if(s.trim())_f(l.dim(s.trimEnd()));if(a.trim())_f(l.yellow(a.trimEnd()));_f(l.dim(`(exit ${c})`))}if(o)return{stdout:s,stderr:a||`Command timed out after ${Math.round(t.timeout/1000)}s`,exitCode:c??1,timedOut:!0};return{stdout:s,stderr:a,exitCode:c,timedOut:!1}}var Pt=O(()=>{Ye()});function z7e(){if(process.platform==="darwin")return"macos";if(process.platform==="win32")return"windows";return"linux"}function gK(e,t=z7e()){return e.installInstructions[t]}function V7e(e){let t=e.match(/(\d+\.\d+(?:\.\d+)?)/);return t?t[1]:void 0}function H7e(){let e=Number(process.env.TEST_PROBE_TIMEOUT_MS);return Number.isFinite(e)&&e>0?e:G7e}async function yK(e){try{let{exitCode:t,stdout:r,timedOut:n}=await k(e.cmd,{timeout:H7e()});if(n)return{available:!1,timedOut:!0};if(t!==0)return{available:!1};return{available:!0,version:V7e(r)}}catch(t){let r=t instanceof Error?t.message:String(t);if(!r.includes("ENOENT")&&!r.includes("not found"))console.error(` Warning: ${e.name} check failed unexpectedly: ${r}`);return{available:!1}}}async function vf(){let e=Object.entries(hK);return Promise.all(e.map(async([t,r])=>{let{available:n,version:o,timedOut:i}=await yK(r);return{key:t,name:r.name,purpose:r.purpose,required:r.required,available:n,version:o,timedOut:i,installInstruction:gK(r)}}))}async function xK(){let t=(await vf()).filter((r)=>r.required&&!r.available);if(t.length===0)return[];console.warn(`
100
100
  Heads up: some tools NEMAR needs for uploading/validating aren't installed yet:`);for(let r of t)console.warn(` - ${r.name} (${r.purpose})`),console.warn(` Install: ${r.installInstruction}`);return console.warn("Run `nemar doctor` anytime to re-check. You can finish signup without them.\n"),t}async function ba(e){let r=U7e[e].map((s)=>hK[s]).filter(Boolean),n=await Promise.all(r.map(async(s)=>{let a=await yK(s);return{check:s,available:a.available,timedOut:a.timedOut}}));for(let s of n)if(s.timedOut&&s.check.required)console.warn(`Warning: ${s.check.name} did not respond to a version check in time; continuing anyway.`);let o=n.filter((s)=>!s.available&&!s.timedOut&&s.check.required).map((s)=>({tool:s.check.name,installInstruction:gK(s.check)}));if(o.length===0)return;let i=[`
101
101
  Missing required tools:`];for(let s of o)i.push(` ${s.tool} not installed`),i.push(` Install: ${s.installInstruction}`);throw Error(i.join(`
102
- `))}var hK,U7e,G7e=4000;var wf=O(()=>{Pt();hK={git:{name:"git",purpose:"version control for dataset metadata",cmd:["git","--version"],required:!0,installInstructions:{macos:"brew install git (or install Xcode Command Line Tools)",linux:"sudo apt-get install git OR sudo dnf install git",windows:"winget install Git.Git (or https://git-scm.com/download/win)"}},"git-annex":{name:"git-annex",purpose:"large-file data transfer (upload/download)",cmd:["git-annex","version"],required:!0,installInstructions:{macos:"brew install git-annex",linux:"sudo apt-get install git-annex OR sudo dnf install git-annex",windows:"Download the installer from https://git-annex.branchable.com/install/Windows/"}},gh:{name:"GitHub CLI (gh)",purpose:"GitHub authentication + repository operations",cmd:["gh","--version"],required:!0,installInstructions:{macos:"brew install gh",linux:"See https://cli.github.com/manual/installation",windows:"winget install GitHub.cli (or: scoop install gh)"}},aws:{name:"AWS CLI",purpose:"S3 data upload/download",cmd:["aws","--version"],required:!0,installInstructions:{macos:"brew install awscli",linux:"pip install awscli OR sudo snap install aws-cli --classic",windows:"winget install Amazon.AWSCLI (or the MSI from https://aws.amazon.com/cli/)"}},deno:{name:"Deno",purpose:"BIDS validation",cmd:["deno","--version"],required:!0,installInstructions:{macos:"brew install deno (or: curl -fsSL https://deno.land/install.sh | sh)",linux:"curl -fsSL https://deno.land/install.sh | sh",windows:"winget install DenoLand.Deno (or: irm https://deno.land/install.ps1 | iex)"}}},U7e={upload:["git-annex","gh","aws","deno"],download:["gh"],clone:["git","gh"],push:["git-annex","gh"],publish:["gh","aws"],update:["git","gh"],release:["git","gh"]}});var _K;var bK=O(()=>{_K={name:"nemar-cli",version:"0.10.4-PR1402.32d1e4a",description:"CLI for NEMAR (Neuroelectromagnetic Data Archive and Tools Resource) dataset management",type:"module",main:"dist/index.js",bin:{nemar:"dist/index.js"},scripts:{dev:"bun run src/index.ts",build:"bun build src/index.ts --outdir dist --target bun --minify && sed '1s|#!/usr/bin/env node|#!/usr/bin/env bun|' dist/index.js > dist/index.js.tmp && mv dist/index.js.tmp dist/index.js",test:"bun test",lint:"biome check src/","migrations:d1-check":"bun run scripts/d1-migration-check.ts","zarr:geometry-check":"bun run backend/scripts/zarr-geometry-conformance.ts","lint:fix":"biome check --fix src/",format:"biome format --write src/",typecheck:"tsc --noEmit && tsc --noEmit -p backend","generate-openapi":"bun run scripts/generate-openapi.ts",prepublishOnly:"bun run build",prepare:"husky",postinstall:"bun scripts/postinstall-check.mjs",deploy:"wrangler deploy",preview:"wrangler dev"},keywords:["nemar","bids","neuroimaging","eeg","emg","datalad","cli"],author:"NEMAR Team",license:"CC-BY-NC-ND-4.0",repository:{type:"git",url:"git+https://github.com/nemarOrg/nemar-cli.git"},bugs:{url:"https://github.com/nemarOrg/nemar-cli/issues"},homepage:"https://docs.nemar.org",engines:{bun:">=1.0.0"},files:["dist","scripts/postinstall-check.mjs","scripts/recover-datasets.json","scripts/withdrawn-datasets.json","README.md","LICENSE"],dependencies:{chalk:"^5.3.0",commander:"^12.1.0",conf:"^13.0.1",inquirer:"^9.2.15",ora:"^8.0.1",semver:"^7.8.5",zod:"^3.23.8"},"lint-staged":{"src/**/*.{ts,tsx}":["biome check --fix"],"backend/src/**/*.{ts,tsx}":["biome check --fix"]},devDependencies:{"@asteasolutions/zod-to-openapi":"^7.3.4","@biomejs/biome":"1.9.4","@types/bun":"latest","@types/inquirer":"^9.0.7","@types/semver":"^7.8.0",ajv:"^8.20.0","ajv-formats":"^3.0.1",bcryptjs:"^3.0.3",husky:"^9.1.7","lint-staged":"^16.3.2",typescript:"^5.5.4",wrangler:"^4.70.0",yaml:"^2.8.4"}}});var hi;var Df=O(()=>{bK();hi=_K.version});import{mkdirSync as K7e,readdirSync as Y7e,unlinkSync as J7e,writeFileSync as X7e}from"fs";import{join as BD}from"path";function $K(){hl=!0}function _a(){return hl}function CK(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function Sf(e){SK=e,Er(`Step: ${e}`)}function $f(){DK=!0}function kK(){return DK}function zD(){EK=!0}function RK(){return EK}function Er(e){if(hl)process.stderr.write(`[debug] ${e}
102
+ `))}var hK,U7e,G7e=4000;var wf=O(()=>{Pt();hK={git:{name:"git",purpose:"version control for dataset metadata",cmd:["git","--version"],required:!0,installInstructions:{macos:"brew install git (or install Xcode Command Line Tools)",linux:"sudo apt-get install git OR sudo dnf install git",windows:"winget install Git.Git (or https://git-scm.com/download/win)"}},"git-annex":{name:"git-annex",purpose:"large-file data transfer (upload/download)",cmd:["git-annex","version"],required:!0,installInstructions:{macos:"brew install git-annex",linux:"sudo apt-get install git-annex OR sudo dnf install git-annex",windows:"Download the installer from https://git-annex.branchable.com/install/Windows/"}},gh:{name:"GitHub CLI (gh)",purpose:"GitHub authentication + repository operations",cmd:["gh","--version"],required:!0,installInstructions:{macos:"brew install gh",linux:"See https://cli.github.com/manual/installation",windows:"winget install GitHub.cli (or: scoop install gh)"}},aws:{name:"AWS CLI",purpose:"S3 data upload/download",cmd:["aws","--version"],required:!0,installInstructions:{macos:"brew install awscli",linux:"pip install awscli OR sudo snap install aws-cli --classic",windows:"winget install Amazon.AWSCLI (or the MSI from https://aws.amazon.com/cli/)"}},deno:{name:"Deno",purpose:"BIDS validation",cmd:["deno","--version"],required:!0,installInstructions:{macos:"brew install deno (or: curl -fsSL https://deno.land/install.sh | sh)",linux:"curl -fsSL https://deno.land/install.sh | sh",windows:"winget install DenoLand.Deno (or: irm https://deno.land/install.ps1 | iex)"}}},U7e={upload:["git-annex","gh","aws","deno"],download:["gh"],clone:["git","gh"],push:["git-annex","gh"],publish:["gh","aws"],update:["git","gh"],release:["git","gh"]}});var _K;var bK=O(()=>{_K={name:"nemar-cli",version:"0.10.4-PR1402.ea255a8",description:"CLI for NEMAR (Neuroelectromagnetic Data Archive and Tools Resource) dataset management",type:"module",main:"dist/index.js",bin:{nemar:"dist/index.js"},scripts:{dev:"bun run src/index.ts",build:"bun build src/index.ts --outdir dist --target bun --minify && sed '1s|#!/usr/bin/env node|#!/usr/bin/env bun|' dist/index.js > dist/index.js.tmp && mv dist/index.js.tmp dist/index.js",test:"bun test",lint:"biome check src/","migrations:d1-check":"bun run scripts/d1-migration-check.ts","zarr:geometry-check":"bun run backend/scripts/zarr-geometry-conformance.ts","lint:fix":"biome check --fix src/",format:"biome format --write src/",typecheck:"tsc --noEmit && tsc --noEmit -p backend","generate-openapi":"bun run scripts/generate-openapi.ts",prepublishOnly:"bun run build",prepare:"husky",postinstall:"bun scripts/postinstall-check.mjs",deploy:"wrangler deploy",preview:"wrangler dev"},keywords:["nemar","bids","neuroimaging","eeg","emg","datalad","cli"],author:"NEMAR Team",license:"CC-BY-NC-ND-4.0",repository:{type:"git",url:"git+https://github.com/nemarOrg/nemar-cli.git"},bugs:{url:"https://github.com/nemarOrg/nemar-cli/issues"},homepage:"https://docs.nemar.org",engines:{bun:">=1.0.0"},files:["dist","scripts/postinstall-check.mjs","scripts/recover-datasets.json","scripts/withdrawn-datasets.json","README.md","LICENSE"],dependencies:{chalk:"^5.3.0",commander:"^12.1.0",conf:"^13.0.1",inquirer:"^9.2.15",ora:"^8.0.1",semver:"^7.8.5",zod:"^3.23.8"},"lint-staged":{"src/**/*.{ts,tsx}":["biome check --fix"],"backend/src/**/*.{ts,tsx}":["biome check --fix"]},devDependencies:{"@asteasolutions/zod-to-openapi":"^7.3.4","@biomejs/biome":"1.9.4","@types/bun":"latest","@types/inquirer":"^9.0.7","@types/semver":"^7.8.0",ajv:"^8.20.0","ajv-formats":"^3.0.1",bcryptjs:"^3.0.3",husky:"^9.1.7","lint-staged":"^16.3.2",typescript:"^5.5.4",wrangler:"^4.70.0",yaml:"^2.8.4"}}});var hi;var Df=O(()=>{bK();hi=_K.version});import{mkdirSync as K7e,readdirSync as Y7e,unlinkSync as J7e,writeFileSync as X7e}from"fs";import{join as BD}from"path";function $K(){hl=!0}function _a(){return hl}function CK(e,t=process.env){return e.includes("--debug")||t.NEMAR_DEBUG==="1"}function Sf(e){SK=e,Er(`Step: ${e}`)}function $f(){DK=!0}function kK(){return DK}function zD(){EK=!0}function RK(){return EK}function Er(e){if(hl)process.stderr.write(`[debug] ${e}
103
103
  `)}function tMe(e){let t={};for(let[r,n]of Object.entries(e))t[r]=eMe.has(r.toLowerCase())?"[REDACTED]":n;return t}function OK(e){let t=e.indexOf("@");if(t<=0)return"***";return`${e[0]}***${e.slice(t)}`}function UD(e,t,r=0){if(r>nMe)return"[REDACTED: depth]";if(Array.isArray(t))return t.map((n)=>UD(e,n,r+1));if(t&&typeof t==="object"){let n={};for(let[o,i]of Object.entries(t))n[o]=UD(o,i,r+1);return n}if(typeof t==="string"){if(rMe.test(e))return"[REDACTED]";return t.replace(AK,OK)}return t}function VD(e){return e.replace(oMe,"Bearer [REDACTED]").replace(iMe,"[REDACTED_AWS_KEY]").replace(sMe,"$1[REDACTED]").replace(aMe,"$1$2=[REDACTED]").replace(AK,OK)}function cMe(e){return VD(e)}function vK(e,t=Q7e){if(e===void 0)return;let r=e;try{let n=JSON.parse(e);r=JSON.stringify(UD("",n))}catch{}if(r=VD(r),Buffer.byteLength(r,"utf8")>t)r=`${Buffer.from(r,"utf8").subarray(0,t).toString("utf8")}... [truncated]`;return r}function gg(e){if(!hl)return;let t=cMe(e.url);try{let r={...e,url:t,requestHeaders:e.requestHeaders?tMe(e.requestHeaders):void 0,requestBody:vK(e.requestBody),responseBody:vK(e.responseBody)};hg.push(r),Er(`${e.method} ${t} -> ${e.status??"ERROR"} (${e.durationMs}ms)`)}catch(r){let n=P(r);hg.push({method:e.method,url:t,status:e.status,durationMs:e.durationMs,note:`redaction failed: ${n}`}),Er(`redaction failed for ${e.method} ${t}: ${n}`)}}async function lMe(){let e=[];try{let t=process.versions.bun?`Bun ${process.versions.bun}`:`Node ${process.version}`;e.push(`CLI version: ${hi}`),e.push(`OS/Arch: ${process.platform}/${process.arch}`),e.push(`Runtime: ${t}`)}catch(t){e.push(`(could not read CLI/OS/runtime info: ${P(t)})`)}e.push(""),e.push("Active account:");try{let t=rt();if(t.apiKey){if(t.username)e.push(` Username: ${t.username}`);if(e.push(` API URL: ${t.apiUrl}`),t.role)e.push(` Role: ${t.role}`);e.push(` Sandbox completed: ${!!t.sandboxCompleted}`)}else e.push(" (not authenticated)")}catch(t){e.push(` (could not read account config: ${P(t)})`)}e.push(""),e.push("External tools:");try{let t=await vf();for(let r of t){let n=r.available?r.version??"installed":r.timedOut?"(timed out)":"not installed";e.push(` ${r.name}: ${n}`)}}catch(t){e.push(` (could not probe external tools: ${P(t)})`)}return e}async function GD(){return(await lMe()).join(`
104
104
  `)}async function FK(){if(!hl||mg!==void 0)return;try{mg=await GD()}catch(e){let t=P(e);mg=`(could not build environment report: ${t})`,Er(`environment snapshot failed: ${t}`)}}function IK(e){if(wK.has(e))return{flag:e};for(let t of wK){if(!e.startsWith(t)||e.length<=t.length)continue;if(t.length===2)return{flag:t,kind:"short-attached"};if(e[t.length]==="=")return{flag:t,kind:"long-eq"}}return null}function uMe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],o=IK(n);if(!o){t.push(n);continue}if(o.kind==="long-eq")t.push(`${o.flag}=[REDACTED]`);else if(o.kind==="short-attached")t.push(`${o.flag}[REDACTED]`);else if(t.push(n),r+1<e.length)t.push("[REDACTED]"),r++}return t}function dMe(e){let t=[];for(let r=0;r<e.length;r++){let n=e[r],o=IK(n);if(!o){t.push(n);continue}if(!o.kind&&r+1<e.length)r++}return t}function fMe(e){let t=[];for(let n of dMe(e)){if(n.startsWith("-"))continue;if(t.push(n),t.length===2)break}return(t.length>0?t.join("-"):"nemar").replace(/[^a-zA-Z0-9_-]/g,"_")}function pMe(e,t){let r=[];if(r.push("NEMAR CLI Debug Log"),r.push(`Generated: ${new Date().toISOString()}`),r.push(`Command: nemar ${VD(uMe(e).join(" "))}`),r.push(""),r.push(mg??"(environment snapshot unavailable)"),r.push(""),r.push("HTTP requests:"),hg.length===0)r.push(" (none)");else hg.forEach((n,o)=>{if(r.push(` [${o+1}] ${n.method} ${n.url} -> ${n.status??"ERROR"} (${n.durationMs}ms)`),n.error)r.push(` Error: ${n.error}`);if(n.note)r.push(` Note: ${n.note}`);if(n.requestHeaders)r.push(` Request headers: ${JSON.stringify(n.requestHeaders)}`);if(n.requestBody)r.push(` Request body: ${n.requestBody}`);if(n.responseBody)r.push(` Response body: ${n.responseBody}`)});return r.push(""),r.push(`Failing step: ${SK??"(none recorded)"}`),r.push(`Exit code: ${t}`),`${r.join(`
105
105
  `)}
@@ -991,18 +991,10 @@ Description:
991
991
  always downloaded.)
992
992
 
993
993
  Requirements:
994
- - git-annex installed (NEMAR datasets only), or --http for a file snapshot
994
+ - git-annex installed (NEMAR datasets only)
995
995
  - NEMAR account (for private datasets)
996
996
  - AWS CLI recommended for OpenNeuro downloads (falls back to HTTPS)
997
997
 
998
- Without git-annex:
999
- --http downloads over plain HTTP with no git, git-annex or GitHub account,
1000
- and is used automatically when git-annex is missing. It honours the same
1001
- filters and writes the same BIDS tree, but the result is a file snapshot,
1002
- not a repository: 'commit', 'push' and 'update' need a git-annex clone.
1003
- Re-running resumes, since a file already present at its declared size is
1004
- skipped.
1005
-
1006
998
  Examples:
1007
999
  $ nemar dataset download nm000104 # Download NEMAR dataset (skips stimuli/derivatives)
1008
1000
  $ nemar dataset download nm000104 -o ./data # Custom output directory
@@ -1011,7 +1003,6 @@ Examples:
1011
1003
  $ nemar dataset download nm000104 --resume # Resume partial download
1012
1004
  $ nemar dataset download nm000104 --update # Pull only the version diff
1013
1005
  $ nemar dataset download nm000104 --update --prune # Plus drop orphan objects
1014
- $ nemar dataset download nm000104 --http # No git-annex needed (snapshot)
1015
1006
  $ nemar dataset download nm000104 --subjects sub-01,02 # Only these subjects
1016
1007
  $ nemar dataset download nm000104 --tasks rest --datatypes eeg # Subset
1017
1008
  $ nemar dataset download nm000104 --stimuli # Also download stimuli/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nemar-cli",
3
- "version": "0.10.4-PR1402.32d1e4a",
3
+ "version": "0.10.4-PR1402.ea255a8",
4
4
  "description": "CLI for NEMAR (Neuroelectromagnetic Data Archive and Tools Resource) dataset management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",