{"owner":"rmcrackan","repo":"Libation","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\n## Cursor Cloud specific instructions\n\nLibation is a cross-platform .NET desktop/CLI app for downloading and de-DRMing Audible\naudiobooks. The core product is the Avalonia GUI (`LibationAvalonia`, assembly name `Libation`)\nplus a headless CLI (`LibationCli`) that shares the same config and SQLite library database.\n\n### Toolchain / environment\n- Requires the **.NET 10 SDK** pinned by `global.json` (`10.0.101`). It is preinstalled at\n  `~/.dotnet`; `~/.bashrc` exports `DOTNET_ROOT` and adds `~/.dotnet` (and `~/.dotnet/tools`) to\n  `PATH`. New non-login shells may not have it — use `dotnet` after a login shell, or call\n  `~/.dotnet/dotnet` directly.\n- The startup update script runs `dotnet tool restore` (restores `dotnet-ef`) and\n  `dotnet restore Source/Libation.slnx`. No other setup is needed.\n- The solution file is the new XML format: `Source/Libation.slnx` (there is no classic `.sln`).\n\n### Building — Linux only builds the cross-platform projects\n- Do **not** build the whole solution on Linux. Several projects are Windows/OS-specific and will\n  not build here: `LibationWinForms`, `HangoverWinForms` (target `net10.0-windows7.0`) and the\n  `LoadByOS/{Windows,MacOS}ConfigApp` helpers.\n- Build the runnable cross-platform apps directly:\n  - `dotnet build Source/LibationAvalonia/LibationAvalonia.csproj`\n  - `dotnet build Source/LibationCli/LibationCli.csproj`\n- There is no dedicated lint step; the repo's `.editorconfig` is minimal and CI\n  (`.github/workflows/validate.yml`) only builds and tests. The compiler/analyzer warnings from a\n  normal build serve as the static-analysis check. (A known transitive `NU1903` SQLite\n  vulnerability warning is expected and harmless.)\n\n### Testing\n- Test projects live under `Source/_Tests/` and use MSTest on **Microsoft.Testing.Platform**\n  (configured via `global.json` `test.runner`). Because of this runner, `dotnet test` requires\n  `--project` for a single project (a positional project path is rejected):\n  `dotnet test --project Source/_Tests/FileManager.Tests/FileManager.Tests.csproj`\n- CI runs `dotnet test` from `Source/` on every platform, Linux included, and it works here too: the\n  restore covers the whole solution but only the test projects and their references are compiled, so\n  the Windows-only projects never break the run. Naming one project is simply quicker.\n- **Manual UI testing:** `dotnet run Scripts/seed-demo-library.cs` fills the library with fake books\n  covering every Liberate-column icon and prints the expected result for each row\n  (`-- --clean` removes them). Read `docs/development/testing.md` before seeding library state by\n  hand: the yellow lamp is an `.aaxc` file on disk rather than a stored status, `AudioExists` is a\n  database check so green/error need no files, and a podcast's series is keyed off the parent\n  book's own ASIN or the grid silently drops the parent row.\n- **GNOME Keyring / OS secret store:** Libation's default `TokenStorageMethod` is `Encrypted`,\n and the AES-GCM master key is stored via the OS secret store (`OsSecretStore` /\n `IdentityTokenStorageWiring`). On Linux that is GNOME Keyring (Secret Service), which **blocks\n indefinitely** here: the login keyring is locked with a password nobody has, and the D-Bus call\n hangs even with no prompt on screen. Probing availability does not help - the probe is the\n blocking call.\n Every test project should finish in about a second. If one runs for minutes, assume something\n reached the OS secret store; do not sit through it and do not re-run it hoping for a different\n result. `ResolveSecretStore` short-circuits on `LIBATION_MASTER_KEY_FILE`, an existing\n `libation-master.key` under the Libation files dir, or `LIBATION_MASTER_KEY`, so setting one of\n those keeps a test off the OS store entirely.\n The tests that deliberately exercise the real store are opt-in via\n `LIBATION_TEST_OS_SECRET_STORE=1` and are skipped otherwise. Leave them skipped on Linux; they\n will hang if enabled. Always run tests under `timeout` so a regression here cannot stall a session.\n\n### Running the apps\n- GUI: a display is available on `DISPLAY=:1`. Run with\n  `cd Source/LibationAvalonia && dotnet run`. First launch shows a Welcome/walkthrough and creates\n  config under `~/.local/share/Libation/` (`Settings.json`, `AccountsSettings.json`,\n  `LibationContext.db`). The same keyring note above applies when the GUI/CLI first encrypts\n  account tokens.\n- CLI: `cd Source/LibationCli && dotnet run -- <command>` (e.g. `version`, `get-setting`,\n  `list-accounts`, `scan`, `liberate`). The CLI reads the same `~/.local/share/Libation/` config\n  and database as the GUI.\n- Actually scanning/downloading a library requires signing into a real Audible account, so full\n  end-to-end liberation cannot be exercised without credentials.\n"},"files":{"AGENTS.md":"# AGENTS.md\n\n## Cursor Cloud specific instructions\n\nLibation is a cross-platform .NET desktop/CLI app for downloading and de-DRMing Audible\naudiobooks. The core product is the Avalonia GUI (`LibationAvalonia`, assembly name `Libation`)\nplus a headless CLI (`LibationCli`) that shares the same config and SQLite library database.\n\n### Toolchain / environment\n- Requires the **.NET 10 SDK** pinned by `global.json` (`10.0.101`). It is preinstalled at\n  `~/.dotnet`; `~/.bashrc` exports `DOTNET_ROOT` and adds `~/.dotnet` (and `~/.dotnet/tools`) to\n  `PATH`. New non-login shells may not have it — use `dotnet` after a login shell, or call\n  `~/.dotnet/dotnet` directly.\n- The startup update script runs `dotnet tool restore` (restores `dotnet-ef`) and\n  `dotnet restore Source/Libation.slnx`. No other setup is needed.\n- The solution file is the new XML format: `Source/Libation.slnx` (there is no classic `.sln`).\n\n### Building — Linux only builds the cross-platform projects\n- Do **not** build the whole solution on Linux. Several projects are Windows/OS-specific and will\n  not build here: `LibationWinForms`, `HangoverWinForms` (target `net10.0-windows7.0`) and the\n  `LoadByOS/{Windows,MacOS}ConfigApp` helpers.\n- Build the runnable cross-platform apps directly:\n  - `dotnet build Source/LibationAvalonia/LibationAvalonia.csproj`\n  - `dotnet build Source/LibationCli/LibationCli.csproj`\n- There is no dedicated lint step; the repo's `.editorconfig` is minimal and CI\n  (`.github/workflows/validate.yml`) only builds and tests. The compiler/analyzer warnings from a\n  normal build serve as the static-analysis check. (A known transitive `NU1903` SQLite\n  vulnerability warning is expected and harmless.)\n\n### Testing\n- Test projects live under `Source/_Tests/` and use MSTest on **Microsoft.Testing.Platform**\n  (configured via `global.json` `test.runner`). Because of this runner, `dotnet test` requires\n  `--project` for a single project (a positional project path is rejected):\n  `dotnet test --project Source/_Tests/FileManager.Tests/FileManager.Tests.csproj`\n- CI runs `dotnet test` from `Source/` on every platform, Linux included, and it works here too: the\n  restore covers the whole solution but only the test projects and their references are compiled, so\n  the Windows-only projects never break the run. Naming one project is simply quicker.\n- **Manual UI testing:** `dotnet run Scripts/seed-demo-library.cs` fills the library with fake books\n  covering every Liberate-column icon and prints the expected result for each row\n  (`-- --clean` removes them). Read `docs/development/testing.md` before seeding library state by\n  hand: the yellow lamp is an `.aaxc` file on disk rather than a stored status, `AudioExists` is a\n  database check so green/error need no files, and a podcast's series is keyed off the parent\n  book's own ASIN or the grid silently drops the parent row.\n- **GNOME Keyring / OS secret store:** Libation's default `TokenStorageMethod` is `Encrypted`,\n and the AES-GCM master key is stored via the OS secret store (`OsSecretStore` /\n `IdentityTokenStorageWiring`). On Linux that is GNOME Keyring (Secret Service), which **blocks\n indefinitely** here: the login keyring is locked with a password nobody has, and the D-Bus call\n hangs even with no prompt on screen. Probing availability does not help - the probe is the\n blocking call.\n Every test project should finish in about a second. If one runs for minutes, assume something\n reached the OS secret store; do not sit through it and do not re-run it hoping for a different\n result. `ResolveSecretStore` short-circuits on `LIBATION_MASTER_KEY_FILE`, an existing\n `libation-master.key` under the Libation files dir, or `LIBATION_MASTER_KEY`, so setting one of\n those keeps a test off the OS store entirely.\n The tests that deliberately exercise the real store are opt-in via\n `LIBATION_TEST_OS_SECRET_STORE=1` and are skipped otherwise. Leave them skipped on Linux; they\n will hang if enabled. Always run tests under `timeout` so a regression here cannot stall a session.\n\n### Running the apps\n- GUI: a display is available on `DISPLAY=:1`. Run with\n  `cd Source/LibationAvalonia && dotnet run`. First launch shows a Welcome/walkthrough and creates\n  config under `~/.local/share/Libation/` (`Settings.json`, `AccountsSettings.json`,\n  `LibationContext.db`). The same keyring note above applies when the GUI/CLI first encrypts\n  account tokens.\n- CLI: `cd Source/LibationCli && dotnet run -- <command>` (e.g. `version`, `get-setting`,\n  `list-accounts`, `scan`, `liberate`). The CLI reads the same `~/.local/share/Libation/` config\n  and database as the GUI.\n- Actually scanning/downloading a library requires signing into a real Audible account, so full\n  end-to-end liberation cannot be exercised without credentials.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\n## Cursor Cloud specific instructions\n\nLibation is a cross-platform .NET desktop/CLI app for downloading and de-DRMing Audible\naudiobooks. The core product is the Avalonia GUI (`LibationAvalonia`, assembly name `Libation`)\nplus a headless CLI (`LibationCli`) that shares the same config and SQLite library database.\n\n### Toolchain / environment\n- Requires the **.NET 10 SDK** pinned by `global.json` (`10.0.101`). It is preinstalled at\n  `~/.dotnet`; `~/.bashrc` exports `DOTNET_ROOT` and adds `~/.dotnet` (and `~/.dotnet/tools`) to\n  `PATH`. New non-login shells may not have it — use `dotnet` after a login shell, or call\n  `~/.dotnet/dotnet` directly.\n- The startup update script runs `dotnet tool restore` (restores `dotnet-ef`) and\n  `dotnet restore Source/Libation.slnx`. No other setup is needed.\n- The solution file is the new XML format: `Source/Libation.slnx` (there is no classic `.sln`).\n\n### Building — Linux only builds the cross-platform projects\n- Do **not** build the whole solution on Linux. Several projects are Windows/OS-specific and will\n  not build here: `LibationWinForms`, `HangoverWinForms` (target `net10.0-windows7.0`) and the\n  `LoadByOS/{Windows,MacOS}ConfigApp` helpers.\n- Build the runnable cross-platform apps directly:\n  - `dotnet build Source/LibationAvalonia/LibationAvalonia.csproj`\n  - `dotnet build Source/LibationCli/LibationCli.csproj`\n- There is no dedicated lint step; the repo's `.editorconfig` is minimal and CI\n  (`.github/workflows/validate.yml`) only builds and tests. The compiler/analyzer warnings from a\n  normal build serve as the static-analysis check. (A known transitive `NU1903` SQLite\n  vulnerability warning is expected and harmless.)\n\n### Testing\n- Test projects live under `Source/_Tests/` and use MSTest on **Microsoft.Testing.Platform**\n  (configured via `global.json` `test.runner`). Because of this runner, `dotnet test` requires\n  `--project` for a single project (a positional project path is rejected):\n  `dotnet test --project Source/_Tests/FileManager.Tests/FileManager.Tests.csproj`\n- CI runs `dotnet test` from `Source/` on every platform, Linux included, and it works here too: the\n  restore covers the whole solution but only the test projects and their references are compiled, so\n  the Windows-only projects never break the run. Naming one project is simply quicker.\n- **Manual UI testing:** `dotnet run Scripts/seed-demo-library.cs` fills the library with fake books\n  covering every Liberate-column icon and prints the expected result for each row\n  (`-- --clean` removes them). Read `docs/development/testing.md` before seeding library state by\n  hand: the yellow lamp is an `.aaxc` file on disk rather than a stored status, `AudioExists` is a\n  database check so green/error need no files, and a podcast's series is keyed off the parent\n  book's own ASIN or the grid silently drops the parent row.\n- **GNOME Keyring / OS secret store:** Libation's default `TokenStorageMethod` is `Encrypted`,\n and the AES-GCM master key is stored via the OS secret store (`OsSecretStore` /\n `IdentityTokenStorageWiring`). On Linux that is GNOME Keyring (Secret Service), which **blocks\n indefinitely** here: the login keyring is locked with a password nobody has, and the D-Bus call\n hangs even with no prompt on screen. Probing availability does not help - the probe is the\n blocking call.\n Every test project should finish in about a second. If one runs for minutes, assume something\n reached the OS secret store; do not sit through it and do not re-run it hoping for a different\n result. `ResolveSecretStore` short-circuits on `LIBATION_MASTER_KEY_FILE`, an existing\n `libation-master.key` under the Libation files dir, or `LIBATION_MASTER_KEY`, so setting one of\n those keeps a test off the OS store entirely.\n The tests that deliberately exercise the real store are opt-in via\n `LIBATION_TEST_OS_SECRET_STORE=1` and are skipped otherwise. Leave them skipped on Linux; they\n will hang if enabled. Always run tests under `timeout` so a regression here cannot stall a session.\n\n### Running the apps\n- GUI: a display is available on `DISPLAY=:1`. Run with\n  `cd Source/LibationAvalonia && dotnet run`. First launch shows a Welcome/walkthrough and creates\n  config under `~/.local/share/Libation/` (`Settings.json`, `AccountsSettings.json`,\n  `LibationContext.db`). The same keyring note above applies when the GUI/CLI first encrypts\n  account tokens.\n- CLI: `cd Source/LibationCli && dotnet run -- <command>` (e.g. `version`, `get-setting`,\n  `list-accounts`, `scan`, `liberate`). The CLI reads the same `~/.local/share/Libation/` config\n  and database as the GUI.\n- Actually scanning/downloading a library requires signing into a real Audible account, so full\n  end-to-end liberation cannot be exercised without credentials.\n","category":"root","tokens":1201}]}