lip.slnexists at the repo root and currently includes the main code projects undersrc/plus test projects undertests/;Lip.Installeris referenced by the release workflow but its project files may not always be present in the working tree.Lip.Cli/Program.csis a thin Spectre.Console front end; most operational wiring happens inLipClient.Create, which constructsConfigService,CacheService,SourceService,WorkspaceService,PackageInstaller,CompositePackageRegistry, andInstallService.- Workspace state is persisted in
tooth_lock.jsonin the current working directory; it stores installed package manifests, variant labels, explicit/implicit status, and tracked file paths. - Global runtime config is persisted in
liprc.jsonunderEnvironment.SpecialFolder.ApplicationDatainlip/liprc.json; cache and temp data live underEnvironment.SpecialFolder.LocalApplicationDatainlip/cacheandlip/temp. tooth.jsonis the package manifest andlip initcreates a minimal one, but current install/uninstall flows do not mutatetooth.json; they operate on workspace files plustooth_lock.json.- Durable docs caveat:
docs/faq.mdmatches the current implementation ontooth.json, butdocs/intro/quick_start.mdstill says install/uninstall update the manifest; trust the code and FAQ over that quick-start wording. - Manifest, runtime config, and workspace state all use format version
3with UUID289f771f-2c9a-4d73-9f3f-8492495a924d. - Package argument parsing in
LipClienttries, in order: exactPackageSpec, flexiblePackageId, local archive path, then remote archive URL. - Package source retrieval prefers Go module proxy first and Git second; download URLs may be rewritten through
github_proxy, andgo_module_proxydefaults tohttps://goproxy.io. - Git fallback currently caches cloned repositories as directories via
CacheService.GetOrCreateDirectory; this is fragile because.gitcontents can makecache cleandeletion fail and directory-structured cache entries are riskier than file-archive cache artifacts. - Package registry lookup is layered: installed workspace packages first, then remote registries (
GoModuleProxyPackageRegistry,LiprPackageRegistry,GitPackageRegistry), then source-derived manifests. - With dependencies enabled, install/uninstall/update recompute the full desired dependency graph from explicitly installed packages, uninstall removed packages in reverse topological order, then install new ones in topological order.
--no-dependenciesbypasses dependency solving and is explicitly treated as potentially leaving a broken workspace.- Package variants are merged by label and current RID platform match; platform matching supports glob patterns and requires at least one full label+platform match.
- Package install order is: run pre-install scripts, place asset files, run install/post-install scripts, then record workspace state. Uninstall runs pre-uninstall/uninstall scripts, removes tracked files except
preserve_files, appliesremove_files, runs post-uninstall scripts, then removes state. - CI expectations for code changes are
dotnet format --verify-no-changes lip.slnanddotnet test lip.sln; docs are a separate VitePress project underdocs/built withpnpm build. - Docs tooling now uses
pnpm;docs/should keeppackage.jsonpluspnpm-lock.yaml, notpackage-lock.json, and docs verification should be run withpnpm build. - Native npm distribution is driven from
npm/; the single@futrime/lippackage exposes root launcherslip.jsandlipd.js, bundles bothlipandlipdfor all six supported platforms in root-level platform folders likelinux-x64/andwin32-x64/, and the release workflow rewrites the package version from the release event tag before publishing. - The published winget manifest for
futrime.lip0.34.3declaresDependencies.PackageDependencies: Microsoft.DotNet.Runtime.10; the npm package now bootstraps .NET Runtime 10 inpostinstall.jsby silently invoking the officialdotnet-installscripts on all supported platforms, andnpm/lip.jsplusnpm/lipd.jssetDOTNET_ROOTto the default install root when a user-level runtime is present. - Public install docs now standardize on the npm package for all platforms, documenting both
npm install -g @futrime/lipand one-offnpx @futrime/lip ...usage; Windows-only alternatives are limited towingetand releasesetup.exe, and the oldscripts/install.shplus build-from-source installation docs were removed. - GitHub release automation now uploads GitHub Release archives directly inside each
buildmatrix run after artifact upload;publish-npmstill downloads all sixbuildartifacts, copies their binaries into the staged@futrime/lippackage, and publishes one npm package version derived fromgithub.event.release.tag_namewith a shell-sidevprefix trim. - For the single-package npm distribution,
dotnet publishmust include both-r <runtime>and--no-self-contained; this keepsPublishSingleFile=trueoutputs framework-dependent and small enough for npm publish. Without--no-self-contained, each binary grows to roughly 75-90 MB and the combined npm tarball becomes too large for npm CLI publish. - npm CLI 11 rejects prerelease publishes unless
npm publishincludes an explicit--tag; for versions like0.34.2-fd.1, release CI should publish with dist-tagfdrather than relying on npm defaults. publish-npmnow relies on GitHub OIDC trusted publishing rather than injectingNODE_AUTH_TOKEN; the job needspermissions: { contents: read, id-token: write }for npm trusted publisher exchange.- Windows installer packaging no longer uses the removed
src/Lip.InstallerWiX project; release CI now buildslip-<version>-<runtime>-setup.exefrominno/lip.iss, which expects downloaded binaries under.tmp/artifactsand writes installers to.tmp/nsis. inno/lip.issmust not branch on an undeclaredRuntimepreprocessor symbol; release CI should pass the resolved Windows installer architecture explicitly (for exampleBuildArch=arm64orx64compatible) into Inno Setup.- Windows
setup.exenow installs the .NET Runtime 10 prerequisite online duringPrepareToInstall: it first checksHKLM32\SOFTWARE\dotnet\Setup\InstalledVersions\<arch>\InstallLocationforMicrosoft.NETCore.App\10.*, falls back to the default arch-specific global path if needed, then downloadsRuntime/10.0/latest.versionfrombuilds.dotnet.microsoft.comand silently runs the matching officialdotnet-runtime-<version>-win-{x64|arm64}.exewith/install /quiet /norestart.
- 2026-03-24: npm installation now bootstraps .NET Runtime 10 on Windows, Linux, and macOS via
npm/postinstall.js, which silently invokes the officialdotnet-installscript at package install time; the launchers also setDOTNET_ROOTwhen a user-level runtime exists, whilepostinstallskips reinstalling if either the default install root ordotnet --list-runtimesalready reportsMicrosoft.NETCore.App 10.x. - 2026-03-24: Confirmed distribution runtime handling now differs by channel: Windows
setup.exebootstraps .NET Runtime 10 insideinno/lip.iss, winget0.34.3relies onDependencies.PackageDependencies: Microsoft.DotNet.Runtime.10inwinget-pkgs, and npm still lacks any runtime bootstrap beyond spawning the bundled framework-dependent binaries. - 2026-03-24: Updated
.github/workflows/build-docs.ymlto install docs dependencies withpnpm install --frozen-lockfileand build withpnpm build, keeping CI aligned with the repo-wide pnpm rule anddocs/pnpm-lock.yaml. - 2026-03-24: Switched the docs workspace lockfile from
package-lock.jsontopnpm-lock.yamlso the repo's JavaScript workflow consistently usespnpm. - 2026-03-24: Added
npx @futrime/lip ...to the install docs as a supported one-off execution path because the published npm package exposeslipthrough itsbinentry and bundles native binaries for each supported platform. - 2026-03-24: Removed the Linux/macOS shell installer script
scripts/install.shand rewrote install docs to prefernpm install -g @futrime/lipeverywhere, with Windows-specificwingetandsetup.exealternatives only. - 2026-03-24:
inno/lip.issnow installs .NET Runtime 10 online as a Windows setup prerequisite before copying app files, using the 32-bit registryHKLM\SOFTWARE\dotnet\Setup\InstalledVersions\<arch>\InstallLocationto detect global runtime installs and script-local defaultDotNetRuntimeChannel=10.0plusDotNetRuntimeMajor=10defines to parameterize the Inno build. - 2026-03-24:
CHANGELOG.mdnow documents0.34.3as the stable release that restores framework-dependent single-file publish output for release artifacts and formalizes the new native npm package plus Inno Setup installers in user-facing release notes. - 2026-03-24:
Minionguyjpro/Inno-Setup-Action@v1.2.7readswith.optionsviagetMultilineInput(), so workflowoptions:must use a literal block (|) rather than folded YAML (>-) when passing multiple/D...compiler arguments; otherwise Inno Setup receives one combined argument and later defines likeBuildArchstay undefined.
- 2026-03-24: npm release/publish workflow now uses OIDC trusted publishing, prerelease dist-tags derived from the SemVer prerelease label, and package-install-time .NET runtime bootstrap in
npm/postinstall.js;create-windows-installerusesfail-fast: false, derives archive suffixes fromBuildArch, and avoids branching on an undeclaredRuntimesymbol ininno/lip.iss. - 2026-03-24: Release workflow now derives version strings directly from
github.event.release.tag_name, standard verification should target rootlip.sln, Windows packaging uses thecreate-windows-installermatrix withinno/lip.issto produce bothwin-x64andwin-arm64setup.exeartifacts and update PATH, and the 2026-03-23 npm packaging changes consolidated around the single-package@futrime/liplayout with root launchers, flattened platform payload folders, build-artifact uploads, and0.34.2-fd.0published as the framework-dependent npm recovery release. - 2026-03-23: Minimized npm release CI in
.github/workflows/release.ymlby deriving npm versions from the release tag and publishing platform packages directly frombuildartifacts instead of downloading GitHub Release archives. - 2026-03-23: Refactored
.github/workflows/release.ymlso the npm publish jobs use separate GitHub Actions steps for package staging, asset download, package version rewriting, binary extraction, andnpm publish. - 2026-03-23: Simplified npm release CI by deleting
npm/scripts/stage-pnpm-release.shandnpm/scripts/publish-pnpm-release.sh;.github/workflows/release.ymlnow uses a matrix job for platform packages plus a follow-up job for@futrime/lip. - 2026-03-23: Wired npm publishing into
.github/workflows/release.ymlas apublish-npmjob that runs after release assets are uploaded and uses theNPM_TOKENsecret for npm auth. - 2026-03-23: Removed the temporary root
package.jsonandpnpm-workspace.yaml; npm publishing is now driven directly by the scripts undernpm/scripts/. - 2026-03-23: Moved the npm publish helper scripts under
npm/scripts/and confirmed staging still works from the new location. - 2026-03-23: The original
@futrime/lip@0.34.2npm record was later unpublished, which blocks re-publishing the same version; the framework-dependent replacement was published as0.34.2-fd.0instead. - 2026-03-23: Added a
pnpm-based native npm distribution layout for@futrime/lipplus six platform packages, staging binaries from GitHub Release assets instead of local builds; verified all seven packages passpnpm publish --dry-runforv0.34.2, with actual publish currently blocked only by missing npm auth. - 2026-03-23: Initialized repo memory from code/docs/CI and recorded the Git source fallback caveat about directory-based cache entries making
cache cleanbrittle on.gitcontents. - 2026-03-23: Merged two conflicting
AGENTS.mdtemplates into one repo-specific policy file, removed Python/Notion workflow rules, and aligned instructions with the repo's.NETand docs build workflows. - 2026-03-23: Fixed
MEMORY.mdstructure to match policy, withMemo,Recent,History, and normalizedMemocasing.