Skip to content

ci: wire shared opm-check workflow (opm.pipeline entry-points)#787

Merged
JarbasAl merged 1 commit into
devfrom
ci/add-opm-check
Jun 28, 2026
Merged

ci: wire shared opm-check workflow (opm.pipeline entry-points)#787
JarbasAl merged 1 commit into
devfrom
ci/add-opm-check

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Jun 27, 2026

Copy link
Copy Markdown
Member

ovos-core declares three opm.pipeline entry-points (converse/fallback/stop pipeline plugins) in pyproject.toml but had no opm_check workflow, so entry-point registration was never validated in CI.

This adds the shared gh-automations/.github/workflows/opm-check.yml@dev caller, mirroring the install extras / system deps used by build_tests.yml. Auto-detection enumerates the declared opm.* entry points and verifies they are discoverable by OPM after install.

Small, self-contained, backward-compatible: workflow-only, no code or dependency changes.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Added automated checks for plugin validation on pushes, pull requests, and manual runs.
    • Included required setup for the validation environment to help keep changes more reliable.

ovos-core ships three opm.pipeline plugins (converse/fallback/stop) but
had no opm_check workflow. Add the shared gh-automations opm-check caller
@dev so entry-point registration is validated on PRs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bd5221cc-917e-4d53-b799-7477ab1b5456

📥 Commits

Reviewing files that changed from the base of the PR and between f1e9f49 and 915b881.

📒 Files selected for processing (1)
  • .github/workflows/opm_check.yml

📝 Walkthrough

Walkthrough

A new GitHub Actions workflow file opm_check.yml is added. It triggers on pushes to master, pull requests targeting dev, and manual dispatch. It defines one job that calls the reusable OpenVoiceOS/gh-automations/.github/workflows/opm-check.yml@dev workflow with plugin_type: 'pipeline', Python 3.11, system dependencies, and install extras.

Changes

OPM Check Workflow

Layer / File(s) Summary
OPM check workflow definition
.github/workflows/opm_check.yml
New workflow triggered on push to master, PR to dev, and manual dispatch; delegates to a reusable OPM check workflow with plugin_type: 'pipeline' and Python 3.11.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Poem

A rabbit hops through pipelines bright,
A workflow spawned to check things right,
OPM calls with secrets passed,
Python 3.11 runs so fast,
🐇 Push to master, PR too — all checks in sight! ✅

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

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.

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown

At your service! I've gathered all the check results for you. 🫡

I've aggregated the results of the automated checks for this PR below.

📋 Repo Health

Ensuring the repo is ready for a marathon (aka long-term support). 🏁

✅ All required files present.

Latest Version: 2.2.4a1

ovos_core/version.py — Version file
README.md — README
LICENSE — License file
pyproject.toml — pyproject.toml
⚠️ setup.py — setup.py
CHANGELOG.md — Changelog
ovos_core/version.py has valid version block markers

🏷️ Release Preview

The release banner is being designed! 🎨

Current: 2.2.4a1Next: 2.2.4a2

Signal Value
Label (none)
PR title ci: wire shared opm-check workflow (opm.pipeline entry-points)
Bump alpha

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 2.2.4a2

Channel Status Note Current Constraint
Stable Too new (must be <1.4.0) ovos-core>=1.3.1,<1.4.0
Testing Compatible ovos-core>=2.1.1,<3.0.0
Alpha Compatible ovos-core>=2.2.4a1

🌍 Locale Build

The automated gnomes have finished their shift. 🍄

✅ Locale properly configured (64 files, 17 languages)

Locale directories found:

  • ovos_core/intent_services/locale

Localization coverage:

  • ovos_core/intent_services/locale: 64 files in 17 languages (eu-ES, es-es, it-it, de-de, uk-ua...)

pyproject.toml:[tool.setuptools.package-data.ovos_core] includes locale

  • intent_services/locale/*/*.voc

Build manifest: ✅ 31 locale files included in package

🔒 Security (pip-audit)

I've checked for any hardcoded credentials. 🔑

✅ No known vulnerabilities found (110 packages scanned).

📊 Coverage

Checking the integrity of our test cases. 💎

⚠️ 60.8% total coverage

Files below 80% coverage (8 files)
File Coverage Missing lines
ovos_core/__init__.py 0.0% 7
ovos_core/__main__.py 0.0% 26
ovos_core/intent_services/__init__.py 0.0% 1
ovos_core/version.py 0.0% 18
ovos_core/skill_installer.py 42.3% 139
ovos_core/intent_services/service.py 50.0% 163
ovos_core/skill_manager.py 58.8% 173
ovos_core/transformers.py 66.0% 49

Full report: download the coverage-report artifact.

🔨 Build Tests

I've checked the welds on your new features. 👨‍🏭

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

🔌 Plugin Detection

Checking if the plugin is ready for wide-scale deployment. 🌍

⚠️ Plugin Status: WARNINGS (3)

Plugin Info:

  • Name: ovos-core
  • Description: The spiritual successor to Mycroft AI, OVOS is flexible voice assistant software that can be run almost anywhere!

OPM Detection:

Plugin Type Wheel Editable
pipeline

Entry Point Validation:

Entry Point Type Import Interface
ovos-converse-pipeline-plugin pipeline ✅ 12ms
ovos-fallback-pipeline-plugin pipeline ✅ 1ms
ovos-stop-pipeline-plugin pipeline ✅ 316ms

⊘ No settingsmeta.json
requires-python >=3.10 — running Python 3.11

Issues:

  • ⚠️ Import time for ovos-stop-pipeline-plugin is slow (316ms)
  • ⚠️ No settingsmeta.json found
  • ⚠️ No settingsmeta.json found

⚖️ License Check

Verifying that everything is above board legally. ⚓

✅ No license violations found.

Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed.

🔌 Skill Tests (ovoscope)

Evaluating the skill's performance in real-world scenarios. 🌍

2/36 passed, 1 failed

❌ **TestAdaptIntent** — 0/4
Test Result
test_intent_blacklist ❌ subtests passed
test_padatious_no_match ❌ subtests passed
test_adapt_match ❌ subtests passed
test_skill_blacklist ❌ subtests passed

test_intent_blacklist failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_padatious_no_match failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_adapt_match failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestCancelIntentMidSentence** — 0/1
Test Result
test_cancel_match ❌ subtests passed

test_cancel_match failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestConverse** — 0/1
Test Result
test_parrot_mode ❌ subtests passed

test_parrot_mode failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestCountSkills** — 0/4
Test Result
test_count ❌ subtests passed
test_count_infinity_stop_low ❌ subtests passed
test_count_infinity_global ❌ subtests passed
test_count_infinity_active ❌ subtests passed

test_count failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_count_infinity_stop_low failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_count_infinity_global failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestDeactivate** — 2/3
Test Result
test_deactivate ✅ passed
test_activate ✅ passed
test_deactivate_inside_converse ❌ subtests passed

test_deactivate_inside_converse failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestFallback** — 0/1
Test Result
test_fallback_match ❌ failed

test_fallback_match failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestGlobalStopVocWithActiveSkill** — 0/1
Test Result
test_global_stop_voc_with_active_skill ❌ subtests passed

test_global_stop_voc_with_active_skill failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestGlobalStopVocabulary** — 0/2
Test Result
test_global_stop_voc_no_active_skills ❌ subtests passed
test_stop_voc_exact_still_works ❌ subtests passed

test_global_stop_voc_no_active_skills failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_stop_voc_exact_still_works failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestIntentPipelineRouting** — 0/4
Test Result
test_padatious_intent_matched ❌ subtests passed
test_high_priority_stage_handles_before_low ❌ subtests passed
test_no_match_produces_intent_failure ❌ subtests passed
test_blacklisted_skill_falls_through_to_failure ❌ subtests passed

test_padatious_intent_matched failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_high_priority_stage_handles_before_low failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_no_match_produces_intent_failure failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestLangDisambiguation** — 0/4
Test Result
test_stt_lang ❌ subtests passed
test_invalid_lang_detection ❌ subtests passed
test_metadata_preferred_over_text_detection ❌ subtests passed
test_lang_text_detection ❌ subtests passed

test_stt_lang failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_invalid_lang_detection failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_metadata_preferred_over_text_detection failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestNoSkills** — 0/2
Test Result
test_routing ❌ subtests passed
test_complete_failure ❌ subtests passed

test_routing failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_complete_failure failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestPadatiousIntent** — 0/4
Test Result
test_skill_blacklist ❌ subtests passed
test_padatious_match ❌ subtests passed
test_adapt_no_match ❌ subtests passed
test_intent_blacklist ❌ subtests passed

test_skill_blacklist failure:

[gw0] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_padatious_match failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_adapt_no_match failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestStopNoSkills** — 0/3
Test Result
test_not_exact_high ❌ subtests passed
test_exact ❌ subtests passed
test_not_exact_med ❌ subtests passed

test_not_exact_high failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_exact failure:

[gw3] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

test_not_exact_med failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestStopServiceAsSkill** — 0/1
Test Result
test_stop_service_emits_activate_and_stop_response ❌ subtests passed

test_stop_service_emits_activate_and_stop_response failure:

[gw2] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python
❌ **TestStopSkillCanHandleFalse** — 0/1
Test Result
test_stop_with_active_skill_ping_pong ❌ subtests passed

test_stop_with_active_skill_ping_pong failure:

[gw1] linux -- Python 3.11.15 /opt/hostedtoolcache/Python/3.11.15/x64/bin/python

🚌 Bus Coverage

A forensic audit of every bus message observed during testing. 🔍

🔴 Coverage Summary

Metric Status Coverage
Listeners ██░░░░░░░░ 20.2% 44/218 handlers
Emitters ██████████ 100% 22/22 observed
Assertions █████████░ 95% 21/22 asserted

📊 Per-Skill Breakdown

Skill Listeners Observed Asserted
AdaptPipeline 4/14 (28.6%) 0/0 0/0
ConverseService 0/4 (0.0%) 0/0 0/0
DomainAdaptPipeline 4/14 (28.6%) 0/0 0/0
FallbackService 2/2 (100.0%) 0/0 0/0
HierarchicalAdaptPipeline 4/14 (28.6%) 0/0 0/0
IntentService 2/4 (50.0%) 0/0 0/0
Model2VecIntentPipeline 3/12 (25.0%) 0/0 0/0
Model2VecPrototypePipeline 3/12 (25.0%) 0/0 0/0
PadaciosoPipeline 2/11 (18.2%) 0/0 0/0
PadatiousPipeline 4/15 (26.7%) 0/0 0/0
SkillManager 0/4 (0.0%) 0/0 0/0
__core__ 5/26 (19.2%) 7/7 7/7
ovos-skill-count.openvoiceos 4/20 (20.0%) 8/8 7/8
ovos-skill-fallback-unknown.openvoiceos 3/17 (17.6%) 0/0 0/0
ovos-skill-hello-world.openvoiceos 1/24 (4.2%) 0/0 0/0
stop.openvoiceos 3/21 (14.3%) 7/7 7/7
type 0/4 (0.0%) 0/0 0/0
🔍 Detailed Message Type Breakdown

AdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • intent.service.adapt.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • intent.service.adapt.manifest.get (1062x)
  • register_intent (152x)
  • register_vocab (14756x)

ConverseService

⚠️ Uncovered Listeners:

  • converse:skill (Intent)
  • intent.service.active_skills.get
  • intent.service.skills.activate
  • intent.service.skills.deactivate

DomainAdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • intent.service.adapt.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • intent.service.adapt.manifest.get (1062x)
  • register_intent (152x)
  • register_vocab (14756x)

FallbackService

✅ Covered Listeners:

  • ovos.skills.fallback.deregister (39x)
  • ovos.skills.fallback.register (40x)

HierarchicalAdaptPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.keyword (Intent)
  • detach_intent
  • intent.service.adapt.get
  • intent.service.adapt.vocab.manifest.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • intent.service.adapt.manifest.get (1062x)
  • register_intent (152x)
  • register_vocab (14756x)

IntentService

⚠️ Uncovered Listeners:

  • intent.service.intent.get (Intent)
  • intent.service.skills.deactivate
    ✅ Covered Listeners:
  • intent.service.pipelines.reload (269x)
  • ovos.utterance.handle (155x)

Model2VecIntentPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • detach_intent
  • mycroft.ready
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • padatious:register_intent (197x)
  • register_intent (152x)

Model2VecPrototypePipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • detach_intent
  • mycroft.ready
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • padatious:register_intent (197x)
  • register_intent (152x)

PadaciosoPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • detach_intent
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • padatious:register_intent (197x)

PadatiousPipeline

⚠️ Uncovered Listeners:

  • ovos.intent.deregister (Intent)
  • ovos.intent.disable (Intent)
  • ovos.intent.enable (Intent)
  • ovos.intent.register.template (Intent)
  • padatious:register_entity (Intent)
  • detach_intent
  • intent.service.padatious.entities.manifest.get
  • intent.service.padatious.get
  • ovos.entity.deregister
  • ovos.entity.register
  • ovos.skill.deregister
    ✅ Covered Listeners:
  • detach_skill (444x)
  • intent.service.padatious.manifest.get (1062x)
  • mycroft.skills.train (269x)
  • padatious:register_intent (197x)

SkillManager

⚠️ Uncovered Listeners:

  • skillmanager.activate
  • skillmanager.deactivate
  • skillmanager.keep
  • skillmanager.list

__core__

⚠️ Uncovered Listeners:

  • add_context
  • clear_context
  • message
  • mycroft.ovos-skill-count.openvoiceos.all_loaded
  • mycroft.ovos-skill-count.openvoiceos.is_alive
  • mycroft.ovos-skill-count.openvoiceos.is_ready
  • mycroft.ovos-skill-fallback-unknown.openvoiceos.all_loaded
  • mycroft.ovos-skill-fallback-unknown.openvoiceos.is_alive
  • mycroft.ovos-skill-fallback-unknown.openvoiceos.is_ready
  • mycroft.ovos-skill-hello-world.openvoiceos.all_loaded
  • mycroft.ovos-skill-hello-world.openvoiceos.is_alive
  • mycroft.ovos-skill-hello-world.openvoiceos.is_ready
  • ovos-skill-count.openvoiceos.set
  • ovos-skill-fallback-unknown.openvoiceos.set
  • ovos-skill-hello-world.openvoiceos.set
  • ovos.session.sync
  • ovos.skills.fallback.force_timeout
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos
  • remove_context
  • skill.converse.get_response.disable
  • skill.converse.get_response.enable
    ✅ Covered Listeners:
  • ovos-skill-count.openvoiceos.stop.response (4x)
  • ovos.session.update_default (312x)
  • ovos.skills.fallback.pong (40x)
  • ovos.utterance.handled (292x)
  • skill.stop.pong (2x)

📤 Emitters:

  • complete_intent_failure (Asserted ✅)
  • mycroft.audio.play_sound (Asserted ✅)
  • ovos-skill-count.openvoiceos.stop.ping (Asserted ✅)
  • ovos.utterance.cancelled (Asserted ✅)
  • ovos.utterance.handle (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • recognizer_loop:utterance (Asserted ✅)

ovos-skill-count.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.ovos-skill-count.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • mycroft.ovos-skill-count.openvoiceos.all_loaded
  • mycroft.ovos-skill-count.openvoiceos.is_alive
  • mycroft.ovos-skill-count.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • ovos-skill-count.openvoiceos.converse.get_response
  • ovos-skill-count.openvoiceos.set
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • mycroft.stop (71x)
  • ovos-skill-count.openvoiceos.stop (3x)
  • ovos-skill-count.openvoiceos.stop.ping (3x)
  • ovos-skill-count.openvoiceos:count_to_N.intent (10x)

📤 Emitters:

  • mycroft.skill.handler.complete (Asserted ✅)
  • mycroft.skill.handler.start (Asserted ✅)
  • ovos-skill-count.openvoiceos.activate (Asserted ✅)
  • ovos-skill-count.openvoiceos.stop.response (Asserted ✅)
  • ovos-skill-count.openvoiceos:count_to_N.intent (Asserted ✅)
  • ovos.skills.converse.force_timeout (Not Asserted ⚠️)
  • ovos.utterance.handled (Asserted ✅)
  • skill.stop.pong (Asserted ✅)

ovos-skill-fallback-unknown.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.ovos-skill-fallback-unknown.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • ovos-skill-fallback-unknown.openvoiceos.converse.get_response
  • ovos-skill-fallback-unknown.openvoiceos.stop
  • ovos-skill-fallback-unknown.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • mycroft.stop (74x)
  • ovos.skills.fallback.ovos-skill-fallback-unknown.openvoiceos.request (40x)
  • ovos.skills.fallback.ping (40x)

ovos-skill-hello-world.openvoiceos

⚠️ Uncovered Listeners:

  • ovos-skill-hello-world.openvoiceos:Greetings.intent (Intent)
  • ovos-skill-hello-world.openvoiceos:HelloWorldIntent (Intent)
  • ovos-skill-hello-world.openvoiceos:HowAreYou.intent (Intent)
  • ovos-skill-hello-world.openvoiceos:ThankYouIntent (Intent)
  • question:action (Intent)
  • question:action.ovos-skill-hello-world.openvoiceos (Intent)
  • question:query (Intent)
  • hello.world
  • homescreen.metadata.get
  • mycroft.ovos-skill-hello-world.openvoiceos.all_loaded
  • mycroft.ovos-skill-hello-world.openvoiceos.is_alive
  • mycroft.ovos-skill-hello-world.openvoiceos.is_ready
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • ovos-skill-hello-world.openvoiceos.converse.get_response
  • ovos-skill-hello-world.openvoiceos.set
  • ovos-skill-hello-world.openvoiceos.stop
  • ovos-skill-hello-world.openvoiceos.stop.ping
  • ovos.common_query.ping
  • ovos.skills.settings_changed
    ✅ Covered Listeners:
  • mycroft.stop (64x)

stop.openvoiceos

⚠️ Uncovered Listeners:

  • question:action (Intent)
  • question:action.stop.openvoiceos (Intent)
  • question:query (Intent)
  • homescreen.metadata.get
  • mycroft.skill.disable_intent
  • mycroft.skill.enable_intent
  • mycroft.skill.remove_cross_context
  • mycroft.skill.set_cross_context
  • mycroft.skills.settings.changed
  • mycroft.stop.openvoiceos.all_loaded
  • mycroft.stop.openvoiceos.is_alive
  • mycroft.stop.openvoiceos.is_ready
  • ovos.common_query.ping
  • ovos.skills.settings_changed
  • stop.openvoiceos.converse.get_response
  • stop.openvoiceos.set
  • stop.openvoiceos.stop
  • stop.openvoiceos.stop.ping
    ✅ Covered Listeners:
  • mycroft.stop (74x)
  • stop:global (74x)
  • stop:skill (3x)

📤 Emitters:

  • mycroft.stop (Asserted ✅)
  • ovos-skill-count.openvoiceos.stop (Asserted ✅)
  • ovos.utterance.handled (Asserted ✅)
  • stop.openvoiceos.activate (Asserted ✅)
  • stop.openvoiceos.stop.response (Asserted ✅)
  • stop:global (Asserted ✅)
  • stop:skill (Asserted ✅)

type

⚠️ Uncovered Listeners:

  • recognizer_loop:audio_output_end (Intent)
  • recognizer_loop:audio_output_start (Intent)
  • recognizer_loop:record_begin (Intent)
  • recognizer_loop:record_end (Intent)

📚 Docs

Everything looks good so far! ✅

✅ All required documentation files present.

README.md

🔎 Type Check

Ensuring the codebase remains stable and healthy. 🛡️

mypy: 248 error(s) found

ovos_core/main.py:24:1: error: Skipping analyzing "ovos_utils.log": module is installed, but missing library stubs or py.typed marker [import-untyped]

Errors (showing first 10/248)
test/unittests/test_skill/__init__.py:15:1: error: Skipping analyzing "ovos_workshop.skills.ovos": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:2:1: error: Skipping analyzing "ovos_config": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:3:1: error: Skipping analyzing "ovos_plugin_manager.intent_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:4:1: error: Skipping analyzing "ovos_plugin_manager.metadata_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:5:1: error: Skipping analyzing "ovos_plugin_manager.text_transformers": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:7:1: error: Skipping analyzing "ovos_plugin_manager.templates.pipeline": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:8:1: error: Skipping analyzing "ovos_utils.json_helper": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:9:1: error: Skipping analyzing "ovos_utils.log": module is installed, but missing library stubs or py.typed marker  [import-untyped]
ovos_core/transformers.py:16:9: error: Need type annotation for "loaded_plugins" (hint: "loaded_plugins: dict[<type>, <type>] = ...")  [var-annotated]
ovos_core/transformers.py:24:27: error: Function "builtins.any" is not valid as a type  [valid-type]

Making code review just a little bit easier. 💆‍♂️

@JarbasAl JarbasAl closed this Jun 28, 2026
@JarbasAl JarbasAl reopened this Jun 28, 2026
@JarbasAl JarbasAl closed this Jun 28, 2026
@JarbasAl JarbasAl reopened this Jun 28, 2026
@JarbasAl JarbasAl marked this pull request as ready for review June 28, 2026 22:15
@JarbasAl JarbasAl merged commit 8c1e0a1 into dev Jun 28, 2026
49 of 53 checks passed
@JarbasAl JarbasAl deleted the ci/add-opm-check branch June 28, 2026 22:15
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