CtrlK
BlogDocsLog inGet started
Tessl Logo

personwise/personwise-customer-onboarding

Every new customer asks the same first-week questions, and your team answers them one call at a time. Turn your confirmed onboarding materials into an interactive digital-human course that walks new customers from signup to first value and answers their questions along the way. Built only on confirmed scope, timelines, and support channels — never invented promises.

68

Quality

85%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

bootstrap.ps1assets/

Generated from the signed PersonWise CLI release model.

Embedded minisign trust root: RWQxXCGcBkNBLF/3q1BbM7xZmDxbaY53bjJYcruIuTbK5DYVm+Nm1ztO

$ErrorActionPreference = "Stop" $action = if ($args.Count -eq 1) { $args[0] } else { "" } if ($action -notin @("--approve-install", "--approve-upgrade", "--approve-rollback")) { [Console]::Error.WriteLine('{"schema_version":"1","ok":false,"error":{"code":"INSTALL_APPROVAL_REQUIRED","message":"Explicit user approval is required before installing, upgrading, or rolling back the PersonWise executable.","retryable":false,"action":"obtain_user_approval"},"request_id":"bootstrap-local"}') exit 2 } if (-not [Environment]::Is64BitOperatingSystem) { throw "Unsupported Windows target" } $nativeSignatureRequired = $false if ($nativeSignatureRequired -and "deferred-founder-approved" -ne "verified") { [Console]::Error.WriteLine('{"schema_version":"1","ok":false,"error":{"code":"NATIVE_SIGNATURE_REQUIRED","message":"This release candidate has not completed Authenticode signing.","retryable":false,"action":"use_verified_release"},"request_id":"bootstrap-local"}') exit 9 } if ([string]::IsNullOrWhiteSpace($env:LOCALAPPDATA)) { throw "LOCALAPPDATA is unavailable" } $targetDir = Join-Path $env:LOCALAPPDATA "PersonWise\bin" $targetPath = Join-Path $targetDir "personwise.exe" [IO.Directory]::CreateDirectory($targetDir) | Out-Null $targetDirInfo = Get-Item -LiteralPath $targetDir -Force if (($targetDirInfo.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw "Install directory must not be a reparse point" } $upgradeHashes = @("151375f65df8b82e63ccba55119ad96badfc11437737452f67b1a274f229b4a5", "20a0dd088b2b19629899ee775b6bdf5189fe55ddd15765891ce76673169d53bb", "2a74bb17410e230a4c5b50e4f7c1407bc198873dac025d56b6294428967fb97c", "6840175ff4e73c136afa55f20f66efb1322d77b03c739cd7b85f03c1c6944b91", "872e3b54d2d0262f682e319e45ad5b3daa1dcd1a3048d3cf12232694c5778cb6", "8bec4b1137ce49e6e4692550a1e1454997a3a0097386e9ce690e7d053795f435", "aa1c88ecf4e1fc0ea44c2e6a9d137c6f8361223737b3ddcbc00e82eb85e67b78", "bcdbc700dfce751967327db0084dd2b30b743c567f758ea662f879ab48b2f8d2") $rollbackHashes = @() $currentDigest = "" if (Test-Path -LiteralPath $targetPath) { $existing = Get-Item -LiteralPath $targetPath -Force if ($action -eq "--approve-install" -or $existing.PSIsContainer -or (($existing.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0)) { throw "Install target is occupied by an unrecognized installation and was not changed" } $currentDigest = (Get-FileHash -LiteralPath $targetPath -Algorithm SHA256).Hash.ToLowerInvariant() $allowedHashes = if ($action -eq "--approve-upgrade") { $upgradeHashes } else { $rollbackHashes } if ($allowedHashes -notcontains $currentDigest) { throw "Existing executable is not recognized by the signed release history and was not changed" } } elseif ($action -ne "--approve-install") { throw "An approved upgrade or rollback requires a recognized existing installation" } $workDir = Join-Path $targetDir (".personwise-install." + [Guid]::NewGuid().ToString("N")) [IO.Directory]::CreateDirectory($workDir) | Out-Null try { $archive = Join-Path $workDir "personwise_1.1.6_windows_amd64.zip" Add-Type -AssemblyName System.Net.Http [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $handler = [Net.Http.HttpClientHandler]::new() $handler.AllowAutoRedirect = $false $client = [Net.Http.HttpClient]::new($handler) $client.Timeout = [TimeSpan]::FromSeconds(300) $request = [Net.Http.HttpRequestMessage]::new([Net.Http.HttpMethod]::Get, "https://releases.personwise.ai/cli/v1.1.6/personwise_1.1.6_windows_amd64.zip") $response = $client.SendAsync($request, [Net.Http.HttpCompletionOption]::ResponseHeadersRead).GetAwaiter().GetResult() try { if (-not $response.IsSuccessStatusCode) { throw "Artifact download failed" } $declaredLength = $response.Content.Headers.ContentLength if ($null -ne $declaredLength -and ($declaredLength -ne 3217769 -or $declaredLength -gt 26214400)) { throw "Artifact size mismatch" } $inputStream = $response.Content.ReadAsStreamAsync().GetAwaiter().GetResult() $outputStream = [IO.File]::Open($archive, [IO.FileMode]::CreateNew, [IO.FileAccess]::Write, [IO.FileShare]::None) try { $buffer = New-Object byte[] 65536 [long]$total = 0 while (($read = $inputStream.Read($buffer, 0, $buffer.Length)) -gt 0) { $total += $read if ($total -gt 3217769 -or $total -gt 26214400) { throw "Artifact size limit exceeded during download" } $outputStream.Write($buffer, 0, $read) } if ($total -ne 3217769) { throw "Artifact size mismatch" } $outputStream.Flush($true) } finally { $outputStream.Dispose() $inputStream.Dispose() } } finally { $response.Dispose() $request.Dispose() $client.Dispose() $handler.Dispose() } $file = Get-Item -LiteralPath $archive if ($file.Length -ne 3217769 -or $file.Length -gt 26214400) { throw "Artifact size mismatch" } $digest = (Get-FileHash -LiteralPath $archive -Algorithm SHA256).Hash.ToLowerInvariant() if ($digest -ne "87a9ac7e0759d4cc944a02b97e12772584388d46f2e9cd1e63e965465a4c36c2") { throw "Artifact checksum mismatch" } $extractDir = Join-Path $workDir "extracted" Expand-Archive -LiteralPath $archive -DestinationPath $extractDir $entries = @(Get-ChildItem -LiteralPath $extractDir -Force -Recurse) $binaryEntry = Get-Item -LiteralPath (Join-Path $extractDir "personwise.exe") -Force $licenseEntry = Get-Item -LiteralPath (Join-Path $extractDir "LICENSE") -Force $noticesEntry = Get-Item -LiteralPath (Join-Path $extractDir "THIRD_PARTY_NOTICES.md") -Force if ($entries.Count -ne 3 -or $binaryEntry.PSIsContainer -or $licenseEntry.PSIsContainer -or $noticesEntry.PSIsContainer -or (($binaryEntry.Attributes -bor $licenseEntry.Attributes -bor $noticesEntry.Attributes) -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw "Archive contents invalid" } $candidate = Join-Path $extractDir "personwise.exe" $candidateDigest = (Get-FileHash -LiteralPath $candidate -Algorithm SHA256).Hash.ToLowerInvariant() if ($candidateDigest -ne "785e53606d6dfd6d5a76093cce402834f1bc18cb298df3d9c175fe157a98380f") { throw "Release executable checksum mismatch" } if ("deferred-founder-approved" -eq "verified") { $signature = Get-AuthenticodeSignature -LiteralPath $candidate if ($signature.Status -ne "Valid" -or $signature.SignerCertificate.Thumbprint -ne "") { throw "Authenticode verification failed" } } $currentTargetDirInfo = Get-Item -LiteralPath $targetDir -Force if ($currentTargetDirInfo.FullName -ne $targetDirInfo.FullName -or (($currentTargetDirInfo.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0)) { throw "Install directory changed during verification" } if ($action -eq "--approve-install") { [IO.File]::Move($candidate, $targetPath) } else { $existing = Get-Item -LiteralPath $targetPath -Force if ($existing.PSIsContainer -or (($existing.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) -or (Get-FileHash -LiteralPath $targetPath -Algorithm SHA256).Hash.ToLowerInvariant() -ne $currentDigest) { throw "Existing installation changed during verification and was not replaced" } $backup = Join-Path $workDir "previous-personwise.exe" [IO.File]::Replace($candidate, $targetPath, $backup, $true) Remove-Item -LiteralPath $backup -Force } [ordered]@{schema_version="1"; ok=$true; data=[ordered]@{path=[IO.Path]::GetFullPath($targetPath); software_version="1.1.6"; cli_contract_version="1.0"; action=$action}; request_id="bootstrap-local"} | ConvertTo-Json -Compress } finally { if (Test-Path -LiteralPath $workDir) { Remove-Item -LiteralPath $workDir -Recurse -Force } }

SKILL.md

tile.json