param( [string] $SpaceName = "sub2api", [string] $Owner = "", [switch] $Private ) $ErrorActionPreference = "Stop" if (-not $env:HF_TOKEN) { throw "Set HF_TOKEN first. Example: `$env:HF_TOKEN = 'hf_xxx'" } $root = Resolve-Path (Join-Path $PSScriptRoot "..") Set-Location $root $requiredFiles = @( "Dockerfile", "sub2api-hf-rootfs.tar", "start-space.sh", "README.md", "PUBLIC_USAGE.md", "ADMIN_SETUP.md", ".env.example", ".gitattributes", ".gitignore", "package.json", "scripts/check-supabase.mjs", "scripts/generate-secrets.ps1", "scripts/deploy-hf-space.ps1" ) foreach ($file in $requiredFiles) { if (-not (Test-Path -LiteralPath (Join-Path $root $file))) { throw "Missing deployment file: $file" } } $headers = @{ Authorization = "Bearer $env:HF_TOKEN" } $whoami = Invoke-RestMethod -Uri "https://huggingface.co/api/whoami-v2" -Headers $headers -Method GET if (-not $Owner) { $Owner = $whoami.name } $repoId = "$Owner/$SpaceName" $createBody = @{ name = $SpaceName type = "space" sdk = "docker" private = [bool] $Private } if ($Owner -ne $whoami.name) { $createBody.organization = $Owner } try { Invoke-RestMethod ` -Uri "https://huggingface.co/api/repos/create" ` -Headers ($headers + @{ "Content-Type" = "application/json" }) ` -Method POST ` -Body ($createBody | ConvertTo-Json -Depth 5) | Out-Null Write-Host "Created Hugging Face Space: $repoId" } catch { $statusCode = $null if ($_.Exception.Response) { $statusCode = [int] $_.Exception.Response.StatusCode } if ($statusCode -eq 409) { Write-Host "Space already exists, continuing: $repoId" } else { throw } } git lfs install git add ` Dockerfile ` sub2api-hf-rootfs.tar ` start-space.sh ` README.md ` PUBLIC_USAGE.md ` ADMIN_SETUP.md ` .env.example ` .gitattributes ` .gitignore ` package.json ` scripts/check-supabase.mjs ` scripts/generate-secrets.ps1 ` scripts/deploy-hf-space.ps1 $hasCommit = $true git rev-parse --verify HEAD *> $null if ($LASTEXITCODE -ne 0) { $hasCommit = $false } $hasStagedChanges = $false git diff --cached --quiet if ($LASTEXITCODE -ne 0) { $hasStagedChanges = $true } if ($hasStagedChanges) { git commit -m "Deploy sub2api rootfs tar on HF Space" } elseif (-not $hasCommit) { throw "No files were staged and the repository has no commits. Check git status." } else { Write-Host "No new local files to commit." } $pushUrl = "https://hf_user:$($env:HF_TOKEN)@huggingface.co/spaces/$repoId" git push $pushUrl HEAD:main Write-Host "" Write-Host "Deployment files pushed. Space page:" Write-Host "https://huggingface.co/spaces/$repoId" Write-Host "" Write-Host "Public app URL after build:" Write-Host "https://$($Owner)-$($SpaceName).hf.space" Write-Host "" Write-Host "Next: configure Space Settings -> Variables and secrets, then restart the Space."