Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 0.11.1 — 2026-10-27

- Fixed: the program did not start ("Failed to determine default extraction location") when TEMP pointed to a folder
that no longer exists - the Temp\<n> folder of a remote desktop session after a clean-up - e.g. from the Start menu
or cmd (PowerShell creates that folder again, so it worked there). The SQLite library (e_sqlite3.dll) is now next
to adolens.exe instead of being extracted to TEMP at start, and the installer renames it to *.old like a running
adolens.exe when an open Claude session holds it. Images of attachments saved by the CLI create the TEMP folder
when it is missing.

## 0.11.0 — 2026-10-26

Settings in a window.
Expand Down
4 changes: 3 additions & 1 deletion pack.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ New-Item -ItemType Directory -Force -Path $stage | Out-Null

$publishArgs = @(
'publish', $proj, '-c', 'Release', '-r', 'win-x64', '-o', (Join-Path $stage 'bin'), '--nologo',
'--self-contained', 'true', '-p:PublishSingleFile=true', '-p:IncludeNativeLibrariesForSelfExtract=true',
# Native libraries (SQLite: e_sqlite3.dll) stay next to the exe instead of being extracted to TEMP at start: the TEMP
# of a remote desktop session (Temp\<n>) may no longer exist, and the exe would not start at all (Start menu, cmd).
'--self-contained', 'true', '-p:PublishSingleFile=true', '-p:IncludeNativeLibrariesForSelfExtract=false',
'-p:EnableCompressionInSingleFile=true', '-p:PublishReadyToRun=true',
# No debug information: a release build would otherwise carry the local path of its .pdb file.
'-p:DebugType=None', '-p:DebugSymbols=false'
Expand Down
38 changes: 31 additions & 7 deletions packaging/inno/ado-lens.iss
Original file line number Diff line number Diff line change
Expand Up @@ -589,16 +589,40 @@ begin
end;
end;

{ A running adolens.exe (an open Claude session) cannot be overwritten but can be renamed; the server removes *.old
files when it starts. }
function PrepareToInstall(var NeedsRestart: Boolean): String;
{ Files of the program's bin folder matching Pattern get the suffix .<time>.old. The names are collected first: renaming while
enumerating could give a file twice. }
procedure RenameInUse(Pattern: String);
var
Exe: String;
Bin, Stamp: String;
Found: TFindRec;
Names: TArrayOfString;
I: Integer;
begin
Bin := ExpandConstant('{app}\bin\');
Stamp := GetDateTimeString('yyyymmddhhnnss', #0, #0);
if FindFirst(Bin + Pattern, Found) then
try
repeat
if (Found.Attributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
SetArrayLength(Names, GetArrayLength(Names) + 1);
Names[GetArrayLength(Names) - 1] := Found.Name;
end;
until not FindNext(Found);
finally
FindClose(Found);
end;
for I := 0 to GetArrayLength(Names) - 1 do
RenameFile(Bin + Names[I], Bin + Names[I] + '.' + Stamp + '.old');
end;

{ A running adolens.exe (an open Claude session) and the SQLite library it loaded (e_sqlite3.dll) cannot be
overwritten but can be renamed; the program removes *.old files when it starts. }
function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
Result := '';
Exe := ExpandConstant('{app}\bin\adolens.exe');
if FileExists(Exe) then
RenameFile(Exe, Exe + '.' + GetDateTimeString('yyyymmddhhnnss', #0, #0) + '.old');
RenameInUse('*.exe');
RenameInUse('*.dll');
end;

procedure CurStepChanged(CurStep: TSetupStep);
Expand Down
2 changes: 1 addition & 1 deletion release.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ $archive = [IO.Compression.ZipFile]::OpenRead($zip)
$entries = @($archive.Entries | ForEach-Object { $_.FullName })
$archive.Dispose()
Remove-Item $tmp -Recurse -Force
foreach ($e in 'ado-lens/install.ps1', 'ado-lens/bin/adolens.exe', 'ado-lens/CHANGELOG.md', 'ado-lens/SECURITY.md') {
foreach ($e in 'ado-lens/install.ps1', 'ado-lens/bin/adolens.exe', 'ado-lens/bin/e_sqlite3.dll', 'ado-lens/CHANGELOG.md', 'ado-lens/SECURITY.md') {
if ($entries -notcontains $e) { Fail "$asset has no $e (entries: $($entries -join ', '))" }
}
Ok "${asset}: SHA-256 matches, layout ok, $(if ($Pre) { 'test release' } else { 'regular release' })"
Expand Down
2 changes: 1 addition & 1 deletion src/AdoLens/AdoLens.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<AssemblyTitle>ADO Lens for Azure DevOps</AssemblyTitle>
<Description>Azure DevOps (work items, boards, wiki, Git and TFVC, pipelines) served to AI assistants over MCP</Description>
<Copyright>Copyright © 2026 WillowDev</Copyright>
<Version>0.11.0</Version>
<Version>0.11.1</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
2 changes: 2 additions & 0 deletions src/AdoLens/Cli.cs
Original file line number Diff line number Diff line change
Expand Up @@ -935,6 +935,8 @@ public async Task<int> AttachmentsAsync()
foreach (var i in images)
{
// A terminal cannot show images: they are written to the temporary folder.
// TEMP of a remote desktop session may be gone: create it.
Directory.CreateDirectory(Path.GetTempPath());
var path = Path.Combine(Path.GetTempPath(), $"adolens-{id}-{Guid.NewGuid():N}"[..24] + (i.Mime == "image/jpeg" ? ".jpg" : "." + i.Mime[6..]));
await File.WriteAllBytesAsync(path, i.Bytes);
Console.WriteLine($"image: {path}");
Expand Down