Commit Graph

17 Commits

Author SHA1 Message Date
Jens
d384f172b8 fix: remove individual shipping publishing (#1159)
## ℹ️ Description

- Link to the related issue(s): Issue #1157
- Kleinanzeigen no longer offers individual/custom shipping. This
updates publishing, validation, docs, schemas, translations, and tests
so existing `shipping_costs` configs are handled gracefully instead of
failing against removed DOM controls.

## 📋 Changes Summary

- Keep `shipping_costs` for legacy configs/downloaded ads, but mark it
deprecated in schema/docs and ignore it during publishing.
- Remove publishing interaction with removed individual-shipping DOM
controls.
- Require predefined non-empty `shipping_options` for `sell_directly`.
- Update docs, generated schemas/config artifacts, German translations,
and unit tests.
- Verified live DOM for `sell_directly: true` + `shipping_type:
SHIPPING` + predefined `shipping_options` via local ignored script; no
ad submission performed.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [x] 🐞 Bug fix (non-breaking change which fixes an issue)
- [ ]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)

##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Documentation**
* Updated shipping guides to deprecate custom individual shipping costs
and make publishing depend on per-ad predefined `shipping_options`
(DHL/Hermes; selectable options must come from a single size group).
* Added migration guidance replacing `shipping_costs` with the correct
`shipping_options`.
* Clarified “Sell directly” requires `shipping_type: SHIPPING`,
non-empty `shipping_options`, and `FIXED`/`NEGOTIABLE` pricing.

* **Bug Fixes**
* Publishing is blocked when `shipping_costs` is provided without
`shipping_options`.
* Removed unsupported individual-shipping handling and tightened “Sell
directly” eligibility rules.

* **Tests**
* Expanded unit coverage for deprecation behavior, content handling, and
direct-buy validation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-06-21 08:11:02 +02:00
Jens
3958d4c907 feat: add preserve-local-settings toggle for download (#1091)
## ℹ️ Description

When re-downloading an ad that is already saved locally (via `--ads=all`
or numeric IDs), the ad YAML is atomically replaced. The download only
scrapes fields from the live page, so all **local-only settings** are
reset to defaults or zero:

| Field | What happens |
|---|---|
| `auto_price_reduction` | Reset to `AdDefaults` value (or `null`) |
| `republication_interval` | Reset to `AdDefaults` value (or `null`) |
| `repost_count` | Reset to `0` — bot forgets how many times it
published |
| `price_reduction_count` | Reset to `0` — bot forgets auto-reduction
progress |

The `new` selector avoids this by skipping already-saved ads, but `all`
and numeric IDs do not.

- Link to the related issue(s): N/A

## 📋 Changes Summary

- Add `download.preserve_local_settings` config option (default: `true`)
- Add `--preserve-local-settings` CLI flag with help text (English +
German)
- In `download_ad()`, when re-downloading an existing ad with the toggle
enabled, preserve four local-only fields from the existing YAML:
`auto_price_reduction`, `republication_interval`, `repost_count`,
`price_reduction_count`
- Uses validate-then-commit pattern: candidate values are staged on a
model copy, validated, then committed only on success
- Added test verifying local fields survive re-download
- Regenerated schemas and config defaults
- Updated German translations for new log messages

### ⚙️ Type of Change
- [x] 🐞 Bug fix
- [x]  New feature
- [ ] 💥 Breaking change

##  Checklist
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added `--preserve-local-settings` CLI flag to retain local ad settings
during re-downloads (including auto price reduction, republication
interval, and repost count).
* Settings now preserved by default; re-downloading existing ads
maintains local configurations instead of resetting to defaults.

* **Documentation**
* Updated configuration guide with details on the new
`preserve_local_settings` option.

* **Tests**
* Added unit tests for CLI flag parsing and preservation logic during ad
re-downloads.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-06-07 11:46:07 +02:00
Jens
ed3b73c3fb feat: resolve login credentials from environment variables (#1061)
## ℹ️ Description

Adds support for `${KLEINANZEIGEN_BOT_USERNAME}` and
`${KLEINANZEIGEN_BOT_PASSWORD}` environment variable substitution in
`login.username` and `login.password` config values. Also supports
`${VAR:-default}` fallback syntax.

This allows users to commit `config.yaml` to VCS without exposing
credentials.

Closes #1060.

## 📋 Changes Summary

- New `_resolve_login_credentials()` static method on `KleinanzeigenBot`
— resolves `${VAR}` and `${VAR:-default}` patterns from `os.environ` for
`login.username` and `login.password` only
- Called in `load_config()` after YAML loading, before Pydantic
validation — `LoginConfig` model remains unchanged (`Field(...,
min_length=1)`)
- Module-level `_LOGIN_ENV_PATTERN` regex for the `${VAR}` /
`${VAR:-default}` pattern
- Guard against non-dict YAML input (passes through to Pydantic for
clean validation errors)
- Updated `README.md` and `docs/CONFIGURATION.md` with env var examples
- Removed obsolete "Config file not found" translation (no longer
raised)
- 9 new unit tests in `TestResolveLoginCredentials` covering resolution,
fallback, error cases, edge cases, and `load_config` integration

### ⚙️ Type of Change
- [x]  New feature (adds new functionality without breaking existing
usage)

##  Checklist
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Login credentials support environment variable substitution using
${VARIABLE} with optional fallbacks (${VARIABLE:-default}); plaintext
values remain supported.

* **Documentation**
* Configuration docs updated with YAML and shell examples (exporting
variables) and an explicit security note advising against committing
plaintext credentials.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/Second-Hand-Friends/kleinanzeigen-bot/pull/1061?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-05-29 13:41:40 +02:00
Jens
96734cc5ed docs: clarify download naming examples (#1016)
## ℹ️ Description
Documentation-only update to clarify how `ad_files` differs from
download naming templates and how published IDs are handled.

- Link to the related discussion:
https://github.com/Second-Hand-Friends/kleinanzeigen-bot/discussions/839
- Describe the motivation and context for this change: reduce confusion
around downloaded ad naming and local file behavior.

## 📋 Changes Summary
- Clarified `ad_files` as a file-selection glob, separate from download
naming.
- Added concrete sample ID/title render examples for folder and file
templates.
- Documented that publish updates the YAML `id` in place and does not
auto-rename local files or folders.
- Regenerated config docs and schema artifacts to keep generated output
in sync.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [ ] 🐞 Bug fix (non-breaking change which fixes an issue)
- [ ]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)

##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Expanded ad configuration and setup documentation with improved
guidance on file pattern matching and download directory configuration.
* Clarified how placeholder templates work in file naming, including
required and optional parameters.
* Added comprehensive examples demonstrating template rendering and
configuration best practices.
* Documented republish behavior and workflow guidance for managing
downloaded ad files.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-23 22:15:01 +02:00
Jens
a13fb4f106 feat(timing): tune default timeouts and migrate optional probes to web_probe (#985)
## ℹ️ Description

- Link to the related issue(s): Issue #
- Analyzed 524 timing records across 18 sessions from real-world usage
to identify genuine timeout failures vs expected element-absence probes.
Three timeout defaults were too tight for observed latency spikes, and
four call sites were wasting time on retry/backoff for elements that are
intentionally absent in most flows.

## 📋 Changes Summary

### Timeout default changes (`config_model.py` → generated
`config.default.yaml` + `config.schema.json`)

| Key | Old | New | Rationale |
|---|---|---|---|
| `sms_verification` | 4.0 | **5.0** | ~11% margin over observed 4.46s
failure |
| `email_verification` | 4.0 | **5.0** | ~23% margin over observed 4.05s
failure |
| `login_detection` | 10.0 | **12.0** | ~11% margin over observed
10.6–10.8s failures |
| `captcha_detection` | 2.0 | unchanged | No evidence of benefit from
timing data |

### Call-site migration (`__init__.py`)

Migrated 4 optional-probe methods from `web_find` (retry-backed, raises
`TimeoutError`) to `web_probe` (single attempt, returns `None`):

- **`_check_sms_verification`**: `web_find` → `web_probe` with explicit
`sms_verification` timeout, returns early with debug log when absent
- **`_check_email_verification`**: Same pattern with
`email_verification` timeout
- **`_dismiss_consent_banner`**: Eliminated double-lookup (`web_find` +
`web_click`) → single `web_probe` + `element.click()` + `web_sleep()`
- **`_click_gdpr_banner`**: Same double-lookup elimination, added debug
log on absent path

Removed 4 `try/except TimeoutError` wrappers from callers
(`handle_after_login_logic` and `login`) since `web_probe` never raises
`TimeoutError`.

### Performance impact

- Worst-case wait on absent elements reduced from ~19s → 5s (SMS/email
verification with retry/backoff vs single probe)
- GDPR banner clicks: double DOM lookup eliminated → single lookup

### Test cleanup (`test_init.py`)

- **Added 8 behavioral tests** for `_dismiss_consent_banner` (found +
absent), `_check_sms_verification` (found + absent),
`_check_email_verification` (found + absent), and `_click_gdpr_banner`
absent path
- **Removed 3 low-value tests**: `test_handle_after_login_logic`
(structural mock wiring),
`test_is_logged_in_returns_true_with_alternative_element` (duplicate
branch),
`test_wait_for_post_auth0_submit_transition_sleep_fallback_when_login_not_confirmed`
(duplicate outcome)
- **Upgraded 1 test**: `test_fill_login_data_and_send` from mock-count
assertions to behavioral argument assertions verifying correct selectors
and credentials

### ⚙️ Type of Change
- [x] 🐞 Bug fix (non-breaking change which fixes an issue)
- [ ]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)

##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Post-login flows now safely handle absent SMS/email prompts and
consent/GDPR banners, avoiding interruptions and clicking banners when
present.

* **Improvements**
* Increased default timeouts for SMS verification, email verification,
and login detection to improve login reliability.

* **Documentation**
* Configuration docs now reference authoritative default timeout values
instead of embedding examples.

* **Tests**
* Strengthened unit tests for login interactions, verification prompts,
and banner dismissal behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-13 18:18:30 +02:00
Jens
c3584d0b2e feat(pricing): support update-mode reductions and verify previews (#970)
## ℹ️ Description
Automatic price reduction now works reliably during `update` runs
(MODIFY mode), not only during `publish`, while staying backward
compatible for existing configurations. The verify flow also explains
what will happen in both modes before any command touches live ads.

- Link to the related issue(s): Issue # N/A
- Describe the motivation and context for this change.
- Update-mode reductions needed to be explicitly opt-in so existing
setups remain unchanged by default.
- Pricing behavior had to stay deterministic across retries and mixed
publish/update workflows.
- Preview output and documentation now mirror real runtime behavior so
configuration decisions are easier to trust.

## 📋 Changes Summary
- Added `auto_price_reduction.on_update` (`bool`, default `false`) in
model/schema so update-mode reductions are explicitly opt-in.
- Refactored price reduction flow into decision + apply steps:
  - `evaluate_auto_price_reduction(...)` computes mode-aware outcomes
- `apply_auto_price_reduction(...)` applies mutations and logs from that
decision
- Implemented restore-first behavior so effective reduced price is
recomputed from base `price` + `price_reduction_count` before deciding a
new cycle.
- Updated `verify` to preview both publish and update outcomes.
- Kept update-mode semantics explicit:
  - `delay_days` applies
  - `delay_reposts` is ignored in MODIFY mode
- Fixed retry idempotency in `publish_ads` by restoring baseline `price`
and `price_reduction_count` before each retry.
- Addressed follow-up review feedback:
- no-visible-change cycles advance counters (for fractional
accumulation)
  - verify output stays non-misleading for no-visible-change cases
  - tightened a unit assertion from `>= 1` to `== 1`
- tightened smoke behavior for `create-config` when config already
exists
- clarified README/docs and documented `price_reduction_count` as
auto-managed
- Expanded/updated tests for:
  - MODIFY `on_update` behavior
  - restore-first invariant
  - cross-mode interactions
  - retry baseline reset
  - verify mode previews
  - floor-clamped no-visible-change counter advancement

Mention any dependencies, configuration changes, or additional
requirements introduced.
- Configuration change: new optional field
`auto_price_reduction.on_update` (default `false`, backward compatible).
- No external runtime dependency changes.
- Existing configurations continue to work unchanged unless `on_update`
is enabled.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [x] 🐞 Bug fix (non-breaking change which fixes an issue)
- [x]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)


##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* `verify` now previews automatic price-reduction outcomes for both
publish and update modes.
* New config option (auto_price_reduction.on_update, default false) to
enable reductions during update runs.

* **Documentation**
* Clarified publish vs. update reduction behavior, timing rules,
restore-first semantics, logging, examples, and troubleshooting.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-10 15:49:15 +02:00
Jens
b143b26c24 enh(download): enforce single-use placeholders in naming templates (#909)
## ℹ️ Description
This pull request finalizes PR5 by simplifying download naming template
rules and making truncation behavior deterministic and reviewable.

- Link to the related issue(s): Issue #841
- Describe the motivation and context for this change.
Repeated placeholders and implicit truncation priority made naming
outcomes hard to predict. This change enforces single-use placeholders
and aligns validation, rendering, docs, and tests around explicit
priority rules under tight budgets.

## 📋 Changes Summary
- Enforced template validation rule: each placeholder (`{id}`,
`{title}`) may appear at most once in:
  - `download.folder_name_template`
  - `download.ad_file_name_template`
- Added validation error path and i18n entry for repeated placeholders.
- Refined `_render_download_name_with_budget` behavior to deterministic
priority:
  - `{id}` protected as much as possible
  - literals preserved after `{id}`
  - `{title}` truncated first under budget pressure
- Added truncation warnings and bounded log previews for
template/title/rendered values.
- Improved snippet truncation behavior to keep preview length within
configured caps, including small/zero limit handling.
- Expanded tests in `test_config_model.py` and `test_extract.py` to
cover:
  - repeated placeholder rejection
  - id/title truncation warnings
  - helper edge cases for log snippet truncation
- Updated configuration documentation with:
  - valid/invalid template examples
  - tight-budget examples reflecting current priority behavior
  - explicit note about last-resort `{id}` truncation
- Updated generated artifacts where applicable:
  - `docs/config.default.yaml`
  - `schemas/config.schema.json`
- No new runtime dependencies or new config keys introduced.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [ ] 🐞 Bug fix (non-breaking change which fixes an issue)
- [x]  New feature (adds new functionality without breaking existing
usage)
- [x] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)


##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.
2026-03-26 21:38:27 +01:00
Jens
e1bb54ef53 enh: replace login UNKNOWN state with boolean + detection reason (#890)
## ℹ️ Description
This PR implements issue #872 by replacing the tri-state login model
(`LOGGED_IN` / `LOGGED_OUT` / `UNKNOWN`) with an explicit login
detection result object that separates control flow from diagnostics.

- Link to the related issue(s): Issue #872
- Describe the motivation and context for this change.
- `UNKNOWN` previously mixed two concerns: decision logic and
observability. In practice, callers mostly needed a binary decision
(logged in or not), while diagnostics needed the *reason* for
inconclusive detection.
- This change makes login decisions explicit (`is_logged_in`) and keeps
diagnostics/context explicit (`reason`), reducing ambiguity and making
behavior easier to reason about and test.

## 📋 Changes Summary
- Replaced `LoginState` with:
- `LoginDetectionReason` enum (`USER_INFO_MATCH`, `CTA_MATCH`,
`SELECTOR_TIMEOUT`)
- `LoginDetectionResult` frozen dataclass (`is_logged_in`, `reason`)
with invariant checks in `__post_init__`
- Updated `get_login_state()` to return `LoginDetectionResult` while
preserving detection order and runtime behavior:
  1. DOM logged-in selector match -> `USER_INFO_MATCH`
  2. Logged-out CTA selector match -> `CTA_MATCH`
3. Inconclusive fallback -> `SELECTOR_TIMEOUT` (+ optional diagnostics
capture)
- Updated login flow call sites to branch on `result.is_logged_in` and
include reason context in post-login failure handling.
- Updated diagnostics text from UNKNOWN-specific wording to inconclusive
wording.
- Renamed diagnostics artifact prefix from `login_detection_unknown` to
`login_detection_inconclusive` and aligned diagnostics utility docs.
- Migrated and expanded unit tests:
  - switched enum-based assertions/mocks to `LoginDetectionResult`
  - added invariant tests for invalid result combinations
- Updated docs to match current behavior and config keys:
  - removed outdated auth-probe fallback wording
- documented `CTA_MATCH` / `SELECTOR_TIMEOUT` meaning and
troubleshooting guidance
- added migration note from `diagnostics.login_detection_capture` to
`diagnostics.capture_on.login_detection`

Mention any dependencies, configuration changes, or additional
requirements introduced.
- No new runtime dependencies introduced.
- No user-facing config schema changes introduced.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [ ] 🐞 Bug fix (non-breaking change which fixes an issue)
- [x]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)


##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* DOM-first login detection with a logged-out CTA check, explicit
inconclusive outcome (SELECTOR_TIMEOUT), and reason-aware detection
surfaced in logs/errors.

* **Documentation**
* Updated troubleshooting and configuration docs and examples to use
diagnostics.capture_on.login_detection and added migration guidance for
the legacy key.

* **Tests**
* Updated and added tests covering new detection outcomes, reason
validation, and diagnostic capture behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-24 20:30:36 +01:00
Jens
2abe0ccb71 feat: add configurable download naming templates (#896) 2026-03-23 08:02:19 +01:00
Jens
2d02d206ec feat: add configurable download directory (#894) 2026-03-20 23:03:32 +01:00
Jens
398286bcbc ci: check generated schema and default config artifacts (#825)
## ℹ️ Description
- Link to the related issue(s): N/A
- Add a CI guard that fails when generated artifacts are out of sync,
motivated by preventing missing schema updates and keeping generated
reference files current.
- Add a committed `docs/config.default.yaml` as a user-facing default
configuration reference.

## 📋 Changes Summary
- Add `scripts/check_generated_artifacts.py` to regenerate schema
artifacts and compare tracked outputs (`schemas/*.json` and
`docs/config.default.yaml`) against generated content.
- Run the new artifact consistency check in CI via
`.github/workflows/build.yml`.
- Add `pdm run generate-config` and `pdm run generate-artifacts` tasks,
with a cross-platform-safe delete in `generate-config`.
- Add generated `docs/config.default.yaml` and document it in
`docs/CONFIGURATION.md`.
- Update `schemas/config.schema.json` with the
`diagnostics.timing_collection` property generated from the model.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [ ] 🐞 Bug fix (non-breaking change which fixes an issue)
- [x]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)

##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Documentation**
* Added a reference link to the default configuration snapshot for
easier access to baseline settings.

* **Chores**
* Added a CI build-time check that validates generated schemas and the
default config and alerts when regeneration is needed.
* Added scripts to generate the default config and to sequence artifact
generation.
* Added a utility to produce standardized schema content and compare
generated artifacts.
  * Minor tweak to schema generation success messaging.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-02-16 16:56:31 +01:00
Jens
55777710e8 feat: explain auto price reduction decisions and traces (#826) 2026-02-16 15:52:24 +01:00
Jens
50fc8781a9 feat: collect timeout timing sessions for diagnostics (#814) 2026-02-13 16:45:52 +01:00
Jens
4282b05ff3 fix: add explicit workspace mode resolution for --config (#818) 2026-02-11 05:35:41 +01:00
Jens
601b405ded fix: improve logging messages and documentation (#803) 2026-02-02 17:21:21 +01:00
Jens
b3d5a4b228 feat: capture publish failure diagnostics with screenshot and logs (#802) 2026-02-01 08:17:14 +01:00
Jens
a4946ba104 docs: refactor guides for clearer navigation (#795)
## ℹ️ Description
Refactors and reorganizes documentation to improve navigation and keep
the README concise.

- Link to the related issue(s): Issue #N/A
- Describe the motivation and context for this change.
- The README had grown long and duplicated detailed config/ad
references; this consolidates docs into focused guides and adds an
index.

## 📋 Changes Summary
- Add dedicated docs pages for configuration, ad configuration, update
checks, and a docs index.
- Slim README and CONTRIBUTING to reference dedicated guides and clean
up formatting/markdownlint issues.
- Refresh browser troubleshooting and update-check guidance; keep the
update channel name aligned with schema/implementation.
- Add markdownlint configuration for consistent docs formatting.

### ⚙️ Type of Change
Select the type(s) of change(s) included in this pull request:
- [ ] 🐞 Bug fix (non-breaking change which fixes an issue)
- [x]  New feature (adds new functionality without breaking existing
usage)
- [ ] 💥 Breaking change (changes that might break existing user setups,
scripts, or configurations)


##  Checklist
Before requesting a review, confirm the following:
- [x] I have reviewed my changes to ensure they meet the project's
standards.
- [x] I have tested my changes and ensured that all tests pass (`pdm run
test`).
- [x] I have formatted the code (`pdm run format`).
- [x] I have verified that linting passes (`pdm run lint`).
- [x] I have updated documentation where necessary.

By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Documentation**
* Reorganized and enhanced contributing guidelines with improved
structure and formatting
* Streamlined README with better organization and updated installation
instructions
* Added comprehensive configuration reference documentation for
configuration and ad settings
* Improved browser troubleshooting guide with updated guidance,
examples, and diagnostic information
  * Created new documentation index for easier navigation

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-01-30 11:06:36 +01:00