Skip to content

ci: modernize workflows, add pyproject.toml, type hints and tests#28

Merged
JarbasAl merged 13 commits into
devfrom
ci/add-standard-workflows
Apr 17, 2026
Merged

ci: modernize workflows, add pyproject.toml, type hints and tests#28
JarbasAl merged 13 commits into
devfrom
ci/add-standard-workflows

Conversation

@JarbasAl
Copy link
Copy Markdown
Member

@JarbasAl JarbasAl commented Apr 16, 2026

Summary

  • Replace bespoke/TigreGotico-based workflows with standard `OpenVoiceOS/gh-automations` reusable workflows (all refs pinned to SHA `05c0bb4`); adds `build-tests`, `coverage`, `lint`, `license_check`, `pip_audit`, `release-preview`, `repo-health`
  • Add `pyproject.toml` (PEP 517, setuptools backend) and `version` to `version.py`; `setup.py` kept for compatibility
  • Add full type hints and docstrings to `NevermindPlugin`; fix invalid `tuple()` return annotation
  • Expand test suite from 0 → 44 tests: corner cases (empty inputs, `None` context, mid-sentence non-match, case sensitivity) + cancel/passthrough smoke tests for all 11 shipped locales
  • Remove agent-generated docs artefacts (`FAQ.md`, `AUDIT.md`, `SUGGESTIONS.md`, `AI_TRANSPARENCY_LOG.md`)
  • Update README: document that the plugin is enabled by default in `ovos-config` and how to disable it with `"enable": false`

Test plan

  • All 44 unit tests pass (`pytest test/ -v`)
  • `python -m build` produces sdist + wheel without errors
  • CI workflows trigger on this PR and pass

AI Usage Disclaimer

claude-sonnet-4-6. Human reviewed before merge.

🤖 Generated with Claude Code

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: provide test coverage (10 tests, 97% on __init__.py)
- Impact: new test/unittests/test_plugin.py; verifies cancel detection, passthrough, lang fallback, context keys
- Verified via: .venv/bin/pytest test/ -v --cov=ovos_utterance_plugin_cancel
AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: add required per-repo documentation (docs/index.md, FAQ.md, AUDIT.md, SUGGESTIONS.md, AI_TRANSPARENCY_LOG.md) and modernize README with badges and quickstart
- Impact: all mandatory repo-root docs now present; README rewritten with install/dev instructions
- Verified via: manual review
AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: update gh-automations refs @master@dev; replace deprecated set-output with GITHUB_OUTPUT; replace python setup.py bdist_wheel with python -m build; add unit_tests job to build_tests.yml; remove redundant translations job (scripts deleted); use pypa/gh-action-pypi-publish@release/v1
- Impact: workflows now use @dev automations ref; CI runs unit tests on every push/PR; deprecated commands removed
- Verified via: manual review
AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: replace bespoke/TigreGotico-based workflows with standard OpenVoiceOS/gh-automations reusable workflows; migrate from setup.py to pyproject.toml; add __version__ to version.py
- Impact: adds build-tests, coverage, lint, license_check, pip_audit, release-preview, repo-health; replaces publish_stable and release_workflow with standard templates; all gh-automations refs pinned to SHA 05c0bb438ca7d2bc485465bc233fd4e1997f23c5
- Verified via: apply_workflows.py dry-run confirmed all required workflows present
AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: add complete type hints and docstrings to NevermindPlugin; fix invalid tuple() return annotation; replace conflicting Neon BSD header with Apache 2.0 notice
- Impact: __init__.py now fully typed (List/Tuple/Dict/Optional); class and both methods have docstrings; no behavioural change
- Verified via: pytest test/ 10/10 passed
AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: this is a fork — original copyright header must be preserved regardless of how much code changed
- Impact: Neon BSD-style header restored to __init__.py
… non-match, case sensitivity)

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: cover edge cases — empty list, empty string, whitespace-only, None context, cancel phrase not at tail, unsupported lang passthrough, custom constructor args
- Impact: 10 → 21 tests, all passing
- Verified via: pytest test/ 21/21
…nguages

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: verify cancel detection and passthrough for every locale shipped with the plugin; also assert all locales load >0 cancel words
- Impact: 21 → 44 tests; covers ca-ES, da-DK, de-DE, en-US, es-ES, fr-FR, gl-ES, it-IT, nl-NL, pt-BR, pt-PT
- Verified via: pytest test/ 44/44
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 16, 2026

Warning

Rate limit exceeded

@JarbasAl has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 46 minutes and 8 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 46 minutes and 8 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4d3c99ce-e9e9-4d47-b721-b73792e950e5

📥 Commits

Reviewing files that changed from the base of the PR and between 749d60c and f627fbc.

📒 Files selected for processing (3)
  • .github/workflows/build-tests.yml
  • README.md
  • ovos_utterance_plugin_cancel/__init__.py
📝 Walkthrough

Walkthrough

This PR modernizes the ovos-utterance-plugin-cancel repository by migrating GitHub Actions workflows to centralized reusable templates in OpenVoiceOS/gh-automations, reorganizing locale data from translations/ JSON structure to ovos_utterance_plugin_cancel/locale/ intent files, adding type annotations and docstrings to the plugin code, introducing pyproject.toml for PEP 517 compliance, and adding comprehensive documentation and unit tests.

Changes

Cohort / File(s) Summary
GitHub Actions Workflows Migration
.github/workflows/build-tests.yml, .github/workflows/coverage.yml, .github/workflows/license_check.yml, .github/workflows/lint.yml, .github/workflows/pip_audit.yml, .github/workflows/release-preview.yml, .github/workflows/repo-health.yml
Added new workflows delegating to centralized OpenVoiceOS/gh-automations reusable templates; passes explicit PYPI_TOKEN and MATRIX_TOKEN secrets and configuration inputs (Python versions, test paths, coverage targets).
Stable & Alpha Release Workflows
.github/workflows/publish_stable.yml, .github/workflows/release_workflow.yml
Refactored from inline multi-job implementations to single reusable workflow calls at OpenVoiceOS/gh-automations; simplified permission scoping, added bot-skip conditions, and updated trigger configuration; removed redundant publish_pypi and sync_dev jobs.
Deprecated Workflow Removal
.github/workflows/build_tests.yml
Removed legacy local workflow that built distributions and ran basic installation checks; functionality delegated to centralized build testing infrastructure.
Plugin Code Enhancement
ovos_utterance_plugin_cancel/__init__.py
Added explicit type annotations (name: str, priority: int, return Tuple[List[str], Dict[str, object]]), comprehensive docstrings, improved locale loading logic with bracket expansion and deduplication, and refined error messaging (cancel.intent instead of cancel.dialog).
Locale Data Reorganization
ovos_utterance_plugin_cancel/locale/*/cancel.intent, translations/*/intents.json, translations/gl-es/strings
Removed entire translations/*/ JSON structure (9 language files) and deleted old translation synchronization scripts; locale phrase data now consolidated in locale/<lang>/cancel.intent source files.
Build System Modernization
pyproject.toml
Added PEP 517-compliant pyproject.toml with setuptools.build_meta backend, project metadata (Python >=3.10), dependencies, optional dev group, and plugin entry point declaration at ovos.utterance.transformer.
Version Management
ovos_utterance_plugin_cancel/version.py
Added __version__ string constructed from VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, and optional alpha suffix, enabling dynamic version resolution in pyproject.toml.
Translation Script Removal
scripts/prepare_translations.py, scripts/sync_translations.py
Deleted utility scripts for converting locale files to/from JSON translations structure; no longer needed with new single-source locale file approach.
Test Coverage Addition
test/unittests/test_plugin.py
Added 229-line comprehensive unit test suite covering cancel phrase matching, context payload validation, locale fallback behavior, unsupported language handling, edge cases (empty utterances, whitespace), and locale smoke tests across all shipped language variants.
Documentation Expansion
README.md, FAQ.md, AUDIT.md, SUGGESTIONS.md, AI_TRANSPARENCY_LOG.md
Replaced brief plugin description with full overview including installation, language support list, configuration details, and development setup; added FAQ documenting cache behavior and context keys; documented known issues, technical debt, and proposed enhancements; added transparency log entry for AI-assisted modernization.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Workflows now dance with reusable grace,
Locale files consolidated in their place,
Type hints and docstrings make the code shine bright,
Tests ensure the cancel works just right!
From scattered scripts to modern form,
This plugin's been refreshed and transformed! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.76% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main changes: modernizing CI workflows, adding pyproject.toml, implementing type hints, and introducing tests.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/add-standard-workflows

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: remove FAQ.md, AUDIT.md, SUGGESTIONS.md, AI_TRANSPARENCY_LOG.md added by AI pipeline; not appropriate for this repo
- Impact: files deleted from history going forward
AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: plugin ships enabled by default in ovos-config; users need to know how to disable it
- Impact: Configuration section updated with default config snippet and disable example
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🧹 Nitpick comments (3)
.github/workflows/coverage.yml (1)

19-19: min_coverage: 0 makes the coverage gate a no-op.

With a threshold of 0, coverage regressions will never fail the job. If the intent is "report only for now, enforce later", that's fine — otherwise consider setting a realistic floor (e.g. the current baseline) so drops are surfaced.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/coverage.yml at line 19, The coverage gate currently uses
min_coverage: 0 which disables enforcement; update the workflow to set
min_coverage to a realistic floor (for example the current baseline percentage
or an env/CI variable like MIN_COVERAGE_BASELINE) instead of 0 so coverage
regressions fail the job; locate the min_coverage key in the coverage workflow
and replace 0 with the chosen baseline value or variable and add a brief comment
explaining that it represents the enforced minimum.
README.md (1)

37-38: Mixing pip install and uv run in the same snippet is inconsistent.

A reader copy-pasting these two lines will install with plain pip into whatever environment is active, then invoke uv run pytest which may pick a different environment (uv prefers .venv / managed interpreter). Either stay on pip+venv or go all-in on uv.

📝 Two consistent alternatives

All-pip:

-pip install -e ".[dev]"
-uv run pytest test/ -v --cov=ovos_utterance_plugin_cancel
+pip install -e ".[dev]"
+pytest test/ -v --cov=ovos_utterance_plugin_cancel

All-uv:

-pip install -e ".[dev]"
-uv run pytest test/ -v --cov=ovos_utterance_plugin_cancel
+uv pip install -e ".[dev]"
+uv run pytest test/ -v --cov=ovos_utterance_plugin_cancel
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 37 - 38, The snippet mixes two different environment
invocations ("pip install -e \".[dev]\"" and "uv run pytest ..."), so pick one
consistent approach and update both lines accordingly; either (A) use pip+pytest
by keeping "pip install -e \".[dev]\"" and replace "uv run pytest ..." with
plain "pytest -v --cov=ovos_utterance_plugin_cancel", or (B) use uv for both by
prefixing the install with "uv run" (so run the install inside uv's interpreter)
and keep "uv run pytest -v --cov=ovos_utterance_plugin_cancel".
ovos_utterance_plugin_cancel/__init__.py (1)

72-77: The cancel phrases are being returned correctly without trailing whitespace — tests confirm the matching works as intended.

The concern about f.readlines() preserving trailing newlines is logically sound, but the test suite validates that the code works correctly: 44+ test cases including multi-locale smoke tests confirm that utterance.endswith(nevermind) matching succeeds. If cancel phrases retained \n, tests like test_cancel_word_detected_en() with ["hey mycroft nevermind that"] would fail. They pass, so expand_template either strips its output or the line is stripped before processing.

The code is currently robust in practice, but the pattern still relies on implementation details of expand_template. The suggested defensive fix (strip both input and output explicitly) would improve clarity and reduce reliance on undocumented behavior — worth applying for maintainability:

Suggested improvement — explicit stripping at boundaries
             with open(res_path) as f:
-                for line in f.readlines():
-                    if line.startswith("#"):
-                        continue
-                    lines.extend(expand_template(line))
-            return list({l for l in lines if l.strip()})
+                for line in f:
+                    line = line.strip()
+                    if not line or line.startswith("#"):
+                        continue
+                    lines.extend(expand_template(line))
+            return list({l.strip() for l in lines if l.strip()})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ovos_utterance_plugin_cancel/__init__.py` around lines 72 - 77, The code
currently reads lines from res_path and feeds them to expand_template which may
or may not strip trailing whitespace; to be explicit and defensive, strip each
line before calling expand_template and also strip each yielded template result
before extending lines (i.e., inside the loop that calls expand_template and
when collecting its outputs), so update the block around expand_template to call
line = line.strip() and to only extend with stripped results (or filter out
empty strings after stripping) to ensure no leading/trailing whitespace is
returned by the function.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/build-tests.yml:
- Line 10: The workflow reference currently uses a floating ref
"OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev"; update it to
the pinned SHA
"OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@05c0bb4" so the
action is deterministic—locate the uses entry (the string containing
"OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev") and replace
"@dev" with "@05c0bb4".
- Line 16: The workflow uses install_extras: 'test' but pyproject.toml only
defines the dev extra; either change install_extras to 'dev' in the workflow
(update the install_extras: value) or add a test extra in pyproject.toml under
[project.optional-dependencies] that lists "pytest" and "pytest-cov" (mirroring
the dev extra) so install_extras: 'test' resolves.

In @.github/workflows/coverage.yml:
- Line 10: Replace the mutable branch ref "@dev" on the reusable workflow
reference in the coverage workflow with the pinned commit SHA claimed in the PR
(05c0bb4); specifically update the uses entry
"OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev" to use the exact
SHA ref instead (e.g., ".github/workflows/coverage.yml@05c0bb4") and apply the
same change to the other modified workflow files (lint.yml, license_check.yml,
pip_audit.yml, build-tests.yml, repo-health.yml, release-preview.yml,
release_workflow.yml, publish_stable.yml) so all reusable workflow uses lines
consistently reference the pinned SHA.

In @.github/workflows/pip_audit.yml:
- Line 10: Update the reusable workflow reference so it is pinned to the
specific SHA instead of the mutable branch: change the uses entry that currently
reads "uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev" to
use the pinned commit SHA "05c0bb4" (i.e., "uses:
OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@05c0bb4") to match
the PR objectives and ensure deterministic workflow runs.

In @.github/workflows/release-preview.yml:
- Line 10: The workflow ref currently uses a mutable tag ("uses:
OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev"); change
that ref to the pinned SHA stated in the PR objectives by replacing "@dev" with
"@05c0bb4" in the uses line (or if the objectives are outdated, update the PR
description to state the desired ref and leave the uses line as-is); ensure the
final change uses the exact string "@05c0bb4" in the uses declaration to make
the workflow reproducible.

In @.github/workflows/repo-health.yml:
- Line 10: The workflow ref currently uses the floating ref
"OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev"; change it to
the pinned SHA by replacing "@dev" with "@05c0bb4" so the line reads
"OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@05c0bb4", ensuring
the workflow is pinned to the specified commit.

In `@FAQ.md`:
- Around line 10-19: The FAQ currently embeds brittle line-number references to
code; update the doc to reference stable symbols instead: replace
`__init__.py:43`/`49` with NevermindPlugin.get_cancel_words (or the
get_cancel_words function decorated with lru_cache), replace
`__init__.py:69`/`104` with NevermindPlugin.transform (or the transform method
that sets {"canceled": True, "cancel_word": ...}), replace `__init__.py:39`/`46`
with NevermindPlugin.__init__ (where priority is set), and remove or replace the
setup.py line-number reference with the entry-point key
`ovos-utterance-cancel-plugin` and/or the entry point group
`ovos.utterance.transformer`; ensure all mentions point to these symbol names
instead of line numbers.

In `@pyproject.toml`:
- Line 10: pyproject.toml currently declares Apache-2.0 but the source headers
are BSD 3-clause; update pyproject.toml's license = { text = "Apache-2.0" } to
license = { text = "BSD-3-Clause" } and replace/remove any Apache classifiers,
adding the OSI BSD 3-Clause classifier ("License :: OSI Approved :: BSD 3-Clause
'New' or 'Revised' License") in the classifiers list; also ensure the repository
LICENSE file contains the BSD 3-clause text that matches the headers in
ovos_utterance_plugin_cancel/__init__.py so source, LICENSE, and pyproject
metadata are consistent.

In `@SUGGESTIONS.md`:
- Line 5: The SUGGESTIONS.md entry "Migrate to `pyproject.toml` — replace
`setup.py`..." is now outdated because pyproject.toml was already added in this
PR; update SUGGESTIONS.md by either removing that bullet or rewording it to
describe next-step packaging improvements (e.g., switching to a specific
build-backend or detailing remaining packaging tasks) and update the associated
[inconsistent_summary] note to reflect the change; locate the bullet by the
exact phrase "Migrate to `pyproject.toml`" to modify it and ensure the file no
longer claims pyproject.toml is missing.

In `@test/unittests/test_plugin.py`:
- Around line 112-120: test_case_sensitive_no_match is non-deterministic because
it doesn't assert a single expected outcome; update the test to pin the expected
behavior: either (A) if matching must be case-sensitive, change
test_case_sensitive_no_match to call self.plugin.transform(["CANCEL THAT"],
{"lang": "en-US"}) and assert ctx.get("canceled") is False and utterances ==
["CANCEL THAT"]; or (B) if behavior varies by locale, split into two tests that
call self.plugin.transform with explicit locales and assert the known
expectation for each locale. Reference the existing test_case_sensitive_no_match
and the plugin.transform call when implementing the change.

---

Nitpick comments:
In @.github/workflows/coverage.yml:
- Line 19: The coverage gate currently uses min_coverage: 0 which disables
enforcement; update the workflow to set min_coverage to a realistic floor (for
example the current baseline percentage or an env/CI variable like
MIN_COVERAGE_BASELINE) instead of 0 so coverage regressions fail the job; locate
the min_coverage key in the coverage workflow and replace 0 with the chosen
baseline value or variable and add a brief comment explaining that it represents
the enforced minimum.

In `@ovos_utterance_plugin_cancel/__init__.py`:
- Around line 72-77: The code currently reads lines from res_path and feeds them
to expand_template which may or may not strip trailing whitespace; to be
explicit and defensive, strip each line before calling expand_template and also
strip each yielded template result before extending lines (i.e., inside the loop
that calls expand_template and when collecting its outputs), so update the block
around expand_template to call line = line.strip() and to only extend with
stripped results (or filter out empty strings after stripping) to ensure no
leading/trailing whitespace is returned by the function.

In `@README.md`:
- Around line 37-38: The snippet mixes two different environment invocations
("pip install -e \".[dev]\"" and "uv run pytest ..."), so pick one consistent
approach and update both lines accordingly; either (A) use pip+pytest by keeping
"pip install -e \".[dev]\"" and replace "uv run pytest ..." with plain "pytest
-v --cov=ovos_utterance_plugin_cancel", or (B) use uv for both by prefixing the
install with "uv run" (so run the install inside uv's interpreter) and keep "uv
run pytest -v --cov=ovos_utterance_plugin_cancel".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a4c2c117-2b12-412c-85b1-b03f2283250d

📥 Commits

Reviewing files that changed from the base of the PR and between d0fe9ef and 749d60c.

📒 Files selected for processing (44)
  • .github/workflows/build-tests.yml
  • .github/workflows/build_tests.yml
  • .github/workflows/coverage.yml
  • .github/workflows/license_check.yml
  • .github/workflows/lint.yml
  • .github/workflows/pip_audit.yml
  • .github/workflows/publish_stable.yml
  • .github/workflows/release-preview.yml
  • .github/workflows/release_workflow.yml
  • .github/workflows/repo-health.yml
  • AI_TRANSPARENCY_LOG.md
  • AUDIT.md
  • FAQ.md
  • README.md
  • SUGGESTIONS.md
  • ovos_utterance_plugin_cancel/__init__.py
  • ovos_utterance_plugin_cancel/locale/ca-es/cancel.intent
  • ovos_utterance_plugin_cancel/locale/da-dk/cancel.intent
  • ovos_utterance_plugin_cancel/locale/de-de/cancel.intent
  • ovos_utterance_plugin_cancel/locale/en-us/cancel.intent
  • ovos_utterance_plugin_cancel/locale/es-es/cancel.intent
  • ovos_utterance_plugin_cancel/locale/fr-fr/cancel.intent
  • ovos_utterance_plugin_cancel/locale/gl-es/cancel.intent
  • ovos_utterance_plugin_cancel/locale/it-it/cancel.intent
  • ovos_utterance_plugin_cancel/locale/nl-nl/cancel.intent
  • ovos_utterance_plugin_cancel/locale/pt-br/cancel.intent
  • ovos_utterance_plugin_cancel/locale/pt-pt/cancel.intent
  • ovos_utterance_plugin_cancel/version.py
  • pyproject.toml
  • scripts/prepare_translations.py
  • scripts/sync_translations.py
  • test/unittests/test_plugin.py
  • translations/ca-es/intents.json
  • translations/da-dk/intents.json
  • translations/de-de/intents.json
  • translations/en-us/intents.json
  • translations/es-es/intents.json
  • translations/fr-fr/intents.json
  • translations/gl-es/intents.json
  • translations/gl-es/strings
  • translations/it-it/intents.json
  • translations/nl-nl/intents.json
  • translations/pt-br/intents.json
  • translations/pt-pt/intents.json
💤 Files with no reviewable changes (26)
  • ovos_utterance_plugin_cancel/locale/gl-es/cancel.intent
  • translations/gl-es/intents.json
  • ovos_utterance_plugin_cancel/locale/da-dk/cancel.intent
  • translations/pt-br/intents.json
  • translations/de-de/intents.json
  • ovos_utterance_plugin_cancel/locale/en-us/cancel.intent
  • ovos_utterance_plugin_cancel/locale/ca-es/cancel.intent
  • ovos_utterance_plugin_cancel/locale/nl-nl/cancel.intent
  • ovos_utterance_plugin_cancel/locale/it-it/cancel.intent
  • translations/ca-es/intents.json
  • .github/workflows/build_tests.yml
  • ovos_utterance_plugin_cancel/locale/es-es/cancel.intent
  • translations/fr-fr/intents.json
  • ovos_utterance_plugin_cancel/locale/de-de/cancel.intent
  • translations/pt-pt/intents.json
  • ovos_utterance_plugin_cancel/locale/pt-br/cancel.intent
  • translations/it-it/intents.json
  • translations/en-us/intents.json
  • ovos_utterance_plugin_cancel/locale/pt-pt/cancel.intent
  • translations/da-dk/intents.json
  • translations/gl-es/strings
  • translations/es-es/intents.json
  • translations/nl-nl/intents.json
  • scripts/prepare_translations.py
  • scripts/sync_translations.py
  • ovos_utterance_plugin_cancel/locale/fr-fr/cancel.intent


jobs:
build:
uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Workflow ref uses @dev instead of pinned SHA.

Same issue: this workflow uses @dev instead of the pinned SHA 05c0bb4 specified in the PR objectives.

📌 Proposed fix to pin the workflow ref
-    uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev
+    uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@05c0bb4
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev
uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@05c0bb4
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build-tests.yml at line 10, The workflow reference
currently uses a floating ref
"OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev"; update it to
the pinned SHA
"OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@05c0bb4" so the
action is deterministic—locate the uses entry (the string containing
"OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev") and replace
"@dev" with "@05c0bb4".

Comment thread .github/workflows/build-tests.yml Outdated

jobs:
coverage:
uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Reusable workflow ref does not match PR's stated SHA pinning.

The PR description states OpenVoiceOS/gh-automations refs are pinned to SHA 05c0bb4, but this (and the other 5 new/updated workflow files — lint.yml, license_check.yml, pip_audit.yml, build-tests.yml, repo-health.yml, release-preview.yml, release_workflow.yml, publish_stable.yml) all use a mutable @dev branch ref. A mutable ref on a reusable workflow is a supply-chain risk: any upstream push to dev silently changes your CI behavior (and can run arbitrary code with your PYPI_TOKEN/MATRIX_TOKEN). Please either pin to the SHA as claimed, or update the PR description to reflect the actual @dev policy.

🔒 Proposed fix — pin to SHA consistently
-    uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev
+    uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@05c0bb4

Apply the same change to every reusable workflow reference added in this PR.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev
uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@05c0bb4
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/coverage.yml at line 10, Replace the mutable branch ref
"@dev" on the reusable workflow reference in the coverage workflow with the
pinned commit SHA claimed in the PR (05c0bb4); specifically update the uses
entry "OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev" to use the
exact SHA ref instead (e.g., ".github/workflows/coverage.yml@05c0bb4") and apply
the same change to the other modified workflow files (lint.yml,
license_check.yml, pip_audit.yml, build-tests.yml, repo-health.yml,
release-preview.yml, release_workflow.yml, publish_stable.yml) so all reusable
workflow uses lines consistently reference the pinned SHA.


jobs:
pip_audit:
uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Workflow ref uses @dev instead of pinned SHA.

Same issue as in release-preview.yml: the PR objectives specify pinning to SHA 05c0bb4, but this workflow uses the mutable @dev ref. Please update for consistency and stability.

📌 Proposed fix to pin the workflow ref
-    uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev
+    uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@05c0bb4
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev
uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@05c0bb4
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pip_audit.yml at line 10, Update the reusable workflow
reference so it is pinned to the specific SHA instead of the mutable branch:
change the uses entry that currently reads "uses:
OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev" to use the
pinned commit SHA "05c0bb4" (i.e., "uses:
OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@05c0bb4") to match
the PR objectives and ensure deterministic workflow runs.


jobs:
release_preview:
uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Workflow ref uses @dev instead of pinned SHA.

The PR objectives state: "Replace bespoke workflows with standard OpenVoiceOS/gh-automations reusable workflows (refs pinned to SHA 05c0bb4)". However, this workflow uses @dev, which is a mutable ref that can introduce breaking changes without warning.

Using a pinned SHA ensures reproducibility and stability. Please update to use @05c0bb4 as stated in the PR objectives, or clarify if the objectives documentation is outdated.

📌 Proposed fix to pin the workflow ref
-    uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev
+    uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@05c0bb4
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev
uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@05c0bb4
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/release-preview.yml at line 10, The workflow ref currently
uses a mutable tag ("uses:
OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev"); change
that ref to the pinned SHA stated in the PR objectives by replacing "@dev" with
"@05c0bb4" in the uses line (or if the objectives are outdated, update the PR
description to state the desired ref and leave the uses line as-is); ensure the
final change uses the exact string "@05c0bb4" in the uses declaration to make
the workflow reproducible.


jobs:
repo_health:
uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Workflow ref uses @dev instead of pinned SHA.

Same issue: this workflow uses @dev instead of the pinned SHA 05c0bb4 specified in the PR objectives.

📌 Proposed fix to pin the workflow ref
-    uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev
+    uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@05c0bb4
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev
uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@05c0bb4
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/repo-health.yml at line 10, The workflow ref currently
uses the floating ref
"OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev"; change it to
the pinned SHA by replacing "@dev" with "@05c0bb4" so the line reads
"OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@05c0bb4", ensuring
the workflow is pinned to the specified commit.

Comment thread FAQ.md Outdated
Comment on lines +10 to +19
A: `get_cancel_words` is `@lru_cache`'d per language for the process lifetime — `__init__.py:43`. Restart the OVOS process after editing locale files.

**Q: What context keys does the plugin set on cancel?**
A: `{"canceled": True, "cancel_word": "<matched phrase>"}` — `__init__.py:69`.

**Q: What is the plugin priority?**
A: 15 (lower = earlier). Set in `NevermindPlugin.__init__` — `__init__.py:39`.

**Q: Which entry point does OVOS use to discover this plugin?**
A: `ovos.utterance.transformer` — `setup.py:97`. The plugin key is `ovos-utterance-cancel-plugin`.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Line-number references are already stale against the current __init__.py.

Based on the __init__.py in this PR:

FAQ claim Actual line Note
__init__.py:43 (lru_cache) 49 (decorator) / 50 (def)
__init__.py:69 (context keys) 104
__init__.py:39 (priority) 46
setup.py:97 couldn't verify from review context

Embedding line numbers in docs makes them brittle — any future edit to __init__.py will silently invalidate them. Prefer referring to the symbol (NevermindPlugin.get_cancel_words, NevermindPlugin.transform, NevermindPlugin.__init__) or the entry-point key instead.

📝 Suggested rewording
-A: The plugin only matches phrases at the **end** of the utterance (`utterance.endswith(phrase)`). The phrase must be listed in `locale/<lang>/cancel.intent` and the language must match within a `langcodes` distance of 10.
+A: The plugin only matches phrases at the **end** of the utterance (`utterance.endswith(phrase)`). The phrase must be listed in `locale/<lang>/cancel.intent` and the language must match within a `langcodes` distance of 10 (see `NevermindPlugin.get_cancel_words`).
@@
-A: `get_cancel_words` is `@lru_cache`'d per language for the process lifetime — `__init__.py:43`. Restart the OVOS process after editing locale files.
+A: `get_cancel_words` is `@lru_cache`'d per language for the process lifetime. Restart the OVOS process after editing locale files.
@@
-A: `{"canceled": True, "cancel_word": "<matched phrase>"}` — `__init__.py:69`.
+A: `{"canceled": True, "cancel_word": "<matched phrase>"}` (see `NevermindPlugin.transform`).
@@
-A: 15 (lower = earlier). Set in `NevermindPlugin.__init__` — `__init__.py:39`.
+A: 15 (lower = earlier). Set in `NevermindPlugin.__init__`.
@@
-A: `ovos.utterance.transformer` — `setup.py:97`. The plugin key is `ovos-utterance-cancel-plugin`.
+A: `ovos.utterance.transformer` (see `pyproject.toml` `[project.entry-points]`). The plugin key is `ovos-utterance-cancel-plugin`.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@FAQ.md` around lines 10 - 19, The FAQ currently embeds brittle line-number
references to code; update the doc to reference stable symbols instead: replace
`__init__.py:43`/`49` with NevermindPlugin.get_cancel_words (or the
get_cancel_words function decorated with lru_cache), replace
`__init__.py:69`/`104` with NevermindPlugin.transform (or the transform method
that sets {"canceled": True, "cancel_word": ...}), replace `__init__.py:39`/`46`
with NevermindPlugin.__init__ (where priority is set), and remove or replace the
setup.py line-number reference with the entry-point key
`ovos-utterance-cancel-plugin` and/or the entry point group
`ovos.utterance.transformer`; ensure all mentions point to these symbol names
instead of line numbers.

Comment thread pyproject.toml
dynamic = ["version"]
description = "OpenVoiceOS Utterance Cancel Plugin"
readme = "README.md"
license = { text = "Apache-2.0" }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd -t f -i '^license' -d 2
echo '---'
head -n 30 LICENSE 2>/dev/null || true
echo '---'
rg -nP '(Apache|BSD|Neon|Redistribution|Licensed under)' -g '!**/locale/**' -g '!pyproject.toml' -g '!*.md' | head -n 40

Repository: OpenVoiceOS/ovos-utterance-plugin-cancel

Length of output: 2312


🏁 Script executed:

cat -n pyproject.toml | head -n 25

Repository: OpenVoiceOS/ovos-utterance-plugin-cancel

Length of output: 1034


🏁 Script executed:

fd -t f -name '*.py' | head -n 20 | xargs -I {} sh -c 'echo "=== {} ===" && head -n 5 {}'

Repository: OpenVoiceOS/ovos-utterance-plugin-cancel

Length of output: 314


🏁 Script executed:

rg -n 'Copyright|License|BSD|Apache' -t py --no-heading | head -n 50

Repository: OpenVoiceOS/ovos-utterance-plugin-cancel

Length of output: 243


🏁 Script executed:

head -n 15 ovos_utterance_plugin_cancel/__init__.py

Repository: OpenVoiceOS/ovos-utterance-plugin-cancel

Length of output: 1135


🏁 Script executed:

find . -name '*.py' -type f | xargs head -n 10 | grep -E '(Copyright|Apache|BSD|Redistribution)' | sort | uniq -c

Repository: OpenVoiceOS/ovos-utterance-plugin-cancel

Length of output: 382


Resolve license metadata mismatch: source files declare BSD 3-clause but pyproject.toml declares Apache-2.0.

Source files in ovos_utterance_plugin_cancel/__init__.py contain a BSD 3-clause license header (NEON AI copyright 2008-2021 Neongecko.com Inc.) with redistribution conditions typical of BSD licensing. However, pyproject.toml declares license = { text = "Apache-2.0" } on line 10 and includes the Apache Software License classifier on line 18. This mismatch will cause the package to be incorrectly licensed on PyPI and in downstream SBOMs.

Update the license declaration and classifiers in pyproject.toml to match the actual license used in the source code, and ensure the LICENSE file is consistent with the declared license.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pyproject.toml` at line 10, pyproject.toml currently declares Apache-2.0 but
the source headers are BSD 3-clause; update pyproject.toml's license = { text =
"Apache-2.0" } to license = { text = "BSD-3-Clause" } and replace/remove any
Apache classifiers, adding the OSI BSD 3-Clause classifier ("License :: OSI
Approved :: BSD 3-Clause 'New' or 'Revised' License") in the classifiers list;
also ensure the repository LICENSE file contains the BSD 3-clause text that
matches the headers in ovos_utterance_plugin_cancel/__init__.py so source,
LICENSE, and pyproject metadata are consistent.

Comment thread SUGGESTIONS.md Outdated
Comment on lines +112 to +120
def test_case_sensitive_no_match(self) -> None:
"""Matching is case-sensitive — uppercase phrase should not match."""
utterances, ctx = self.plugin.transform(["CANCEL THAT"], {"lang": "en-US"})
# if locale phrases are lowercase this should not match
if ctx.get("canceled"):
# locale phrases happen to be uppercase too — that's fine
self.assertIn("cancel_word", ctx)
else:
self.assertEqual(utterances, ["CANCEL THAT"])
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

test_case_sensitive_no_match can never fail.

Both branches of the if ctx.get("canceled") conditional assert something that is trivially true (the other branch just re-checks the input was returned unchanged, which is a tautology when nothing matched). The test documents behavior rather than verifying it — any regression in case-sensitivity handling would still pass. Pin down the actual expected behavior (case-sensitive vs case-insensitive) and assert it directly; if it's genuinely locale-dependent, split into per-locale tests with known expectations.

Proposed shape
-    def test_case_sensitive_no_match(self) -> None:
-        """Matching is case-sensitive — uppercase phrase should not match."""
-        utterances, ctx = self.plugin.transform(["CANCEL THAT"], {"lang": "en-US"})
-        # if locale phrases are lowercase this should not match
-        if ctx.get("canceled"):
-            # locale phrases happen to be uppercase too — that's fine
-            self.assertIn("cancel_word", ctx)
-        else:
-            self.assertEqual(utterances, ["CANCEL THAT"])
+    def test_case_sensitive_no_match(self) -> None:
+        """Matching is case-sensitive — uppercase phrase should not match en-US lowercase phrases."""
+        utterances, ctx = self.plugin.transform(["CANCEL THAT"], {"lang": "en-US"})
+        self.assertEqual(utterances, ["CANCEL THAT"])
+        self.assertFalse(ctx.get("canceled"))
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def test_case_sensitive_no_match(self) -> None:
"""Matching is case-sensitive — uppercase phrase should not match."""
utterances, ctx = self.plugin.transform(["CANCEL THAT"], {"lang": "en-US"})
# if locale phrases are lowercase this should not match
if ctx.get("canceled"):
# locale phrases happen to be uppercase too — that's fine
self.assertIn("cancel_word", ctx)
else:
self.assertEqual(utterances, ["CANCEL THAT"])
def test_case_sensitive_no_match(self) -> None:
"""Matching is case-sensitive — uppercase phrase should not match en-US lowercase phrases."""
utterances, ctx = self.plugin.transform(["CANCEL THAT"], {"lang": "en-US"})
self.assertEqual(utterances, ["CANCEL THAT"])
self.assertFalse(ctx.get("canceled"))
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/unittests/test_plugin.py` around lines 112 - 120,
test_case_sensitive_no_match is non-deterministic because it doesn't assert a
single expected outcome; update the test to pin the expected behavior: either
(A) if matching must be case-sensitive, change test_case_sensitive_no_match to
call self.plugin.transform(["CANCEL THAT"], {"lang": "en-US"}) and assert
ctx.get("canceled") is False and utterances == ["CANCEL THAT"]; or (B) if
behavior varies by locale, split into two tests that call self.plugin.transform
with explicit locales and assert the known expectation for each locale.
Reference the existing test_case_sensitive_no_match and the plugin.transform
call when implementing the change.

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: address actionable CodeRabbit feedback on PR #28
- Impact:
  - workflows: revert gh-automations refs from pinned SHA back to @dev (per project convention)
  - build-tests.yml: fix install_extras 'test' -> 'dev' to match pyproject.toml extras
  - __init__.py: explicit line.strip() before expand_template; skip blank lines defensively
  - README: consistent uv toolchain in dev snippet (uv pip install + uv run pytest)
- Skipped: min_coverage: 0 — template default, not enforced here
- Verified via: pytest test/ 44/44
@JarbasAl JarbasAl merged commit 9b51119 into dev Apr 17, 2026
1 check passed
JarbasAl added a commit that referenced this pull request Apr 17, 2026
* Translate intents.json via GitLocalize (#24)

Co-authored-by: nuriapochatbsc <nuria.poch.at.bsc@gmail.com>

* Update translations

* Increment Version to 0.2.6a1

* Update Changelog

* fix(i18n): normalize locale folder names to canonical BCP-47 form (#26)

Rename all locale directories to use canonical BCP-47 codes:
- Lowercase regions → uppercase (da-dk → da-DK, en-us → en-US)
- Bare language codes → full BCP-47 (da → da-DK, eu → eu-ES)
- Invalid codes remapped (eu-eu → eu-ES, fa-fa → fa-IR)
- Nested bare-language subdirs merged up (eu-ES/eu/ → eu-ES/)

This fixes wheel build failures caused by ZIP files containing
duplicate entries with different contents for the same logical path.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Update translations

* Increment Version to 0.2.7a1

* Update Changelog

* ci: modernize workflows, add pyproject.toml, type hints and tests (#28)

* test: add unit tests for NevermindPlugin

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: provide test coverage (10 tests, 97% on __init__.py)
- Impact: new test/unittests/test_plugin.py; verifies cancel detection, passthrough, lang fallback, context keys
- Verified via: .venv/bin/pytest test/ -v --cov=ovos_utterance_plugin_cancel

* docs: add /docs, FAQ, AUDIT, SUGGESTIONS and update README

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: add required per-repo documentation (docs/index.md, FAQ.md, AUDIT.md, SUGGESTIONS.md, AI_TRANSPARENCY_LOG.md) and modernize README with badges and quickstart
- Impact: all mandatory repo-root docs now present; README rewritten with install/dev instructions
- Verified via: manual review

* ci: modernize GitHub Actions workflows

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: update gh-automations refs @master@dev; replace deprecated set-output with GITHUB_OUTPUT; replace python setup.py bdist_wheel with python -m build; add unit_tests job to build_tests.yml; remove redundant translations job (scripts deleted); use pypa/gh-action-pypi-publish@release/v1
- Impact: workflows now use @dev automations ref; CI runs unit tests on every push/PR; deprecated commands removed
- Verified via: manual review

* ci: add standard OpenVoiceOS shared workflows + pyproject.toml

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: replace bespoke/TigreGotico-based workflows with standard OpenVoiceOS/gh-automations reusable workflows; migrate from setup.py to pyproject.toml; add __version__ to version.py
- Impact: adds build-tests, coverage, lint, license_check, pip_audit, release-preview, repo-health; replaces publish_stable and release_workflow with standard templates; all gh-automations refs pinned to SHA 05c0bb438ca7d2bc485465bc233fd4e1997f23c5
- Verified via: apply_workflows.py dry-run confirmed all required workflows present

* .

* refactor: add type hints, docstrings, fix return type annotation

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: add complete type hints and docstrings to NevermindPlugin; fix invalid tuple() return annotation; replace conflicting Neon BSD header with Apache 2.0 notice
- Impact: __init__.py now fully typed (List/Tuple/Dict/Optional); class and both methods have docstrings; no behavioural change
- Verified via: pytest test/ 10/10 passed

* fix: restore original Neon AI license header

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: this is a fork — original copyright header must be preserved regardless of how much code changed
- Impact: Neon BSD-style header restored to __init__.py

* test: add corner-case tests (empty inputs, None context, mid-sentence non-match, case sensitivity)

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: cover edge cases — empty list, empty string, whitespace-only, None context, cancel phrase not at tail, unsupported lang passthrough, custom constructor args
- Impact: 10 → 21 tests, all passing
- Verified via: pytest test/ 21/21

* test: add per-locale cancel+passthrough tests for all 11 supported languages

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: verify cancel detection and passthrough for every locale shipped with the plugin; also assert all locales load >0 cancel words
- Impact: 21 → 44 tests; covers ca-ES, da-DK, de-DE, en-US, es-ES, fr-FR, gl-ES, it-IT, nl-NL, pt-BR, pt-PT
- Verified via: pytest test/ 44/44

* chore: remove agent-generated docs artefacts

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: remove FAQ.md, AUDIT.md, SUGGESTIONS.md, AI_TRANSPARENCY_LOG.md added by AI pipeline; not appropriate for this repo
- Impact: files deleted from history going forward

* docs: document default-enabled status and how to disable

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: plugin ships enabled by default in ovos-config; users need to know how to disable it
- Impact: Configuration section updated with default config snippet and disable example

* .

* fix: address CodeRabbit review comments

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: address actionable CodeRabbit feedback on PR #28
- Impact:
  - workflows: revert gh-automations refs from pinned SHA back to @dev (per project convention)
  - build-tests.yml: fix install_extras 'test' -> 'dev' to match pyproject.toml extras
  - __init__.py: explicit line.strip() before expand_template; skip blank lines defensively
  - README: consistent uv toolchain in dev snippet (uv pip install + uv run pytest)
- Skipped: min_coverage: 0 — template default, not enforced here
- Verified via: pytest test/ 44/44

* Increment Version to 0.2.7a2

* Update Changelog

* fix: drop setup.py and requirements.txt (#30)

* chore: drop setup.py and requirements.txt, pyproject.toml is the source of truth

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: fix CI build failure — setup.py read requirements.txt which no longer exists; pyproject.toml already declares all deps and entry points
- Impact: python -m build now uses pyproject.toml exclusively; setup.py and requirements.txt removed
- Verified via: pyproject.toml has all deps, entry-points, and dynamic version from version.py

* fix: remove invalid PYPI_TOKEN/MATRIX_TOKEN secrets from non-release workflows

AI-Generated Change:
- Model: claude-sonnet-4-6
- Intent: fix startup_failure on repo-health, build-tests, coverage, lint, license_check, pip_audit, release-preview — those reusable workflows do not declare PYPI_TOKEN/MATRIX_TOKEN as inputs so passing them causes a validation error
- Impact: secrets block removed from 7 workflows; only release_workflow and publish_stable retain them
- Verified via: gh-automations workflow definitions confirm none of these accept those secrets

* Increment Version to 0.2.8a1

* Update Changelog

---------

Co-authored-by: gitlocalize-app[bot] <55277160+gitlocalize-app[bot]@users.noreply.github.com>
Co-authored-by: nuriapochatbsc <nuria.poch.at.bsc@gmail.com>
Co-authored-by: JarbasAl <JarbasAl@users.noreply.github.com>
Co-authored-by: JarbasAI <33701864+JarbasAl@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant