diff --git a/.gitignore b/.gitignore index a44e7f1..02a6e36 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,9 @@ packages/ # Publish output publish/ +# installers +SemanticDeveloper/Installers/Linux/pkgroot/ + # OS files [Dd]esktop.ini [Tt]humbs.db diff --git a/NOTICE b/NOTICE index dac21a7..d6fa670 100644 --- a/NOTICE +++ b/NOTICE @@ -1,18 +1,18 @@ NOTICE ====== -This project integrates with Codex CLI (https://github.com/openai/codex). +SemanticDeveloper -Codex CLI is licensed under the MIT License: +Copyright (c) 2025 Stainless Designer LLC -Copyright (c) OpenAI +Licensed under the Apache License, Version 2.0 (the "License"). +You may obtain a copy of the License at: + http://www.apache.org/licenses/LICENSE-2.0 -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Third-party attributions +- Codex CLI (https://github.com/openai/codex) + Licensed under the Apache License, Version 2.0. + Copyright (c) OpenAI and contributors. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The contents of this NOTICE file are for informational purposes only and +do not modify the License. diff --git a/SemanticDeveloper/Installers/Linux/Installer.Linux.csproj b/SemanticDeveloper/Installers/Linux/Installer.Linux.csproj new file mode 100644 index 0000000..9a02d6f --- /dev/null +++ b/SemanticDeveloper/Installers/Linux/Installer.Linux.csproj @@ -0,0 +1,21 @@ + + + net8.0 + false + enable + SemanticDeveloper.Installer.Linux + SemanticDeveloper.Installer.Linux + Exe + disable + + + + + + + + + + + + diff --git a/SemanticDeveloper/Installers/Linux/README.md b/SemanticDeveloper/Installers/Linux/README.md new file mode 100644 index 0000000..746e700 --- /dev/null +++ b/SemanticDeveloper/Installers/Linux/README.md @@ -0,0 +1,22 @@ +SemanticDeveloper — Linux Installer Project (Debian/Ubuntu) + +Overview +- Produces a `.deb` package for Debian/Ubuntu following Avalonia guidance. + +Prerequisites (run on Debian/Ubuntu) +- .NET 8 SDK +- `dpkg-deb`, `fakeroot` + +Build steps +- Open a terminal in this folder. +- Make the script executable: `chmod +x build_deb.sh` +- x64: `./build_deb.sh linux-x64` +- arm64: `./build_deb.sh linux-arm64` +- Result: `dist/semantic-developer__.deb` + +Notes +- Installs under `/opt/semantic-developer` and adds launcher under `/usr/share/applications`. + +References +- Avalonia deployment (Debian/Ubuntu): https://docs.avaloniaui.net/docs/deployment/debian-ubuntu + diff --git a/SemanticDeveloper/Installers/Linux/build_deb.sh b/SemanticDeveloper/Installers/Linux/build_deb.sh new file mode 100755 index 0000000..b976ec5 --- /dev/null +++ b/SemanticDeveloper/Installers/Linux/build_deb.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +set -euo pipefail + +RID="${1:-linux-x64}" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/../../" && pwd)" +APP_PROJ="$ROOT/SemanticDeveloper/SemanticDeveloper.csproj" +PUBLISH_DIR="$SCRIPT_DIR/out/publish" +PKG_ROOT="$SCRIPT_DIR/pkgroot" +DIST_DIR="$SCRIPT_DIR/dist" +VERSION="1.0.1" +ARCH="amd64" +if [[ "$RID" == "linux-arm64" ]]; then ARCH="arm64"; fi + +rm -rf "$PKG_ROOT" "$PUBLISH_DIR" +mkdir -p "$PUBLISH_DIR" "$PKG_ROOT/opt/semantic-developer" "$PKG_ROOT/usr/bin" "$PKG_ROOT/usr/share/applications" "$DIST_DIR" + +echo "Publishing SemanticDeveloper for $RID ..." +dotnet publish "$APP_PROJ" -c Release -r "$RID" --self-contained true \ + /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=false \ + -o "$PUBLISH_DIR" + +echo "Staging files ..." +cp -R "$PUBLISH_DIR"/* "$PKG_ROOT/opt/semantic-developer/" +ln -sf "/opt/semantic-developer/SemanticDeveloper" "$PKG_ROOT/usr/bin/semantic-developer" + +echo "Adding desktop entry ..." +install -m 644 "$SCRIPT_DIR/debian/usr/share/applications/semantic-developer.desktop" "$PKG_ROOT/usr/share/applications/semantic-developer.desktop" + +echo "Preparing control files ..." +mkdir -p "$PKG_ROOT/DEBIAN" +CONTROL_FILE="$PKG_ROOT/DEBIAN/control" +cat > "$CONTROL_FILE" < + + net8.0 + false + enable + SemanticDeveloper.Installer.Windows + SemanticDeveloper.Installer.Windows + Exe + disable + + + + + + + + + + + + diff --git a/SemanticDeveloper/Installers/Windows/README.md b/SemanticDeveloper/Installers/Windows/README.md new file mode 100644 index 0000000..52f0939 --- /dev/null +++ b/SemanticDeveloper/Installers/Windows/README.md @@ -0,0 +1,29 @@ +SemanticDeveloper — Windows Installer Project + +Overview +- Produces a distributable for Windows: either a ZIP of the self-contained publish output or an installer using Inno Setup (optional). +- Follows Avalonia guidance: publish self-contained, single-file, no trimming. + +Prerequisites +- Windows 10/11 +- .NET 8 SDK +- Optional (for .exe installer): Inno Setup 6 (`iscc.exe`) added to PATH + +Build steps (ZIP package) +- Open a PowerShell prompt in this folder. +- Run: `./build.ps1 -Rid win-x64 -Mode Zip` +- Result: `artifacts/SemanticDeveloper-win-x64.zip` + +Build steps (Inno Setup installer) +- Ensure Inno Setup is installed and `iscc.exe` is on PATH. +- Run: `./build.ps1 -Rid win-x64 -Mode Inno` +- Result: `artifacts/SemanticDeveloperSetup-win-x64.exe` + +Notes +- The script publishes the app from `../..//SemanticDeveloper/SemanticDeveloper.csproj`. +- To build for ARM64, use `-Rid win-arm64`. +- You can customize app metadata in `SemanticDeveloper.iss`. + +References +- Avalonia deployment (Windows): https://docs.avaloniaui.net/docs/deployment/windows + diff --git a/SemanticDeveloper/Installers/Windows/SemanticDeveloper.iss b/SemanticDeveloper/Installers/Windows/SemanticDeveloper.iss new file mode 100644 index 0000000..9bc5590 --- /dev/null +++ b/SemanticDeveloper/Installers/Windows/SemanticDeveloper.iss @@ -0,0 +1,48 @@ +; Inno Setup script to package SemanticDeveloper +#define AppName "SemanticDeveloper" +#define AppVersion "1.0.1" +#define Publisher "Stainless Designer LLC" +#define URL "https://github.com/stainless-design/semantic-developer" +#ifndef RID +#define RID "win-x64" +#endif +#ifndef OutDir +#define OutDir "out\\publish" +#endif +#ifndef ArtifactsDir +#define ArtifactsDir "artifacts" +#endif + +[Setup] +AppId={{C21A3B89-8F5C-4E9F-9F5D-7B5C6A5B3A99} +AppName={#AppName} +AppVersion={#AppVersion} +AppPublisher={#Publisher} +AppPublisherURL={#URL} +DefaultDirName={autopf64}\{#AppName} +DefaultGroupName={#AppName} +UninstallDisplayIcon={app}\SemanticDeveloper.exe +OutputBaseFilename=SemanticDeveloperSetup-{#RID} +OutputDir={#ArtifactsDir} +Compression=lzma2 +SolidCompression=yes +DisableDirPage=auto +DisableProgramGroupPage=auto +ArchitecturesInstallIn64BitMode=x64 arm64 +SetupIconFile=..\\..\\SemanticDeveloper\\Images\\SemanticDeveloperLogo.ico + +[Languages] +Name: "en"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "Create a &desktop shortcut"; GroupDescription: "Additional icons:"; Flags: unchecked + +[Files] +Source: "{#OutDir}/*"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion + +[Icons] +Name: "{autoprograms}\{#AppName}"; Filename: "{app}\SemanticDeveloper.exe" +Name: "{autodesktop}\{#AppName}"; Filename: "{app}\SemanticDeveloper.exe"; Tasks: desktopicon + +[Run] +Filename: "{app}\SemanticDeveloper.exe"; Description: "Launch {#AppName}"; Flags: nowait postinstall skipifsilent diff --git a/SemanticDeveloper/Installers/Windows/build.ps1 b/SemanticDeveloper/Installers/Windows/build.ps1 new file mode 100644 index 0000000..7238d4f --- /dev/null +++ b/SemanticDeveloper/Installers/Windows/build.ps1 @@ -0,0 +1,38 @@ +$ErrorActionPreference = 'Stop' +param( + [string]$Rid = 'win-x64', + [ValidateSet('Zip','Inno')][string]$Mode = 'Zip' +) + +$root = Resolve-Path "$PSScriptRoot/../../" +$appProj = Join-Path $root 'SemanticDeveloper/SemanticDeveloper.csproj' +$outDir = Join-Path $PSScriptRoot 'out/publish' +$artifacts = Join-Path $PSScriptRoot 'artifacts' +New-Item -Force -ItemType Directory -Path $outDir | Out-Null +New-Item -Force -ItemType Directory -Path $artifacts | Out-Null + +Write-Host "Publishing SemanticDeveloper for $Rid ..." +dotnet publish $appProj -c Release -r $Rid --self-contained true /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=false -o $outDir + +if ($LASTEXITCODE -ne 0) { throw 'Publish failed.' } + +if ($Mode -eq 'Zip') { + $zip = Join-Path $artifacts "SemanticDeveloper-$Rid.zip" + if (Test-Path $zip) { Remove-Item $zip -Force } + Write-Host "Zipping to $zip ..." + Add-Type -AssemblyName System.IO.Compression.FileSystem + [System.IO.Compression.ZipFile]::CreateFromDirectory($outDir, $zip) + Write-Host "Done: $zip" + exit 0 +} + +if ($Mode -eq 'Inno') { + $iscc = (Get-Command iscc.exe -ErrorAction SilentlyContinue) + if (-not $iscc) { throw 'Inno Setup (iscc.exe) not found in PATH.' } + $iss = Join-Path $PSScriptRoot 'SemanticDeveloper.iss' + & $iscc $iss /DRID=$Rid /DOutDir=$outDir /DArtifactsDir=$artifacts + if ($LASTEXITCODE -ne 0) { throw 'Inno Setup build failed.' } + Write-Host "Done. See artifacts folder." + exit 0 +} + diff --git a/SemanticDeveloper/Installers/macOS/Info.plist b/SemanticDeveloper/Installers/macOS/Info.plist new file mode 100644 index 0000000..b4d1dda --- /dev/null +++ b/SemanticDeveloper/Installers/macOS/Info.plist @@ -0,0 +1,27 @@ + + + + + CFBundleName + SemanticDeveloper + CFBundleDisplayName + SemanticDeveloper + CFBundleIdentifier + com.stainlessdesigner.semanticdeveloper + CFBundleVersion + 1.0.1 + CFBundleShortVersionString + 1.0.1 + CFBundlePackageType + APPL + CFBundleExecutable + SemanticDeveloper + LSMinimumSystemVersion + 11.0 + LSApplicationCategoryType + public.app-category.developer-tools + NSHighResolutionCapable + + + + diff --git a/SemanticDeveloper/Installers/macOS/Installer.macOS.csproj b/SemanticDeveloper/Installers/macOS/Installer.macOS.csproj new file mode 100644 index 0000000..e5dffd1 --- /dev/null +++ b/SemanticDeveloper/Installers/macOS/Installer.macOS.csproj @@ -0,0 +1,22 @@ + + + net8.0 + false + enable + SemanticDeveloper.Installer.macOS + SemanticDeveloper.Installer.macOS + Exe + disable + + + + + + + + + + + + + diff --git a/SemanticDeveloper/Installers/macOS/README.md b/SemanticDeveloper/Installers/macOS/README.md new file mode 100644 index 0000000..191d46e --- /dev/null +++ b/SemanticDeveloper/Installers/macOS/README.md @@ -0,0 +1,25 @@ +SemanticDeveloper — macOS Installer Project + +Overview +- Produces a macOS `.app` bundle and a `.dmg` image following Avalonia guidance. + +Prerequisites (run on macOS) +- macOS 12+ +- Xcode command line tools (for `hdiutil`) +- .NET 8 SDK + +Build steps +- Open a terminal in this folder. +- Make the script executable: `chmod +x create_dmg.sh` +- Intel: `./create_dmg.sh osx-x64` +- Apple Silicon: `./create_dmg.sh osx-arm64` +- Result: `dist/SemanticDeveloper-osx-.dmg` + +Notes +- The script creates `SemanticDeveloper.app` and then a DMG. +- You may need to sign and notarize for distribution. + +References +- Avalonia deployment (macOS): https://docs.avaloniaui.net/docs/deployment/macOS +- Apple notarization: https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution + diff --git a/SemanticDeveloper/Installers/macOS/create_dmg.sh b/SemanticDeveloper/Installers/macOS/create_dmg.sh new file mode 100644 index 0000000..4765f3a --- /dev/null +++ b/SemanticDeveloper/Installers/macOS/create_dmg.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +set -euo pipefail + +RID="${1:-osx-x64}" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/../../" && pwd)" +APP_PROJ="$ROOT/SemanticDeveloper/SemanticDeveloper.csproj" +PUBLISH_DIR="$SCRIPT_DIR/out/publish" +APP_DIR="$SCRIPT_DIR/out/SemanticDeveloper.app" +CONTENTS_DIR="$APP_DIR/Contents" +MACOS_DIR="$CONTENTS_DIR/MacOS" +RESOURCES_DIR="$CONTENTS_DIR/Resources" +DIST_DIR="$SCRIPT_DIR/dist" + +mkdir -p "$PUBLISH_DIR" "$MACOS_DIR" "$RESOURCES_DIR" "$DIST_DIR" + +echo "Publishing SemanticDeveloper for $RID ..." +dotnet publish "$APP_PROJ" -c Release -r "$RID" --self-contained true \ + /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=false \ + -o "$PUBLISH_DIR" + +echo "Creating .app bundle ..." +cp -R "$SCRIPT_DIR/Info.plist" "$CONTENTS_DIR/Info.plist" +cp "$ROOT/SemanticDeveloper/Images/SemanticDeveloperLogo.ico" "$RESOURCES_DIR/Icon.icns" || true +cp -R "$PUBLISH_DIR"/* "$MACOS_DIR/" +chmod +x "$MACOS_DIR/SemanticDeveloper" + +DMG_NAME="SemanticDeveloper-${RID}.dmg" +DMG_PATH="$DIST_DIR/$DMG_NAME" +test -f "$DMG_PATH" && rm -f "$DMG_PATH" + +echo "Creating DMG ..." +hdiutil create -volname "SemanticDeveloper" -srcfolder "$APP_DIR" -ov -format UDZO "$DMG_PATH" +echo "Done: $DMG_PATH" + diff --git a/SemanticDeveloper/SemanticDeveloper.sln b/SemanticDeveloper/SemanticDeveloper.sln index 8af17d5..73e0a25 100644 --- a/SemanticDeveloper/SemanticDeveloper.sln +++ b/SemanticDeveloper/SemanticDeveloper.sln @@ -2,6 +2,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SemanticDeveloper", "SemanticDeveloper\SemanticDeveloper.csproj", "{61A7620C-C963-4DEA-9E5E-EB218D51612E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer.Windows", "Installers\Windows\Installer.Windows.csproj", "{C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer.macOS", "Installers\macOS\Installer.macOS.csproj", "{88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer.Linux", "Installers\Linux\Installer.Linux.csproj", "{F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -12,5 +18,17 @@ Global {61A7620C-C963-4DEA-9E5E-EB218D51612E}.Debug|Any CPU.Build.0 = Debug|Any CPU {61A7620C-C963-4DEA-9E5E-EB218D51612E}.Release|Any CPU.ActiveCfg = Release|Any CPU {61A7620C-C963-4DEA-9E5E-EB218D51612E}.Release|Any CPU.Build.0 = Release|Any CPU + {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Release|Any CPU.Build.0 = Release|Any CPU + {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Release|Any CPU.Build.0 = Release|Any CPU + {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user b/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user index ece89d2..f8b8d6d 100644 --- a/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user +++ b/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user @@ -1,3 +1,4 @@  ForceIncluded - ForceIncluded \ No newline at end of file + ForceIncluded + \ No newline at end of file diff --git a/SemanticDeveloper/SemanticDeveloper/README.md b/SemanticDeveloper/SemanticDeveloper/README.md index 4011f54..f8ef093 100644 --- a/SemanticDeveloper/SemanticDeveloper/README.md +++ b/SemanticDeveloper/SemanticDeveloper/README.md @@ -221,4 +221,12 @@ Selection behavior: - Proto mode is enforced in code; the app does not fall back to non‑proto modes. - Settings are stored under the OS‑specific application data directory and loaded on startup. - The log view uses AvaloniaEdit + TextMate (Dark+) for better legibility and simple JSON syntax coloring. + +## Installers + +- Windows: see `SemanticDeveloper/Installers/Windows` for `build.ps1` to produce a ZIP or Inno Setup installer. +- macOS: see `SemanticDeveloper/Installers/macOS` for `create_dmg.sh` to produce a `.app` and `.dmg`. +- Linux (Debian/Ubuntu): see `SemanticDeveloper/Installers/Linux` for `build_deb.sh` to produce a `.deb`. + +Each installer project contains detailed prerequisites and step-by-step instructions. - Token stats in the header are derived from `token_count` events. The percent remaining is estimated (using a baseline of ~12k tokens for fixed prompts) and may be approximate.