From abfb3e753d145d2a929a0eb68d5d77b7b1acc5fd Mon Sep 17 00:00:00 2001 From: "gitlocalize-app[bot]" <55277160+gitlocalize-app[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 08:30:03 +0000 Subject: [PATCH 01/61] es-es/translate (#45) * Translate skill.json via GitLocalize * Translate dialogs.json via GitLocalize * Translate vocabs.json via GitLocalize --------- Co-authored-by: nuriapochatbsc --- locale/es-es/skill.json | 6 ++++++ translations/es-es/dialogs.json | 5 +++++ translations/es-es/vocabs.json | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 locale/es-es/skill.json create mode 100644 translations/es-es/dialogs.json create mode 100644 translations/es-es/vocabs.json diff --git a/locale/es-es/skill.json b/locale/es-es/skill.json new file mode 100644 index 0000000..f64d1ec --- /dev/null +++ b/locale/es-es/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "comando de lanzamiento ___", + "ejecutar script ___" + ] +} diff --git a/translations/es-es/dialogs.json b/translations/es-es/dialogs.json new file mode 100644 index 0000000..9d098f0 --- /dev/null +++ b/translations/es-es/dialogs.json @@ -0,0 +1,5 @@ +{ + "running.dialog": [ + "ejecutando {alias} (comando|script)" + ] +} diff --git a/translations/es-es/vocabs.json b/translations/es-es/vocabs.json new file mode 100644 index 0000000..800d47d --- /dev/null +++ b/translations/es-es/vocabs.json @@ -0,0 +1,5 @@ +{ + "Run.voc": [ + "(correr|ejecutar|lanzar) (un|una|)(comando|script)" + ] +} From ecda049172fb97cbf23b1dadddf9f48fc1acdda8 Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Mon, 19 Jan 2026 08:30:16 +0000 Subject: [PATCH 02/61] Update translations --- locale/es-es/Run.voc | 1 + locale/es-es/running.dialog | 1 + 2 files changed, 2 insertions(+) create mode 100644 locale/es-es/Run.voc create mode 100644 locale/es-es/running.dialog diff --git a/locale/es-es/Run.voc b/locale/es-es/Run.voc new file mode 100644 index 0000000..de21fd2 --- /dev/null +++ b/locale/es-es/Run.voc @@ -0,0 +1 @@ +(correr|ejecutar|lanzar) (un|una|)(comando|script) \ No newline at end of file diff --git a/locale/es-es/running.dialog b/locale/es-es/running.dialog new file mode 100644 index 0000000..67cb866 --- /dev/null +++ b/locale/es-es/running.dialog @@ -0,0 +1 @@ +ejecutando {alias} (comando|script) \ No newline at end of file From 1927f2e7b5bbffbde347f51e9ce4965bad82ca15 Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Mon, 19 Jan 2026 08:30:29 +0000 Subject: [PATCH 03/61] Increment Version to 0.2.12a1 --- version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.py b/version.py index afedc35..3f2c7a6 100644 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 VERSION_MINOR = 2 -VERSION_BUILD = 11 -VERSION_ALPHA = 0 +VERSION_BUILD = 12 +VERSION_ALPHA = 1 # END_VERSION_BLOCK From fbf7b4120b446ad1988f2996e40c3feddd567781 Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Mon, 19 Jan 2026 08:30:56 +0000 Subject: [PATCH 04/61] Update Changelog --- CHANGELOG.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad4a0c7..3cb4c3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,16 @@ # Changelog -## [0.2.11a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.11a1) (2025-04-02) +## [0.2.12a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.12a1) (2026-01-19) -[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.10...0.2.11a1) +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/V0.2.11...0.2.12a1) **Merged pull requests:** -- optimizing German translation for better usage [\#43](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/43) ([gitlocalize-app[bot]](https://github.com/apps/gitlocalize-app)) -- optimizing German translation for better usage [\#42](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/42) ([gitlocalize-app[bot]](https://github.com/apps/gitlocalize-app)) +- es-es/translate [\#45](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/45) ([gitlocalize-app[bot]](https://github.com/apps/gitlocalize-app)) + +## [V0.2.11](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/V0.2.11) (2025-06-08) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.11...V0.2.11) From c3e0c9b1a9acf83f2a9897ec777830fb609e4484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Trellu?= Date: Tue, 17 Mar 2026 21:11:40 -0600 Subject: [PATCH 05/61] Add French cmd locale (#47) --- locale/fr-fr/Run.voc | 1 + locale/fr-fr/running.dialog | 1 + locale/fr-fr/skill.json | 6 ++++++ translations/fr-fr/dialogs.json | 5 +++++ translations/fr-fr/vocabs.json | 5 +++++ 5 files changed, 18 insertions(+) create mode 100644 locale/fr-fr/Run.voc create mode 100644 locale/fr-fr/running.dialog create mode 100644 locale/fr-fr/skill.json create mode 100644 translations/fr-fr/dialogs.json create mode 100644 translations/fr-fr/vocabs.json diff --git a/locale/fr-fr/Run.voc b/locale/fr-fr/Run.voc new file mode 100644 index 0000000..fe6dbff --- /dev/null +++ b/locale/fr-fr/Run.voc @@ -0,0 +1 @@ +(lance|exécute|démarre) (la|le|) (commande|script) \ No newline at end of file diff --git a/locale/fr-fr/running.dialog b/locale/fr-fr/running.dialog new file mode 100644 index 0000000..63a740c --- /dev/null +++ b/locale/fr-fr/running.dialog @@ -0,0 +1 @@ +J'exécute {alias}. \ No newline at end of file diff --git a/locale/fr-fr/skill.json b/locale/fr-fr/skill.json new file mode 100644 index 0000000..d2d47c4 --- /dev/null +++ b/locale/fr-fr/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "lance la commande ___", + "exécute le script ___" + ] +} diff --git a/translations/fr-fr/dialogs.json b/translations/fr-fr/dialogs.json new file mode 100644 index 0000000..b0b60ae --- /dev/null +++ b/translations/fr-fr/dialogs.json @@ -0,0 +1,5 @@ +{ + "running.dialog": [ + "J'exécute {alias}." + ] +} diff --git a/translations/fr-fr/vocabs.json b/translations/fr-fr/vocabs.json new file mode 100644 index 0000000..b0e1da3 --- /dev/null +++ b/translations/fr-fr/vocabs.json @@ -0,0 +1,5 @@ +{ + "Run.voc": [ + "(lance|exécute|démarre) (la|le|) (commande|script)" + ] +} From 2fb2035b275ae8cd75384c6acc8d5dc93dd8725d Mon Sep 17 00:00:00 2001 From: "ovos-localize[bot]" <269068724+ovos-localize[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:05:36 +0000 Subject: [PATCH 06/61] fix: rename bare lang code locale directories (#48) Automated rename submitted by @JarbasAl via OVOS Localize. Co-authored-by: ovos-localize[bot] --- locale/{da => da-DK}/Run.voc | 0 locale/{da => da-DK}/running.dialog | 0 locale/{da => da-DK}/skill.json | 0 locale/{eu => eu-ES}/Run.voc | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename locale/{da => da-DK}/Run.voc (100%) rename locale/{da => da-DK}/running.dialog (100%) rename locale/{da => da-DK}/skill.json (100%) rename locale/{eu => eu-ES}/Run.voc (100%) diff --git a/locale/da/Run.voc b/locale/da-DK/Run.voc similarity index 100% rename from locale/da/Run.voc rename to locale/da-DK/Run.voc diff --git a/locale/da/running.dialog b/locale/da-DK/running.dialog similarity index 100% rename from locale/da/running.dialog rename to locale/da-DK/running.dialog diff --git a/locale/da/skill.json b/locale/da-DK/skill.json similarity index 100% rename from locale/da/skill.json rename to locale/da-DK/skill.json diff --git a/locale/eu/Run.voc b/locale/eu-ES/Run.voc similarity index 100% rename from locale/eu/Run.voc rename to locale/eu-ES/Run.voc From ffbd38ddf40f6fc232be9a60aef09bca8cd1544f Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Tue, 24 Mar 2026 17:05:49 +0000 Subject: [PATCH 07/61] Update translations --- locale/da/Run.voc | 1 + locale/da/running.dialog | 1 + locale/eu/Run.voc | 1 + 3 files changed, 3 insertions(+) create mode 100644 locale/da/Run.voc create mode 100644 locale/da/running.dialog create mode 100644 locale/eu/Run.voc diff --git a/locale/da/Run.voc b/locale/da/Run.voc new file mode 100644 index 0000000..cf84c8d --- /dev/null +++ b/locale/da/Run.voc @@ -0,0 +1 @@ +(kør|udfør|start) (kommando|script) \ No newline at end of file diff --git a/locale/da/running.dialog b/locale/da/running.dialog new file mode 100644 index 0000000..cefcf8a --- /dev/null +++ b/locale/da/running.dialog @@ -0,0 +1 @@ +kører {alias} (kommando|script) \ No newline at end of file diff --git a/locale/eu/Run.voc b/locale/eu/Run.voc new file mode 100644 index 0000000..bad2d0c --- /dev/null +++ b/locale/eu/Run.voc @@ -0,0 +1 @@ +(jarri martxan|exekutatu|abiarazi) (komandoa|script-a) \ No newline at end of file From 3db58eacc6d18c29120e1091000dbb710a356a8c Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Tue, 24 Mar 2026 17:06:02 +0000 Subject: [PATCH 08/61] Increment Version to 0.2.13a1 --- version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.py b/version.py index 3f2c7a6..1f3234d 100644 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 VERSION_MINOR = 2 -VERSION_BUILD = 12 +VERSION_BUILD = 13 VERSION_ALPHA = 1 # END_VERSION_BLOCK From 3a8ef40a26a585542099559429e1dc56ed02320c Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Tue, 24 Mar 2026 17:06:21 +0000 Subject: [PATCH 09/61] Update Changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cb4c3d..db8edc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.2.13a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.13a1) (2026-03-24) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.12a1...0.2.13a1) + +**Merged pull requests:** + +- fix: rename bare lang code locale directories [\#48](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/48) ([ovos-localize[bot]](https://github.com/apps/ovos-localize)) +- Add French cmd locale [\#47](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/47) ([goldyfruit](https://github.com/goldyfruit)) + ## [0.2.12a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.12a1) (2026-01-19) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/V0.2.11...0.2.12a1) From 001d10ec747dcd636d423a60a4ab352e1eea521c Mon Sep 17 00:00:00 2001 From: "ovos-localize[bot]" <269068724+ovos-localize[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:58:12 +0000 Subject: [PATCH 10/61] fix: rename bare lang code locale directories (#50) Automated rename submitted by @JarbasAl via OVOS Localize. Co-authored-by: ovos-localize[bot] --- locale/{ => da-DK}/da/Run.voc | 0 locale/{ => da-DK}/da/running.dialog | 0 locale/{ => eu-ES}/eu/Run.voc | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename locale/{ => da-DK}/da/Run.voc (100%) rename locale/{ => da-DK}/da/running.dialog (100%) rename locale/{ => eu-ES}/eu/Run.voc (100%) diff --git a/locale/da/Run.voc b/locale/da-DK/da/Run.voc similarity index 100% rename from locale/da/Run.voc rename to locale/da-DK/da/Run.voc diff --git a/locale/da/running.dialog b/locale/da-DK/da/running.dialog similarity index 100% rename from locale/da/running.dialog rename to locale/da-DK/da/running.dialog diff --git a/locale/eu/Run.voc b/locale/eu-ES/eu/Run.voc similarity index 100% rename from locale/eu/Run.voc rename to locale/eu-ES/eu/Run.voc From 859f7bf830f9b0f3834c465426b9e7774fe0d839 Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Tue, 24 Mar 2026 17:58:24 +0000 Subject: [PATCH 11/61] Update translations --- locale/da/Run.voc | 1 + locale/da/running.dialog | 1 + locale/eu/Run.voc | 1 + 3 files changed, 3 insertions(+) create mode 100644 locale/da/Run.voc create mode 100644 locale/da/running.dialog create mode 100644 locale/eu/Run.voc diff --git a/locale/da/Run.voc b/locale/da/Run.voc new file mode 100644 index 0000000..cf84c8d --- /dev/null +++ b/locale/da/Run.voc @@ -0,0 +1 @@ +(kør|udfør|start) (kommando|script) \ No newline at end of file diff --git a/locale/da/running.dialog b/locale/da/running.dialog new file mode 100644 index 0000000..cefcf8a --- /dev/null +++ b/locale/da/running.dialog @@ -0,0 +1 @@ +kører {alias} (kommando|script) \ No newline at end of file diff --git a/locale/eu/Run.voc b/locale/eu/Run.voc new file mode 100644 index 0000000..bad2d0c --- /dev/null +++ b/locale/eu/Run.voc @@ -0,0 +1 @@ +(jarri martxan|exekutatu|abiarazi) (komandoa|script-a) \ No newline at end of file From 2fdde6498a5707f60b571bf16f231bbc9ccde957 Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Tue, 24 Mar 2026 17:58:35 +0000 Subject: [PATCH 12/61] Increment Version to 0.2.14a1 --- version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.py b/version.py index 1f3234d..fa59f8b 100644 --- a/version.py +++ b/version.py @@ -1,6 +1,6 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 VERSION_MINOR = 2 -VERSION_BUILD = 13 +VERSION_BUILD = 14 VERSION_ALPHA = 1 # END_VERSION_BLOCK From 3d8e1e090abd0cf65dda47f3cfc725ab35b62152 Mon Sep 17 00:00:00 2001 From: JarbasAl Date: Tue, 24 Mar 2026 17:58:53 +0000 Subject: [PATCH 13/61] Update Changelog --- CHANGELOG.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db8edc9..c7ef03a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.2.14a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a1) (2026-03-24) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.13a1...0.2.14a1) + +**Merged pull requests:** + +- fix: rename bare lang code locale directories [\#50](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/50) ([ovos-localize[bot]](https://github.com/apps/ovos-localize)) + ## [0.2.13a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.13a1) (2026-03-24) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.12a1...0.2.13a1) @@ -11,16 +19,12 @@ ## [0.2.12a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.12a1) (2026-01-19) -[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/V0.2.11...0.2.12a1) +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.11...0.2.12a1) **Merged pull requests:** - es-es/translate [\#45](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/45) ([gitlocalize-app[bot]](https://github.com/apps/gitlocalize-app)) -## [V0.2.11](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/V0.2.11) (2025-06-08) - -[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.11...V0.2.11) - \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* From d790f28f134c14e080fc9cb273baf64eaa04d191 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Fri, 3 Apr 2026 19:06:17 +0100 Subject: [PATCH 14/61] fix(i18n): normalize locale folders to canonical BCP-47 (#52) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(i18n): normalize locale folder names to canonical BCP-47 form 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) * chore(i18n): remove deprecated translations/ folder (gitlocalize) The translations/ folder with JSON files was used by gitlocalize and has been deprecated in favor of ovos-localize. Co-Authored-By: Claude Opus 4.6 (1M context) --------- Co-authored-by: Claude Opus 4.6 (1M context) --- locale/{ca-es => ca-ES}/Run.voc | 0 locale/{ca-es => ca-ES}/running.dialog | 0 locale/{ca-es => ca-ES}/skill.json | 0 locale/da-DK/da/Run.voc | 1 - locale/da-DK/da/running.dialog | 1 - locale/da/Run.voc | 1 - locale/da/running.dialog | 1 - locale/{de-de => de-DE}/Run.voc | 0 locale/{de-de => de-DE}/running.dialog | 0 locale/{de-de => de-DE}/skill.json | 0 locale/{en-us => en-US}/Run.voc | 0 locale/{en-us => en-US}/running.dialog | 0 locale/{en-us => en-US}/skill.json | 0 locale/{es-es => es-ES}/Run.voc | 0 locale/{es-es => es-ES}/running.dialog | 0 locale/{es-es => es-ES}/skill.json | 0 locale/eu-ES/eu/Run.voc | 1 - locale/eu/Run.voc | 1 - locale/{fr-fr => fr-FR}/Run.voc | 0 locale/{fr-fr => fr-FR}/running.dialog | 0 locale/{fr-fr => fr-FR}/skill.json | 0 locale/{gl-es => gl-ES}/Run.voc | 0 locale/{gl-es => gl-ES}/running.dialog | 0 locale/{gl-es => gl-ES}/skill.json | 0 locale/{it-it => it-IT}/Run.voc | 0 locale/{pt-pt => pt-PT}/Run.voc | 0 locale/{pt-pt => pt-PT}/running.dialog | 0 locale/{pt-pt => pt-PT}/skill.json | 0 translations/ca-es/dialogs.json | 5 ----- translations/ca-es/vocabs.json | 5 ----- translations/da/dialogs.json | 5 ----- translations/da/vocabs.json | 5 ----- translations/de-de/dialogs.json | 5 ----- translations/de-de/vocabs.json | 5 ----- translations/en-us/dialogs.json | 5 ----- translations/en-us/vocabs.json | 5 ----- translations/es-es/dialogs.json | 5 ----- translations/es-es/vocabs.json | 5 ----- translations/eu/vocabs.json | 5 ----- translations/fr-fr/dialogs.json | 5 ----- translations/fr-fr/vocabs.json | 5 ----- translations/gl-es/dialogs.json | 5 ----- translations/gl-es/vocabs.json | 5 ----- translations/it-it/vocabs.json | 5 ----- translations/pt-pt/dialogs.json | 5 ----- translations/pt-pt/vocabs.json | 5 ----- 46 files changed, 96 deletions(-) rename locale/{ca-es => ca-ES}/Run.voc (100%) rename locale/{ca-es => ca-ES}/running.dialog (100%) rename locale/{ca-es => ca-ES}/skill.json (100%) delete mode 100644 locale/da-DK/da/Run.voc delete mode 100644 locale/da-DK/da/running.dialog delete mode 100644 locale/da/Run.voc delete mode 100644 locale/da/running.dialog rename locale/{de-de => de-DE}/Run.voc (100%) rename locale/{de-de => de-DE}/running.dialog (100%) rename locale/{de-de => de-DE}/skill.json (100%) rename locale/{en-us => en-US}/Run.voc (100%) rename locale/{en-us => en-US}/running.dialog (100%) rename locale/{en-us => en-US}/skill.json (100%) rename locale/{es-es => es-ES}/Run.voc (100%) rename locale/{es-es => es-ES}/running.dialog (100%) rename locale/{es-es => es-ES}/skill.json (100%) delete mode 100644 locale/eu-ES/eu/Run.voc delete mode 100644 locale/eu/Run.voc rename locale/{fr-fr => fr-FR}/Run.voc (100%) rename locale/{fr-fr => fr-FR}/running.dialog (100%) rename locale/{fr-fr => fr-FR}/skill.json (100%) rename locale/{gl-es => gl-ES}/Run.voc (100%) rename locale/{gl-es => gl-ES}/running.dialog (100%) rename locale/{gl-es => gl-ES}/skill.json (100%) rename locale/{it-it => it-IT}/Run.voc (100%) rename locale/{pt-pt => pt-PT}/Run.voc (100%) rename locale/{pt-pt => pt-PT}/running.dialog (100%) rename locale/{pt-pt => pt-PT}/skill.json (100%) delete mode 100644 translations/ca-es/dialogs.json delete mode 100644 translations/ca-es/vocabs.json delete mode 100644 translations/da/dialogs.json delete mode 100644 translations/da/vocabs.json delete mode 100644 translations/de-de/dialogs.json delete mode 100644 translations/de-de/vocabs.json delete mode 100644 translations/en-us/dialogs.json delete mode 100644 translations/en-us/vocabs.json delete mode 100644 translations/es-es/dialogs.json delete mode 100644 translations/es-es/vocabs.json delete mode 100644 translations/eu/vocabs.json delete mode 100644 translations/fr-fr/dialogs.json delete mode 100644 translations/fr-fr/vocabs.json delete mode 100644 translations/gl-es/dialogs.json delete mode 100644 translations/gl-es/vocabs.json delete mode 100644 translations/it-it/vocabs.json delete mode 100644 translations/pt-pt/dialogs.json delete mode 100644 translations/pt-pt/vocabs.json diff --git a/locale/ca-es/Run.voc b/locale/ca-ES/Run.voc similarity index 100% rename from locale/ca-es/Run.voc rename to locale/ca-ES/Run.voc diff --git a/locale/ca-es/running.dialog b/locale/ca-ES/running.dialog similarity index 100% rename from locale/ca-es/running.dialog rename to locale/ca-ES/running.dialog diff --git a/locale/ca-es/skill.json b/locale/ca-ES/skill.json similarity index 100% rename from locale/ca-es/skill.json rename to locale/ca-ES/skill.json diff --git a/locale/da-DK/da/Run.voc b/locale/da-DK/da/Run.voc deleted file mode 100644 index cf84c8d..0000000 --- a/locale/da-DK/da/Run.voc +++ /dev/null @@ -1 +0,0 @@ -(kør|udfør|start) (kommando|script) \ No newline at end of file diff --git a/locale/da-DK/da/running.dialog b/locale/da-DK/da/running.dialog deleted file mode 100644 index cefcf8a..0000000 --- a/locale/da-DK/da/running.dialog +++ /dev/null @@ -1 +0,0 @@ -kører {alias} (kommando|script) \ No newline at end of file diff --git a/locale/da/Run.voc b/locale/da/Run.voc deleted file mode 100644 index cf84c8d..0000000 --- a/locale/da/Run.voc +++ /dev/null @@ -1 +0,0 @@ -(kør|udfør|start) (kommando|script) \ No newline at end of file diff --git a/locale/da/running.dialog b/locale/da/running.dialog deleted file mode 100644 index cefcf8a..0000000 --- a/locale/da/running.dialog +++ /dev/null @@ -1 +0,0 @@ -kører {alias} (kommando|script) \ No newline at end of file diff --git a/locale/de-de/Run.voc b/locale/de-DE/Run.voc similarity index 100% rename from locale/de-de/Run.voc rename to locale/de-DE/Run.voc diff --git a/locale/de-de/running.dialog b/locale/de-DE/running.dialog similarity index 100% rename from locale/de-de/running.dialog rename to locale/de-DE/running.dialog diff --git a/locale/de-de/skill.json b/locale/de-DE/skill.json similarity index 100% rename from locale/de-de/skill.json rename to locale/de-DE/skill.json diff --git a/locale/en-us/Run.voc b/locale/en-US/Run.voc similarity index 100% rename from locale/en-us/Run.voc rename to locale/en-US/Run.voc diff --git a/locale/en-us/running.dialog b/locale/en-US/running.dialog similarity index 100% rename from locale/en-us/running.dialog rename to locale/en-US/running.dialog diff --git a/locale/en-us/skill.json b/locale/en-US/skill.json similarity index 100% rename from locale/en-us/skill.json rename to locale/en-US/skill.json diff --git a/locale/es-es/Run.voc b/locale/es-ES/Run.voc similarity index 100% rename from locale/es-es/Run.voc rename to locale/es-ES/Run.voc diff --git a/locale/es-es/running.dialog b/locale/es-ES/running.dialog similarity index 100% rename from locale/es-es/running.dialog rename to locale/es-ES/running.dialog diff --git a/locale/es-es/skill.json b/locale/es-ES/skill.json similarity index 100% rename from locale/es-es/skill.json rename to locale/es-ES/skill.json diff --git a/locale/eu-ES/eu/Run.voc b/locale/eu-ES/eu/Run.voc deleted file mode 100644 index bad2d0c..0000000 --- a/locale/eu-ES/eu/Run.voc +++ /dev/null @@ -1 +0,0 @@ -(jarri martxan|exekutatu|abiarazi) (komandoa|script-a) \ No newline at end of file diff --git a/locale/eu/Run.voc b/locale/eu/Run.voc deleted file mode 100644 index bad2d0c..0000000 --- a/locale/eu/Run.voc +++ /dev/null @@ -1 +0,0 @@ -(jarri martxan|exekutatu|abiarazi) (komandoa|script-a) \ No newline at end of file diff --git a/locale/fr-fr/Run.voc b/locale/fr-FR/Run.voc similarity index 100% rename from locale/fr-fr/Run.voc rename to locale/fr-FR/Run.voc diff --git a/locale/fr-fr/running.dialog b/locale/fr-FR/running.dialog similarity index 100% rename from locale/fr-fr/running.dialog rename to locale/fr-FR/running.dialog diff --git a/locale/fr-fr/skill.json b/locale/fr-FR/skill.json similarity index 100% rename from locale/fr-fr/skill.json rename to locale/fr-FR/skill.json diff --git a/locale/gl-es/Run.voc b/locale/gl-ES/Run.voc similarity index 100% rename from locale/gl-es/Run.voc rename to locale/gl-ES/Run.voc diff --git a/locale/gl-es/running.dialog b/locale/gl-ES/running.dialog similarity index 100% rename from locale/gl-es/running.dialog rename to locale/gl-ES/running.dialog diff --git a/locale/gl-es/skill.json b/locale/gl-ES/skill.json similarity index 100% rename from locale/gl-es/skill.json rename to locale/gl-ES/skill.json diff --git a/locale/it-it/Run.voc b/locale/it-IT/Run.voc similarity index 100% rename from locale/it-it/Run.voc rename to locale/it-IT/Run.voc diff --git a/locale/pt-pt/Run.voc b/locale/pt-PT/Run.voc similarity index 100% rename from locale/pt-pt/Run.voc rename to locale/pt-PT/Run.voc diff --git a/locale/pt-pt/running.dialog b/locale/pt-PT/running.dialog similarity index 100% rename from locale/pt-pt/running.dialog rename to locale/pt-PT/running.dialog diff --git a/locale/pt-pt/skill.json b/locale/pt-PT/skill.json similarity index 100% rename from locale/pt-pt/skill.json rename to locale/pt-PT/skill.json diff --git a/translations/ca-es/dialogs.json b/translations/ca-es/dialogs.json deleted file mode 100644 index 8bee48c..0000000 --- a/translations/ca-es/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "s'està executant l'(ordre|script) {alias}" - ] -} diff --git a/translations/ca-es/vocabs.json b/translations/ca-es/vocabs.json deleted file mode 100644 index c15d134..0000000 --- a/translations/ca-es/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(executa|llança|inicia) (un |una |la|l'|sa |s')(ordre|orde|comanda|script)" - ] -} diff --git a/translations/da/dialogs.json b/translations/da/dialogs.json deleted file mode 100644 index 7a33274..0000000 --- a/translations/da/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "kører {alias} (kommando|script)" - ] -} diff --git a/translations/da/vocabs.json b/translations/da/vocabs.json deleted file mode 100644 index 3ca9aa1..0000000 --- a/translations/da/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(kør|udfør|start) (kommando|script)" - ] -} diff --git a/translations/de-de/dialogs.json b/translations/de-de/dialogs.json deleted file mode 100644 index c577bd3..0000000 --- a/translations/de-de/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "führe {alias} (Befehl|Skript) aus" - ] -} diff --git a/translations/de-de/vocabs.json b/translations/de-de/vocabs.json deleted file mode 100644 index f3e4a85..0000000 --- a/translations/de-de/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "starte (Befehl|Skript)\nführe (Befehl|Skript) aus\n(Skript|Befehl) ausführen1\n(Skript|Befehl) starten" - ] -} diff --git a/translations/en-us/dialogs.json b/translations/en-us/dialogs.json deleted file mode 100644 index 72e8a6d..0000000 --- a/translations/en-us/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "running {alias} (command|script)" - ] -} \ No newline at end of file diff --git a/translations/en-us/vocabs.json b/translations/en-us/vocabs.json deleted file mode 100644 index 3d79c35..0000000 --- a/translations/en-us/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(run|execute|launch) (command|script)" - ] -} \ No newline at end of file diff --git a/translations/es-es/dialogs.json b/translations/es-es/dialogs.json deleted file mode 100644 index 9d098f0..0000000 --- a/translations/es-es/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "ejecutando {alias} (comando|script)" - ] -} diff --git a/translations/es-es/vocabs.json b/translations/es-es/vocabs.json deleted file mode 100644 index 800d47d..0000000 --- a/translations/es-es/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(correr|ejecutar|lanzar) (un|una|)(comando|script)" - ] -} diff --git a/translations/eu/vocabs.json b/translations/eu/vocabs.json deleted file mode 100644 index 4a0fe61..0000000 --- a/translations/eu/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(jarri martxan|exekutatu|abiarazi) (komandoa|script-a)" - ] -} \ No newline at end of file diff --git a/translations/fr-fr/dialogs.json b/translations/fr-fr/dialogs.json deleted file mode 100644 index b0b60ae..0000000 --- a/translations/fr-fr/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "J'exécute {alias}." - ] -} diff --git a/translations/fr-fr/vocabs.json b/translations/fr-fr/vocabs.json deleted file mode 100644 index b0e1da3..0000000 --- a/translations/fr-fr/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(lance|exécute|démarre) (la|le|) (commande|script)" - ] -} diff --git a/translations/gl-es/dialogs.json b/translations/gl-es/dialogs.json deleted file mode 100644 index 84c5254..0000000 --- a/translations/gl-es/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "executando {alias} (comando|script)" - ] -} diff --git a/translations/gl-es/vocabs.json b/translations/gl-es/vocabs.json deleted file mode 100644 index e1cc523..0000000 --- a/translations/gl-es/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(executar|arrincar) (comando|script)" - ] -} \ No newline at end of file diff --git a/translations/it-it/vocabs.json b/translations/it-it/vocabs.json deleted file mode 100644 index d2d297e..0000000 --- a/translations/it-it/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(avvia|esegui|lancia|apri) (un|uno|il|lo|) (comando|script|codice)" - ] -} diff --git a/translations/pt-pt/dialogs.json b/translations/pt-pt/dialogs.json deleted file mode 100644 index 5b7175d..0000000 --- a/translations/pt-pt/dialogs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "running.dialog": [ - "a executar (comando|script) {alias}" - ] -} diff --git a/translations/pt-pt/vocabs.json b/translations/pt-pt/vocabs.json deleted file mode 100644 index c4f3300..0000000 --- a/translations/pt-pt/vocabs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "Run.voc": [ - "(executar|lançar|iniciar) (comando|script)" - ] -} From 592f8bf465e4cdaadde4011925c1cfb3dd6d83da Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 4 Apr 2026 05:21:59 +0100 Subject: [PATCH 15/61] ci: modernize GitHub workflows (#53) * fix: aautomations * ci: add standard GitHub Actions workflows --- .github/workflows/build-tests.yml | 15 +++ .github/workflows/build_tests.yml | 39 -------- .github/workflows/coverage.yml | 17 ++++ .github/workflows/license_check.yml | 11 ++ .github/workflows/lint.yml | 14 +++ .github/workflows/ovoscope.yml | 15 +++ .github/workflows/pip_audit.yml | 11 ++ .github/workflows/publish_stable.yml | 79 +++------------ .github/workflows/release-preview.yml | 14 +++ .github/workflows/release_workflow.yml | 133 +++---------------------- .github/workflows/repo-health.yml | 13 +++ .github/workflows/skill-check.yml | 15 +++ .github/workflows/unit_tests.yml | 66 ------------ scripts/sync_translations.py | 73 -------------- 14 files changed, 154 insertions(+), 361 deletions(-) create mode 100644 .github/workflows/build-tests.yml delete mode 100644 .github/workflows/build_tests.yml create mode 100644 .github/workflows/coverage.yml create mode 100644 .github/workflows/license_check.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/ovoscope.yml create mode 100644 .github/workflows/pip_audit.yml create mode 100644 .github/workflows/release-preview.yml create mode 100644 .github/workflows/repo-health.yml create mode 100644 .github/workflows/skill-check.yml delete mode 100644 .github/workflows/unit_tests.yml delete mode 100644 scripts/sync_translations.py diff --git a/.github/workflows/build-tests.yml b/.github/workflows/build-tests.yml new file mode 100644 index 0000000..4eebdac --- /dev/null +++ b/.github/workflows/build-tests.yml @@ -0,0 +1,15 @@ +name: Build Tests + +on: + pull_request: + branches: [dev, master, main] + workflow_dispatch: + +jobs: + build: + uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev + secrets: inherit + with: + python_versions: '["3.10", "3.11", "3.12", "3.13", "3.14"]' + install_extras: 'test' + test_path: 'test' diff --git a/.github/workflows/build_tests.yml b/.github/workflows/build_tests.yml deleted file mode 100644 index 01a5205..0000000 --- a/.github/workflows/build_tests.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Run Build Tests -on: - push: - branches: - - master - pull_request: - branches: - - dev - workflow_dispatch: - -jobs: - build_tests: - strategy: - max-parallel: 2 - matrix: - python-version: [ "3.10", "3.11" ] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - name: Install Build Tools - run: | - python -m pip install build wheel - - name: Install System Dependencies - run: | - sudo apt-get update - sudo apt install python3-dev swig libssl-dev - - name: Build Source Packages - run: | - python setup.py sdist - - name: Build Distribution Packages - run: | - python setup.py bdist_wheel - - name: Install skill - run: | - pip install . \ No newline at end of file diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..7af22c4 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,17 @@ +name: Code Coverage + +on: + pull_request: + branches: [dev] + workflow_dispatch: + +jobs: + coverage: + uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev + secrets: inherit + with: + python_version: '3.11' + coverage_source: 'ovos_skill_cmd' + test_path: 'test/' + install_extras: '' + min_coverage: 0 diff --git a/.github/workflows/license_check.yml b/.github/workflows/license_check.yml new file mode 100644 index 0000000..8757eee --- /dev/null +++ b/.github/workflows/license_check.yml @@ -0,0 +1,11 @@ +name: License Check + +on: + pull_request: + branches: [dev] + workflow_dispatch: + +jobs: + license_check: + uses: OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@dev + secrets: inherit diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..9a6b7a5 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,14 @@ +name: Lint + +on: + pull_request: + branches: [dev, master, main] + workflow_dispatch: + +jobs: + lint: + uses: OpenVoiceOS/gh-automations/.github/workflows/lint.yml@dev + secrets: inherit + with: + ruff: true + pre_commit: false # set true if .pre-commit-config.yaml exists diff --git a/.github/workflows/ovoscope.yml b/.github/workflows/ovoscope.yml new file mode 100644 index 0000000..0f48332 --- /dev/null +++ b/.github/workflows/ovoscope.yml @@ -0,0 +1,15 @@ +name: Skill End-to-End Tests (ovoscope) + +on: + pull_request: + branches: [dev, master, main] + workflow_dispatch: + +jobs: + ovoscope: + uses: OpenVoiceOS/gh-automations/.github/workflows/ovoscope.yml@dev + secrets: inherit + with: + python_version: '3.11' + install_extras: 'test' + test_path: 'test/end2end/' diff --git a/.github/workflows/pip_audit.yml b/.github/workflows/pip_audit.yml new file mode 100644 index 0000000..bb3ca4d --- /dev/null +++ b/.github/workflows/pip_audit.yml @@ -0,0 +1,11 @@ +name: PIP Audit + +on: + pull_request: + branches: [dev] + workflow_dispatch: + +jobs: + pip_audit: + uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev + secrets: inherit diff --git a/.github/workflows/publish_stable.yml b/.github/workflows/publish_stable.yml index 3abbee2..bd3f099 100644 --- a/.github/workflows/publish_stable.yml +++ b/.github/workflows/publish_stable.yml @@ -1,72 +1,23 @@ -name: Stable Release +name: Publish Stable Release + on: - push: - branches: [master] workflow_dispatch: + push: + branches: [master, main] + +permissions: + contents: write # required for version bump commit and release tag jobs: publish_stable: - uses: TigreGotico/gh-automations/.github/workflows/publish-stable.yml@master - secrets: inherit + if: github.actor != 'github-actions[bot]' + uses: OpenVoiceOS/gh-automations/.github/workflows/publish-stable.yml@dev + secrets: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + MATRIX_TOKEN: ${{ secrets.MATRIX_TOKEN }} with: - branch: 'master' version_file: 'version.py' - setup_py: 'setup.py' + publish_pypi: true publish_release: true - - publish_pypi: - needs: publish_stable - if: success() # Ensure this job only runs if the previous job succeeds - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: master - fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - name: Install Build Tools - run: | - python -m pip install build wheel - - name: version - run: echo "::set-output name=version::$(python setup.py --version)" - id: version - - name: Create Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token - with: - tag_name: V${{ steps.version.outputs.version }} - release_name: Release ${{ steps.version.outputs.version }} - body: | - Changes in this Release - ${{ steps.changelog.outputs.changelog }} - draft: false - prerelease: true - commitish: dev - - name: Build Distribution Packages - run: | - python setup.py sdist bdist_wheel - - name: Publish to Test PyPI - uses: pypa/gh-action-pypi-publish@master - with: - password: ${{secrets.PYPI_TOKEN}} - - - sync_dev: - needs: publish_stable - if: success() # Ensure this job only runs if the previous job succeeds - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. - ref: master - - name: Push master -> dev - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: dev + sync_dev: true + notify_matrix: true diff --git a/.github/workflows/release-preview.yml b/.github/workflows/release-preview.yml new file mode 100644 index 0000000..60f1256 --- /dev/null +++ b/.github/workflows/release-preview.yml @@ -0,0 +1,14 @@ +name: Release Preview + +on: + pull_request: + branches: [dev] + workflow_dispatch: + +jobs: + release_preview: + uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev + secrets: inherit + with: + package_name: 'ovos_skill_cmd' + version_file: 'version.py' diff --git a/.github/workflows/release_workflow.yml b/.github/workflows/release_workflow.yml index 27e824e..8223526 100644 --- a/.github/workflows/release_workflow.yml +++ b/.github/workflows/release_workflow.yml @@ -1,133 +1,28 @@ name: Release Alpha and Propose Stable on: + workflow_dispatch: pull_request: types: [closed] branches: [dev] - workflow_dispatch: - -jobs: - - translations: - runs-on: ubuntu-latest - steps: - - name: Check out repository - uses: actions/checkout@v2 - with: - ref: dev - fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. - - name: Setup Python - uses: actions/setup-python@v1 - with: - python-version: "3.11" - - name: Sync translations by gitlocalize-app[bot] - run: | - python scripts/sync_translations.py - - - name: Commit to dev - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: Update translations - branch: dev +permissions: + contents: write + pull-requests: write +jobs: publish_alpha: - needs: translations - uses: TigreGotico/gh-automations/.github/workflows/publish-alpha.yml@master - secrets: inherit + if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch' + uses: OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev + secrets: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + MATRIX_TOKEN: ${{ secrets.MATRIX_TOKEN }} with: branch: 'dev' version_file: 'version.py' - setup_py: 'setup.py' update_changelog: true publish_prerelease: true - changelog_max_issues: 100 - - notify: - if: github.event.pull_request.merged == true - needs: publish_alpha - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Send message to Matrix bots channel - id: matrix-chat-message - uses: fadenb/matrix-chat-message@v0.0.6 - with: - homeserver: 'matrix.org' - token: ${{ secrets.MATRIX_TOKEN }} - channel: '!WjxEKjjINpyBRPFgxl:krbel.duckdns.org' - message: | - new ${{ github.event.repository.name }} PR merged! https://github.com/${{ github.repository }}/pull/${{ github.event.number }} - - - publish_pypi: - needs: publish_alpha - if: success() # Ensure this job only runs if the previous job succeeds - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - ref: dev - fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. - - name: Setup Python - uses: actions/setup-python@v1 - with: - python-version: "3.11" - - name: Install Build Tools - run: | - python -m pip install build wheel - - name: version - run: echo "::set-output name=version::$(python setup.py --version)" - id: version - - name: Build Distribution Packages - run: | - python setup.py sdist bdist_wheel - - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@master - with: - password: ${{secrets.PYPI_TOKEN}} - - propose_release: - needs: publish_alpha - if: success() # Ensure this job only runs if the previous job succeeds - runs-on: ubuntu-latest - steps: - - name: Checkout dev branch - uses: actions/checkout@v3 - with: - ref: dev - - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: '3.10' - - - name: Get version from setup.py - id: get_version - run: | - VERSION=$(python setup.py --version) - echo "VERSION=$VERSION" >> $GITHUB_ENV - - - name: Create and push new branch - run: | - git checkout -b release-${{ env.VERSION }} - git push origin release-${{ env.VERSION }} - - - name: Open Pull Request from dev to master - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Variables - BRANCH_NAME="release-${{ env.VERSION }}" - BASE_BRANCH="master" - HEAD_BRANCH="release-${{ env.VERSION }}" - PR_TITLE="Release ${{ env.VERSION }}" - PR_BODY="Human review requested!" - - # Create a PR using GitHub API - curl -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: token $GITHUB_TOKEN" \ - -d "{\"title\":\"$PR_TITLE\",\"body\":\"$PR_BODY\",\"head\":\"$HEAD_BRANCH\",\"base\":\"$BASE_BRANCH\"}" \ - https://api.github.com/repos/${{ github.repository }}/pulls - + propose_release: true + changelog_max_issues: 50 + publish_pypi: true + notify_matrix: true diff --git a/.github/workflows/repo-health.yml b/.github/workflows/repo-health.yml new file mode 100644 index 0000000..04f4f64 --- /dev/null +++ b/.github/workflows/repo-health.yml @@ -0,0 +1,13 @@ +name: Repo Health + +on: + pull_request: + branches: [dev, master, main] + workflow_dispatch: + +jobs: + repo_health: + uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev + secrets: inherit + with: + version_file: 'version.py' diff --git a/.github/workflows/skill-check.yml b/.github/workflows/skill-check.yml new file mode 100644 index 0000000..ebcfd68 --- /dev/null +++ b/.github/workflows/skill-check.yml @@ -0,0 +1,15 @@ +name: Skill Check + +on: + pull_request: + branches: [dev, master, main] + workflow_dispatch: + +jobs: + skill_check: + uses: OpenVoiceOS/gh-automations/.github/workflows/skill-check.yml@dev + secrets: inherit + with: + fail_on_missing_en_us: true + fail_on_invalid_skill_json: false + skip_if_not_skill: true diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml deleted file mode 100644 index b4c67be..0000000 --- a/.github/workflows/unit_tests.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Run UnitTests -on: - pull_request: - branches: - - dev - paths-ignore: - - 'version.py' - - 'examples/**' - - '.github/**' - - '.gitignore' - - 'LICENSE' - - 'CHANGELOG.md' - - 'MANIFEST.in' - - 'README.md' - - 'scripts/**' - push: - branches: - - master - paths-ignore: - - 'version.py' - - 'examples/**' - - '.github/**' - - '.gitignore' - - 'LICENSE' - - 'CHANGELOG.md' - - 'MANIFEST.in' - - 'README.md' - - 'scripts/**' - workflow_dispatch: - -jobs: - unit_tests: - strategy: - matrix: - python-version: [3.9, "3.10" ] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install System Dependencies - run: | - sudo apt-get update - sudo apt install python3-dev - python -m pip install build wheel - - name: Install core repo - run: | - pip install . - - name: Install test dependencies - run: | - pip install pytest pytest-timeout pytest-cov - - name: Install System Dependencies - run: | - sudo apt-get update - - name: Install ovos dependencies - run: | - pip install ovos-plugin-manager - - name: Run unittests - run: | - pytest --cov=ovos-skill-cmd --cov-report xml test - - name: Upload coverage - env: - CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} - uses: codecov/codecov-action@v2 diff --git a/scripts/sync_translations.py b/scripts/sync_translations.py deleted file mode 100644 index 33831a0..0000000 --- a/scripts/sync_translations.py +++ /dev/null @@ -1,73 +0,0 @@ -"""this script should run in every PR originated from @gitlocalize-app -TODO - before PR merge -""" - -import json -from os.path import dirname -import os - -locale = f"{dirname(dirname(__file__))}/locale" -tx = f"{dirname(dirname(__file__))}/translations" - - -for lang in os.listdir(tx): - intents = f"{tx}/{lang}/intents.json" - dialogs = f"{tx}/{lang}/dialogs.json" - vocs = f"{tx}/{lang}/vocabs.json" - regexes = f"{tx}/{lang}/regexes.json" - - if os.path.isfile(intents): - with open(intents) as f: - data = json.load(f) - for fid, samples in data.items(): - if samples: - samples = [s.strip() for s in samples - if s and s.strip() != "[UNUSED]"] # s may be None - with open(f"{locale}/{lang.lower()}/{fid}", "w") as f: - f.write("\n".join(sorted(samples))) - - if os.path.isfile(dialogs): - with open(dialogs) as f: - data = json.load(f) - for fid, samples in data.items(): - if samples: - samples = list(set([s.strip() for s in samples - if s and s.strip() != "[UNUSED]"])) # s may be None - if fid.startswith("/"): - p = f"{locale}/{lang.lower()}{fid}" - else: - p = f"{locale}/{lang.lower()}/{fid}" - os.makedirs(os.path.dirname(p), exist_ok=True) - with open(f"{locale}/{lang.lower()}/{fid}", "w") as f: - f.write("\n".join(sorted(samples))) - - if os.path.isfile(vocs): - with open(vocs) as f: - data = json.load(f) - for fid, samples in data.items(): - if samples: - samples = list(set([s.strip() for s in samples - if s and s.strip() != "[UNUSED]"])) # s may be None - if fid.startswith("/"): - p = f"{locale}/{lang.lower()}{fid}" - else: - p = f"{locale}/{lang.lower()}/{fid}" - os.makedirs(os.path.dirname(p), exist_ok=True) - with open(f"{locale}/{lang.lower()}/{fid}", "w") as f: - f.write("\n".join(sorted(samples))) - - if os.path.isfile(regexes): - with open(regexes) as f: - data = json.load(f) - for fid, samples in data.items(): - if samples: - samples = list(set([s.strip() for s in samples - if s and s.strip() != "[UNUSED]"])) # s may be None - if fid.startswith("/"): - p = f"{locale}/{lang.lower()}{fid}" - else: - p = f"{locale}/{lang.lower()}/{fid}" - os.makedirs(os.path.dirname(p), exist_ok=True) - with open(f"{locale}/{lang.lower()}/{fid}", "w") as f: - f.write("\n".join(sorted(samples))) - From 2895a1783c84c71185ab2c02f2eeeaaa26eaaeef Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 4 Apr 2026 04:28:01 +0000 Subject: [PATCH 16/61] Increment Version to 0.2.14a2 --- version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.py b/version.py index fa59f8b..9a7efe9 100644 --- a/version.py +++ b/version.py @@ -2,5 +2,5 @@ VERSION_MAJOR = 0 VERSION_MINOR = 2 VERSION_BUILD = 14 -VERSION_ALPHA = 1 +VERSION_ALPHA = 2 # END_VERSION_BLOCK From 64aac416e7c61af9a7713d9a7f6d71cfc1a4d73f Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 4 Apr 2026 04:29:48 +0000 Subject: [PATCH 17/61] Update Changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7ef03a..bd211b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.2.14a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a2) (2026-04-04) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a1...0.2.14a2) + +**Merged pull requests:** + +- ci: modernize GitHub workflows [\#53](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/53) ([JarbasAl](https://github.com/JarbasAl)) +- fix\(i18n\): normalize locale folders to canonical BCP-47 [\#52](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/52) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.2.14a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a1) (2026-03-24) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.13a1...0.2.14a1) From 909ecbe72f67540bdcd960f4fcf243593e5a7b3c Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Thu, 9 Apr 2026 18:09:52 +0100 Subject: [PATCH 18/61] chore(ovos-skill-cmd): allow ovos-workshop<9.0.0 (#55) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ecb2f7a..4739c0e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -ovos-workshop>=0.0.15,<8.0.0 +ovos-workshop>=0.0.15,<9.0.0 From aaf63cf3c0afea61a48fda8e91a7056e6f5eec4d Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:20:22 +0000 Subject: [PATCH 19/61] Increment Version to 0.2.14a3 --- version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.py b/version.py index 9a7efe9..b65f79b 100644 --- a/version.py +++ b/version.py @@ -2,5 +2,5 @@ VERSION_MAJOR = 0 VERSION_MINOR = 2 VERSION_BUILD = 14 -VERSION_ALPHA = 2 +VERSION_ALPHA = 3 # END_VERSION_BLOCK From 8b69770a59d56d769034836145dbb335b5401d18 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:28:21 +0000 Subject: [PATCH 20/61] Update Changelog --- CHANGELOG.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd211b8..eb25550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.2.14a3](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a3) (2026-04-09) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a2...0.2.14a3) + +**Merged pull requests:** + +- chore\(ovos-skill-cmd\): allow ovos-workshop\<9.0.0 [\#55](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/55) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.2.14a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a2) (2026-04-04) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a1...0.2.14a2) @@ -28,12 +36,16 @@ ## [0.2.12a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.12a1) (2026-01-19) -[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.11...0.2.12a1) +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/V0.2.11...0.2.12a1) **Merged pull requests:** - es-es/translate [\#45](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/45) ([gitlocalize-app[bot]](https://github.com/apps/gitlocalize-app)) +## [V0.2.11](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/V0.2.11) (2025-06-08) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.11...V0.2.11) + \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* From 4245d368e8926eba9238a06e99cca442d2ca36f4 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 1 Aug 2026 01:09:49 +0100 Subject: [PATCH 21/61] docs: rewrite README in Simplified Technical English (#58) Co-authored-by: Claude Sonnet 5 --- README.md | 90 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 36f7219..bdd2541 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,23 @@ -# Commands Skill +# OVOS Cmd Skill -A simple OVOS skill for running shell scripts and other commands. The commands execute quietly without requiring confirmation from OVOS. +This OVOS skill runs shell scripts and other commands. The commands run without asking for confirmation. -## Features +## Install -- Run shell scripts or commands by speaking human-readable phrases. -- Configure aliases for easy-to-remember commands. -- Optionally run commands under a specific user's privileges. +```bash +pip install ovos-skill-cmd +``` ## Usage -Trigger commands using phrases like: +Trigger a command with a spoken phrase: -- **"Hey Mycroft, launch command echo TEST"** -- **"Hey Mycroft, run script generate report"** +- "Hey Mycroft, launch command echo TEST" +- "Hey Mycroft, run script generate report" ## Configuration -The skill can be configured to map spoken phrases to scripts or commands in the `settings.json` file. For example: +Configure the skill in `settings.json`. Map a spoken phrase to a script or command under `alias`. For example: ```json { @@ -27,27 +27,30 @@ The skill can be configured to map spoken phrases to scripts or commands in the } ``` -### Example: -- User says: **"Run script generate report"** -- The skill executes: `/home/forslund/scripts/generate_report.sh` +With this setting, the phrase "run script generate report" makes the skill execute `/home/forslund/scripts/generate_report.sh`. -### Additional Settings: +### user -- **`user`** *(optional)*: Specify a username to run commands under their privileges. Example: - ```json - { - "user": "ovos" - } - ``` +Set `user` to run commands under a specific user's privileges: -- **`shell`** *(optional)*: Determines whether commands are executed via a shell. Defaults to `true`. Example: - ```json - { - "shell": false - } - ``` +```json +{ + "user": "ovos" +} +``` + +### shell + +Set `shell` to control whether commands run through a shell. It defaults to `true`: + +```json +{ + "shell": false +} +``` + +### Full example -### Full Configuration Example: ```json { "user": "ovos", @@ -60,21 +63,17 @@ The skill can be configured to map spoken phrases to scripts or commands in the } ``` -## Security Notes +## Security notes -1. **Shell Commands**: - - By default, commands are executed via the shell, which allows complex operations but may expose security risks. If your commands don’t require shell features, set `shell` to `false`. +- Running commands through a shell allows complex operations but can expose security risks. If your commands do not need shell features, set `shell` to `false`. +- A command can run under a specific user through the `user` field. Make sure that user has the permissions the command needs. +- Do not configure dangerous commands, such as `rm -rf`, without additional safeguards. -2. **User Permissions**: - - Commands can run under a specific user by configuring the `user` field. Ensure that the user has appropriate permissions to execute the commands. +## Docker containers -3. **Validation**: - - Avoid configuring dangerous commands like `rm -rf` without additional safeguards. +Commands run only inside the Docker container. If a command also needs an effect outside the container, use an additional mechanism, such as a named pipe. - -## Note for using the skill in Docker containers: - -All commands run exclusively within the Docker container. If the commands/scripts are also supposed to have an effect outside the container, additional solutions are required. Here is an example for steering kodi (outsight the container) with ovos-skill-cmd: +This example steers Kodi, which runs outside the container, from `ovos-skill-cmd`: ```json { @@ -93,10 +92,19 @@ All commands run exclusively within the Docker container. If the commands/script } ``` -"/home/ovos/.config/mycroft/joespipe" is a named pipe placed in the shared volume of the ovos config folder. Outside of the container is a mini script watching for commands in the pipe: +`/home/ovos/.config/mycroft/joespipe` is a named pipe in the shared volume of the OVOS config folder. Outside the container, a small script watches the pipe for commands: -```json +```bash #!/bin/bash while true; do eval "$(cat /storage/ovos/config/joespipe)"; done ``` -A description for the named pipe solution you can find [here](https://stackoverflow.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container) + +Read more about this named-pipe approach on [Stack Overflow](https://stackoverflow.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container). + +## Related projects + +- [OpenVoiceOS/OpenVoiceOS](https://github.com/OpenVoiceOS/OpenVoiceOS) — the OVOS platform this skill runs on. + +## License + +Apache License 2.0. See [LICENSE.txt](LICENSE.txt). From ff458778a5b781c549fd46867692aa3a096c76a2 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 1 Aug 2026 00:19:59 +0000 Subject: [PATCH 22/61] Increment Version to 0.2.14a4 --- version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.py b/version.py index b65f79b..861107e 100644 --- a/version.py +++ b/version.py @@ -2,5 +2,5 @@ VERSION_MAJOR = 0 VERSION_MINOR = 2 VERSION_BUILD = 14 -VERSION_ALPHA = 3 +VERSION_ALPHA = 4 # END_VERSION_BLOCK From f8f24a9459addb94d864770c485b3bd3456fd089 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 1 Aug 2026 00:27:20 +0000 Subject: [PATCH 23/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb25550..12d0a1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.2.14a4](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a4) (2026-08-01) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a3...0.2.14a4) + +**Merged pull requests:** + +- docs: rewrite README in Simplified Technical English [\#58](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/58) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.2.14a3](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a3) (2026-04-09) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a2...0.2.14a3) From f068799b0bc5c7d9e6fbeff318d85ac29a315018 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 10 Aug 2026 22:51:05 +0100 Subject: [PATCH 24/61] feat: add ovoscope end2end intent-routing tests (#57) * feat: add ovoscope end2end intent-routing tests * ci: add ovoscope to test extras Co-Authored-By: Claude Fable 5 * fix(test): use proper Message objects and require pipeline plugins in CI * ci: add padatious/swig deps and fix test extras in workflows Co-Authored-By: Claude Fable 5 * fix: use test_extras not install_extras in coverage workflow * fix: use install_extras '.[test]' in coverage workflow * chore: adopt PEP 621 packaging and align CI workflows Migrate to pyproject.toml with dynamic version and ovos.plugin.skill entry point, move package into ovos_skill_cmd/, drop setup.py and root requirements.txt, and pin test extras to ovoscope/pytest/pytest-timeout/ padacioso. Add locale_check workflow and point version-file based workflows at ovos_skill_cmd/version.py. Co-Authored-By: Claude Opus 4.8 * fix: use canonical opm.* entry-point group (drop deprecated) * fix: require ovos-plugin-manager>=2.4.0a1 for canonical opm.* entry points * fix: cap ovos-* dependencies at next major so latest versions resolve * fix: require ovos-plugin-manager>=2.1.0 for opm.* entry points and cap ovos-* deps at next major * test: make e2e intent routing drift-immune and scope unit tests Convert the adapt intent-routing e2e to subset assertions over a captured message stream (CaptureSession) so it stays robust against ovos-core/ovoscope ordered-sequence drift. Seed a skill settings file with aliases before load so the RunScriptCommandIntent's dynamic Script vocabulary is registered. Move unit tests under test/unittests and scope the build/coverage workflows to them, leaving the ovoscope workflow to run the e2e suite; add swig/libfann system deps and the ovos-adapt-parser test dependency. --------- Co-authored-by: Claude Fable 5 --- .github/workflows/build-tests.yml | 3 +- .github/workflows/coverage.yml | 5 +- .github/workflows/locale_check.yml | 13 ++ .github/workflows/ovoscope.yml | 1 + .github/workflows/publish_stable.yml | 2 +- .github/workflows/release-preview.yml | 2 +- .github/workflows/release_workflow.yml | 2 +- .github/workflows/repo-health.yml | 2 +- MANIFEST.in | 2 +- __init__.py => ovos_skill_cmd/__init__.py | 0 .../locale}/ca-ES/Run.voc | 0 .../locale}/ca-ES/running.dialog | 0 .../locale}/ca-ES/skill.json | 0 .../locale}/da-DK/Run.voc | 0 .../locale}/da-DK/running.dialog | 0 .../locale}/da-DK/skill.json | 0 .../locale}/de-DE/Run.voc | 0 .../locale}/de-DE/running.dialog | 0 .../locale}/de-DE/skill.json | 0 .../locale}/en-US/Run.voc | 0 .../locale}/en-US/running.dialog | 0 .../locale}/en-US/skill.json | 0 .../locale}/es-ES/Run.voc | 0 .../locale}/es-ES/running.dialog | 0 .../locale}/es-ES/skill.json | 0 .../locale}/eu-ES/Run.voc | 0 .../locale}/fr-FR/Run.voc | 0 .../locale}/fr-FR/running.dialog | 0 .../locale}/fr-FR/skill.json | 0 .../locale}/gl-ES/Run.voc | 0 .../locale}/gl-ES/running.dialog | 0 .../locale}/gl-ES/skill.json | 0 .../locale}/it-IT/Run.voc | 0 .../locale}/pt-PT/Run.voc | 0 .../locale}/pt-PT/running.dialog | 0 .../locale}/pt-PT/skill.json | 0 version.py => ovos_skill_cmd/version.py | 2 + pyproject.toml | 46 +++++++ requirements.txt | 1 - setup.py | 92 ------------- test/end2end/test_intents_en_us.py | 121 ++++++++++++++++++ test/{ => unittests}/test_plugin.py | 0 test/{ => unittests}/test_skill_loading.py | 3 +- 43 files changed, 195 insertions(+), 102 deletions(-) create mode 100644 .github/workflows/locale_check.yml rename __init__.py => ovos_skill_cmd/__init__.py (100%) rename {locale => ovos_skill_cmd/locale}/ca-ES/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/ca-ES/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/ca-ES/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/da-DK/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/da-DK/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/da-DK/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/de-DE/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/de-DE/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/de-DE/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/en-US/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/en-US/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/en-US/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/es-ES/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/es-ES/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/es-ES/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/eu-ES/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/fr-FR/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/fr-FR/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/fr-FR/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/gl-ES/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/gl-ES/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/gl-ES/skill.json (100%) rename {locale => ovos_skill_cmd/locale}/it-IT/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/pt-PT/Run.voc (100%) rename {locale => ovos_skill_cmd/locale}/pt-PT/running.dialog (100%) rename {locale => ovos_skill_cmd/locale}/pt-PT/skill.json (100%) rename version.py => ovos_skill_cmd/version.py (50%) create mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100644 setup.py create mode 100644 test/end2end/test_intents_en_us.py rename test/{ => unittests}/test_plugin.py (100%) rename test/{ => unittests}/test_skill_loading.py (96%) diff --git a/.github/workflows/build-tests.yml b/.github/workflows/build-tests.yml index 4eebdac..b77ed02 100644 --- a/.github/workflows/build-tests.yml +++ b/.github/workflows/build-tests.yml @@ -11,5 +11,6 @@ jobs: secrets: inherit with: python_versions: '["3.10", "3.11", "3.12", "3.13", "3.14"]' + system_deps: 'swig libfann-dev' install_extras: 'test' - test_path: 'test' + test_path: 'test/unittests' diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 7af22c4..e58231f 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -12,6 +12,7 @@ jobs: with: python_version: '3.11' coverage_source: 'ovos_skill_cmd' - test_path: 'test/' - install_extras: '' + test_path: 'test/unittests/' + system_deps: 'swig libfann-dev' + test_extras: 'test' min_coverage: 0 diff --git a/.github/workflows/locale_check.yml b/.github/workflows/locale_check.yml new file mode 100644 index 0000000..26471ef --- /dev/null +++ b/.github/workflows/locale_check.yml @@ -0,0 +1,13 @@ +name: Locale Build Check + +on: + pull_request: + branches: [dev] + workflow_dispatch: + +jobs: + locale_check: + uses: OpenVoiceOS/gh-automations/.github/workflows/locale-check.yml@dev + secrets: inherit + with: + pr_comment: true diff --git a/.github/workflows/ovoscope.yml b/.github/workflows/ovoscope.yml index 0f48332..ed33f2f 100644 --- a/.github/workflows/ovoscope.yml +++ b/.github/workflows/ovoscope.yml @@ -13,3 +13,4 @@ jobs: python_version: '3.11' install_extras: 'test' test_path: 'test/end2end/' + require_adapt: true diff --git a/.github/workflows/publish_stable.yml b/.github/workflows/publish_stable.yml index bd3f099..da4b385 100644 --- a/.github/workflows/publish_stable.yml +++ b/.github/workflows/publish_stable.yml @@ -16,7 +16,7 @@ jobs: PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} MATRIX_TOKEN: ${{ secrets.MATRIX_TOKEN }} with: - version_file: 'version.py' + version_file: 'ovos_skill_cmd/version.py' publish_pypi: true publish_release: true sync_dev: true diff --git a/.github/workflows/release-preview.yml b/.github/workflows/release-preview.yml index 60f1256..ccc27ed 100644 --- a/.github/workflows/release-preview.yml +++ b/.github/workflows/release-preview.yml @@ -11,4 +11,4 @@ jobs: secrets: inherit with: package_name: 'ovos_skill_cmd' - version_file: 'version.py' + version_file: 'ovos_skill_cmd/version.py' diff --git a/.github/workflows/release_workflow.yml b/.github/workflows/release_workflow.yml index 8223526..a841f5f 100644 --- a/.github/workflows/release_workflow.yml +++ b/.github/workflows/release_workflow.yml @@ -19,7 +19,7 @@ jobs: MATRIX_TOKEN: ${{ secrets.MATRIX_TOKEN }} with: branch: 'dev' - version_file: 'version.py' + version_file: 'ovos_skill_cmd/version.py' update_changelog: true publish_prerelease: true propose_release: true diff --git a/.github/workflows/repo-health.yml b/.github/workflows/repo-health.yml index 04f4f64..b09125e 100644 --- a/.github/workflows/repo-health.yml +++ b/.github/workflows/repo-health.yml @@ -10,4 +10,4 @@ jobs: uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev secrets: inherit with: - version_file: 'version.py' + version_file: 'ovos_skill_cmd/version.py' diff --git a/MANIFEST.in b/MANIFEST.in index fb05bf3..e276efc 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,2 @@ -recursive-include locale * +recursive-include ovos_skill_cmd/locale * include *.txt \ No newline at end of file diff --git a/__init__.py b/ovos_skill_cmd/__init__.py similarity index 100% rename from __init__.py rename to ovos_skill_cmd/__init__.py diff --git a/locale/ca-ES/Run.voc b/ovos_skill_cmd/locale/ca-ES/Run.voc similarity index 100% rename from locale/ca-ES/Run.voc rename to ovos_skill_cmd/locale/ca-ES/Run.voc diff --git a/locale/ca-ES/running.dialog b/ovos_skill_cmd/locale/ca-ES/running.dialog similarity index 100% rename from locale/ca-ES/running.dialog rename to ovos_skill_cmd/locale/ca-ES/running.dialog diff --git a/locale/ca-ES/skill.json b/ovos_skill_cmd/locale/ca-ES/skill.json similarity index 100% rename from locale/ca-ES/skill.json rename to ovos_skill_cmd/locale/ca-ES/skill.json diff --git a/locale/da-DK/Run.voc b/ovos_skill_cmd/locale/da-DK/Run.voc similarity index 100% rename from locale/da-DK/Run.voc rename to ovos_skill_cmd/locale/da-DK/Run.voc diff --git a/locale/da-DK/running.dialog b/ovos_skill_cmd/locale/da-DK/running.dialog similarity index 100% rename from locale/da-DK/running.dialog rename to ovos_skill_cmd/locale/da-DK/running.dialog diff --git a/locale/da-DK/skill.json b/ovos_skill_cmd/locale/da-DK/skill.json similarity index 100% rename from locale/da-DK/skill.json rename to ovos_skill_cmd/locale/da-DK/skill.json diff --git a/locale/de-DE/Run.voc b/ovos_skill_cmd/locale/de-DE/Run.voc similarity index 100% rename from locale/de-DE/Run.voc rename to ovos_skill_cmd/locale/de-DE/Run.voc diff --git a/locale/de-DE/running.dialog b/ovos_skill_cmd/locale/de-DE/running.dialog similarity index 100% rename from locale/de-DE/running.dialog rename to ovos_skill_cmd/locale/de-DE/running.dialog diff --git a/locale/de-DE/skill.json b/ovos_skill_cmd/locale/de-DE/skill.json similarity index 100% rename from locale/de-DE/skill.json rename to ovos_skill_cmd/locale/de-DE/skill.json diff --git a/locale/en-US/Run.voc b/ovos_skill_cmd/locale/en-US/Run.voc similarity index 100% rename from locale/en-US/Run.voc rename to ovos_skill_cmd/locale/en-US/Run.voc diff --git a/locale/en-US/running.dialog b/ovos_skill_cmd/locale/en-US/running.dialog similarity index 100% rename from locale/en-US/running.dialog rename to ovos_skill_cmd/locale/en-US/running.dialog diff --git a/locale/en-US/skill.json b/ovos_skill_cmd/locale/en-US/skill.json similarity index 100% rename from locale/en-US/skill.json rename to ovos_skill_cmd/locale/en-US/skill.json diff --git a/locale/es-ES/Run.voc b/ovos_skill_cmd/locale/es-ES/Run.voc similarity index 100% rename from locale/es-ES/Run.voc rename to ovos_skill_cmd/locale/es-ES/Run.voc diff --git a/locale/es-ES/running.dialog b/ovos_skill_cmd/locale/es-ES/running.dialog similarity index 100% rename from locale/es-ES/running.dialog rename to ovos_skill_cmd/locale/es-ES/running.dialog diff --git a/locale/es-ES/skill.json b/ovos_skill_cmd/locale/es-ES/skill.json similarity index 100% rename from locale/es-ES/skill.json rename to ovos_skill_cmd/locale/es-ES/skill.json diff --git a/locale/eu-ES/Run.voc b/ovos_skill_cmd/locale/eu-ES/Run.voc similarity index 100% rename from locale/eu-ES/Run.voc rename to ovos_skill_cmd/locale/eu-ES/Run.voc diff --git a/locale/fr-FR/Run.voc b/ovos_skill_cmd/locale/fr-FR/Run.voc similarity index 100% rename from locale/fr-FR/Run.voc rename to ovos_skill_cmd/locale/fr-FR/Run.voc diff --git a/locale/fr-FR/running.dialog b/ovos_skill_cmd/locale/fr-FR/running.dialog similarity index 100% rename from locale/fr-FR/running.dialog rename to ovos_skill_cmd/locale/fr-FR/running.dialog diff --git a/locale/fr-FR/skill.json b/ovos_skill_cmd/locale/fr-FR/skill.json similarity index 100% rename from locale/fr-FR/skill.json rename to ovos_skill_cmd/locale/fr-FR/skill.json diff --git a/locale/gl-ES/Run.voc b/ovos_skill_cmd/locale/gl-ES/Run.voc similarity index 100% rename from locale/gl-ES/Run.voc rename to ovos_skill_cmd/locale/gl-ES/Run.voc diff --git a/locale/gl-ES/running.dialog b/ovos_skill_cmd/locale/gl-ES/running.dialog similarity index 100% rename from locale/gl-ES/running.dialog rename to ovos_skill_cmd/locale/gl-ES/running.dialog diff --git a/locale/gl-ES/skill.json b/ovos_skill_cmd/locale/gl-ES/skill.json similarity index 100% rename from locale/gl-ES/skill.json rename to ovos_skill_cmd/locale/gl-ES/skill.json diff --git a/locale/it-IT/Run.voc b/ovos_skill_cmd/locale/it-IT/Run.voc similarity index 100% rename from locale/it-IT/Run.voc rename to ovos_skill_cmd/locale/it-IT/Run.voc diff --git a/locale/pt-PT/Run.voc b/ovos_skill_cmd/locale/pt-PT/Run.voc similarity index 100% rename from locale/pt-PT/Run.voc rename to ovos_skill_cmd/locale/pt-PT/Run.voc diff --git a/locale/pt-PT/running.dialog b/ovos_skill_cmd/locale/pt-PT/running.dialog similarity index 100% rename from locale/pt-PT/running.dialog rename to ovos_skill_cmd/locale/pt-PT/running.dialog diff --git a/locale/pt-PT/skill.json b/ovos_skill_cmd/locale/pt-PT/skill.json similarity index 100% rename from locale/pt-PT/skill.json rename to ovos_skill_cmd/locale/pt-PT/skill.json diff --git a/version.py b/ovos_skill_cmd/version.py similarity index 50% rename from version.py rename to ovos_skill_cmd/version.py index 861107e..9c270cc 100644 --- a/version.py +++ b/ovos_skill_cmd/version.py @@ -4,3 +4,5 @@ VERSION_BUILD = 14 VERSION_ALPHA = 4 # END_VERSION_BLOCK + +__version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d463b0f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,46 @@ +[build-system] +requires = ["setuptools>=61", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "ovos-skill-cmd" +dynamic = ["version"] +description = "OVOS run command skill" +readme = "README.md" +license = {text = "Apache-2.0"} +authors = [ + {name = "JarbasAi", email = "jarbasai@mailfence.com"} +] +keywords = ["ovos", "skill", "plugin"] +dependencies = [ + "ovos-plugin-manager>=2.1.0,<3.0.0", + "ovos-utils>=0.0.38,<1.0.0", + "ovos-workshop>=0.0.15,<9.0.0" +] + +[project.optional-dependencies] +test = [ + "ovoscope>=0.13.1,<1.0.0", + "pytest>=7.0.0,<9", + "pytest-timeout>=2.0.0", + "ovos-adapt-parser>=1.0.0,<2.0.0" +] + +[project.urls] +Homepage = "https://github.com/OpenVoiceOS/ovos-skill-cmd" + +[project.entry-points."opm.skill"] +"ovos-skill-cmd.openvoiceos" = "ovos_skill_cmd:CmdSkill" + +[tool.setuptools.dynamic] +version = {attr = "ovos_skill_cmd.version.__version__"} + +[tool.setuptools.packages.find] +where = ["."] +include = ["ovos_skill_cmd*"] + +[tool.setuptools.package-data] +ovos_skill_cmd = [ + "*.json", + "locale/**/*", +] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 4739c0e..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -ovos-workshop>=0.0.15,<9.0.0 diff --git a/setup.py b/setup.py deleted file mode 100644 index afecf88..0000000 --- a/setup.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -from setuptools import setup -from os.path import abspath, dirname, join, isfile, isdir -from os import walk, environ - -# Define package information -SKILL_CLAZZ = "CmdSkill" # Make sure it matches __init__.py class name -URL = "https://github.com/OpenVoiceOS/ovos-skill-cmd" -AUTHOR = "forslund" -EMAIL = "" -LICENSE = "Apache2.0" -DESCRIPTION = SKILL_CLAZZ # TODO - -PYPI_NAME = URL.split("/")[-1] # pip install PYPI_NAME - -# Construct entry point for plugin -SKILL_ID = f"{PYPI_NAME.lower()}.{AUTHOR.lower()}" -SKILL_PKG = PYPI_NAME.lower().replace('-', '_') -PLUGIN_ENTRY_POINT = f"{SKILL_ID}={SKILL_PKG}:{SKILL_CLAZZ}" - - -# Function to parse requirements from file -def get_requirements(requirements_filename: str = "requirements.txt"): - requirements_file = join(abspath(dirname(__file__)), requirements_filename) - if isfile(requirements_file): - with open(requirements_file, 'r', encoding='utf-8') as r: - requirements = r.readlines() - requirements = [r.strip() for r in requirements - if r.strip() and not r.strip().startswith("#")] - if 'MYCROFT_LOOSE_REQUIREMENTS' in environ: - print('USING LOOSE REQUIREMENTS!') - requirements = [r.replace('==', '>=').replace('~=', '>=') - for r in requirements] - return requirements - return [] - - -# Function to find resource files -def find_resource_files(): - resource_base_dirs = ["locale"] - base_dir = abspath(dirname(__file__)) - package_data = ["*.json"] - for res in resource_base_dirs: - if isdir(join(base_dir, res)): - for (directory, _, files) in walk(join(base_dir, res)): - if files: - p = join(directory.replace(base_dir, "").lstrip('/'), '*') - package_data.append(p) - return package_data - - -def get_version(): - """ Find the version of this skill""" - version_file = join(dirname(__file__), 'version.py') - major, minor, build, alpha = (None, None, None, None) - with open(version_file) as f: - for line in f: - if 'VERSION_MAJOR' in line: - major = line.split('=')[1].strip() - elif 'VERSION_MINOR' in line: - minor = line.split('=')[1].strip() - elif 'VERSION_BUILD' in line: - build = line.split('=')[1].strip() - elif 'VERSION_ALPHA' in line: - alpha = line.split('=')[1].strip() - - if ((major and minor and build and alpha) or - '# END_VERSION_BLOCK' in line): - break - version = f"{major}.{minor}.{build}" - if int(alpha): - version += f"a{alpha}" - return version - - -# Setup configuration -setup( - name=PYPI_NAME, - version=get_version(), - description=DESCRIPTION, - url=URL, - author=AUTHOR, - author_email=EMAIL, - license=LICENSE, - package_dir={SKILL_PKG: ""}, - package_data={SKILL_PKG: find_resource_files()}, - packages=[SKILL_PKG], - include_package_data=True, - install_requires=get_requirements(), - keywords='ovos skill plugin', - entry_points={'ovos.plugin.skill': PLUGIN_ENTRY_POINT} -) diff --git a/test/end2end/test_intents_en_us.py b/test/end2end/test_intents_en_us.py new file mode 100644 index 0000000..7c68c61 --- /dev/null +++ b/test/end2end/test_intents_en_us.py @@ -0,0 +1,121 @@ +"""End-to-end intent-routing tests for ovos-skill-cmd (en-US). + +These assert *per-utterance* that the Adapt pipeline routes an utterance to the +``RunScriptCommandIntent`` handler and that the skill speaks the configured +alias back. They deliberately use subset assertions over the captured message +stream rather than a strict full-sequence match: the exact ordered sequence +drifts across ovos-core / ovoscope releases (e.g. an extra +``ovos.intent.matched`` message, or ``speak`` vs ``ovos.utterance.speak``), +which is orthogonal to what this skill is responsible for. + +``RunScriptCommandIntent`` requires both the ``Run`` vocabulary (from +``Run.voc``) and a ``Script`` keyword, and the ``Script`` keywords are +registered dynamically from the skill's ``alias`` setting. The suite therefore +seeds a settings file with a couple of aliases under a private XDG config root +*before* the MiniCroft loads the skill, so ``initialize()`` registers the +matching vocabulary. + +Run: + uv run pytest test/end2end/ -v +""" +import json +import os +import tempfile +from unittest import TestCase + +SKILL_ID = "ovos-skill-cmd.openvoiceos" +LANG = "en-US" +RUN_INTENT = f"{SKILL_ID}:RunScriptCommandIntent" +ALIASES = {"backup": "echo backup", "weather": "echo weather"} + + +def _seed_settings() -> None: + """Write a skill settings file with aliases under a private XDG root. + + Must run before the MiniCroft loads the skill so ``initialize()`` picks up + the aliases and registers the ``Script`` vocabulary the intent requires. + """ + root = tempfile.mkdtemp(prefix="ovos-skill-cmd-e2e-") + os.environ["XDG_CONFIG_HOME"] = os.path.join(root, "config") + settings_dir = os.path.join(root, "config", "mycroft", "skills", SKILL_ID) + os.makedirs(settings_dir, exist_ok=True) + with open(os.path.join(settings_dir, "settings.json"), "w") as handle: + json.dump( + {"alias": ALIASES, "__mycroft_skill_firstrun": False}, handle + ) + + +_seed_settings() + +from ovos_bus_client.message import Message # noqa: E402 +from ovos_bus_client.session import Session # noqa: E402 +from ovoscope import get_minicroft, CaptureSession, ADAPT_PIPELINE # noqa: E402 + + +def _session(tag: str) -> Session: + session = Session(f"e2e-en_us-cmd-{tag}") + session.lang = LANG + session.pipeline = ADAPT_PIPELINE + return session + + +def _utterance(utt: str, session: Session) -> Message: + return Message( + "recognizer_loop:utterance", + {"utterances": [utt], "lang": LANG}, + {"session": session.serialize(), "source": "A", "destination": "B"}, + ) + + +class _RunRoutingMixin: + """Shared MiniCroft wiring for the cmd skill.""" + + @classmethod + def setUpClass(cls): + cls.minicroft = get_minicroft([SKILL_ID]) + + @classmethod + def tearDownClass(cls): + if getattr(cls, "minicroft", None): + cls.minicroft.stop() + + def _capture(self, utterance: str): + session = _session(str(hash(utterance))) + capture = CaptureSession(self.minicroft) + capture.capture(_utterance(utterance, session), timeout=30) + return capture.finish() + + def _spoken(self, messages): + return [ + m.data.get("utterance", "") + for m in messages + if m.msg_type in ("speak", "ovos.utterance.speak") + ] + + def assertRoutesToRun(self, utterance: str, alias: str): + messages = self._capture(utterance) + types = [m.msg_type for m in messages] + self.assertIn( + RUN_INTENT, types, + f"expected {RUN_INTENT!r} to be matched for {utterance!r}, " + f"got {types}", + ) + spoken = self._spoken(messages) + self.assertTrue( + any(f"running {alias}" in utt for utt in spoken), + f"expected a spoken response mentioning {alias!r} for " + f"{utterance!r}, got {spoken}", + ) + + +class TestRunScriptCommandIntent(_RunRoutingMixin, TestCase): + """RunScriptCommandIntent routes across the Run.voc phrasings.""" + + def test_run_command_alias(self): + self.assertRoutesToRun("run command backup", "backup") + + def test_execute_script_alias(self): + self.assertRoutesToRun("execute script weather", "weather") + + def test_launch_command_alias(self): + self.assertRoutesToRun("launch command backup", "backup") diff --git a/test/test_plugin.py b/test/unittests/test_plugin.py similarity index 100% rename from test/test_plugin.py rename to test/unittests/test_plugin.py diff --git a/test/test_skill_loading.py b/test/unittests/test_skill_loading.py similarity index 96% rename from test/test_skill_loading.py rename to test/unittests/test_skill_loading.py index 6d5143a..2edb5be 100644 --- a/test/test_skill_loading.py +++ b/test/unittests/test_skill_loading.py @@ -4,6 +4,7 @@ from ovos_plugin_manager.skills import find_skill_plugins from ovos_utils.messagebus import FakeBus from ovos_workshop.skill_launcher import PluginSkillLoader, SkillLoader +import ovos_skill_cmd from ovos_skill_cmd import CmdSkill @@ -11,7 +12,7 @@ class TestSkillLoading(unittest.TestCase): @classmethod def setUpClass(self): self.skill_id = "ovos-skill-cmd.openvoiceos" - self.path = dirname(dirname(__file__)) + self.path = dirname(ovos_skill_cmd.__file__) def test_from_class(self): bus = FakeBus() From 4c5b0bba106d30f2e504f10b8d29886ad7217713 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 10 Aug 2026 21:51:21 +0000 Subject: [PATCH 25/61] Increment Version to 0.3.0a1 --- ovos_skill_cmd/version.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 9c270cc..59ee186 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,8 +1,8 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 -VERSION_MINOR = 2 -VERSION_BUILD = 14 -VERSION_ALPHA = 4 +VERSION_MINOR = 3 +VERSION_BUILD = 0 +VERSION_ALPHA = 1 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 1bd721146ae0405e49333e7464fafc314baa3670 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 10 Aug 2026 21:51:45 +0000 Subject: [PATCH 26/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12d0a1c..720be55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.0a1) (2026-08-10) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a4...0.3.0a1) + +**Merged pull requests:** + +- feat: add ovoscope end2end intent-routing tests [\#57](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/57) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.2.14a4](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.2.14a4) (2026-08-01) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a3...0.2.14a4) From 280631f02709d5953a890a36882d8f38b23756a2 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Thu, 13 Aug 2026 13:31:45 +0100 Subject: [PATCH 27/61] test: add golden-utterance e2e suite for ovos-skill-cmd (#61) Adds test/end2end/golden_utterances.jsonl (vendored from the shared ovoscope corpus plus rows derived from Run.voc/skill.json templates, since the corpus carries only one bare stub row for this skill) and test/end2end/test_golden_utterances.py, following the ovos-skill-volume/ovos-skill-weather golden-utterance standard: every row routes through a MiniCroft and asserts the matched-intent message type, plus 7 cross-skill negative confusables. Existing smoke/e2e tests are kept unchanged. Fix (adversarial review finding): the negative-confusable check filtered on msg_type == "ovos.intent.matched", which this repo's pinned ovos-core/ovos-bus-client version never emits -- `assert not []` always passed regardless of what the skill actually claimed, making all 7 negatives vacuously green. Confirmed by mutation: feeding the check one of this suite's own golden rows as a "negative" still passed before the fix, and correctly fails after it. Fixed to key on the observed ":" msg_type shape directly, matching the positive assertion in the same file. Also converts the needs_manual "run command" golden row from a silently skipped row to a proper pytest.param(..., marks=xfail(strict=True, ...)), so every row in golden_utterances.jsonl runs as a real (if expected-to-fail) assertion. --- test/end2end/golden_utterances.jsonl | 9 ++ test/end2end/test_golden_utterances.py | 153 +++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 test/end2end/golden_utterances.jsonl create mode 100644 test/end2end/test_golden_utterances.py diff --git a/test/end2end/golden_utterances.jsonl b/test/end2end/golden_utterances.jsonl new file mode 100644 index 0000000..80da060 --- /dev/null +++ b/test/end2end/golden_utterances.jsonl @@ -0,0 +1,9 @@ +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "run command backup", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "execute script weather", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "launch command backup", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "run script weather", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "execute command backup", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "launch script weather", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "please run command backup for me", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "can you execute script weather now", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "run command", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} diff --git a/test/end2end/test_golden_utterances.py b/test/end2end/test_golden_utterances.py new file mode 100644 index 0000000..7d7d03f --- /dev/null +++ b/test/end2end/test_golden_utterances.py @@ -0,0 +1,153 @@ +"""Golden-utterance end-to-end coverage for ovos-skill-cmd (en-US). + +The golden corpus (``golden_utterances.jsonl``) is a vendored slice of the +shared ovoscope golden-utterance dataset (skill_id +"ovos-skill-cmd.openvoiceos"), supplemented with rows derived from this +skill's own ``Run.voc``/``skill.json`` templates: the master corpus carries +only one bare stub row ("run command") for this skill, which cannot route on +its own because ``RunScriptCommandIntent`` requires *both* the ``Run`` +vocabulary and a dynamically-registered ``Script`` alias keyword (see +``initialize()`` in ``ovos_skill_cmd/__init__.py``). That stub is kept here +with ``needs_manual: true`` (flagged, not deleted) as a finding for the +master corpus: it needs an alias suffix (e.g. "run command backup") to be a +valid routable row. + +A settings file seeding two aliases ("backup", "weather") is written under a +private XDG config root before the MiniCroft loads the skill, matching +``test_intents_en_us.py``'s existing mechanism. + +Run: + uv run pytest test/end2end/ -v +""" +import json +import os +import tempfile +from pathlib import Path + +import pytest + +SKILL_ID = "ovos-skill-cmd.openvoiceos" +LANG = "en-US" +ALIASES = {"backup": "echo backup", "weather": "echo weather"} + + +def _seed_settings() -> None: + root = tempfile.mkdtemp(prefix="ovos-skill-cmd-golden-") + os.environ["XDG_CONFIG_HOME"] = os.path.join(root, "config") + settings_dir = os.path.join(root, "config", "mycroft", "skills", SKILL_ID) + os.makedirs(settings_dir, exist_ok=True) + with open(os.path.join(settings_dir, "settings.json"), "w") as handle: + json.dump({"alias": ALIASES, "__mycroft_skill_firstrun": False}, handle) + + +_seed_settings() + +from ovos_bus_client.message import Message # noqa: E402 +from ovos_bus_client.session import Session # noqa: E402 +from ovoscope import ADAPT_PIPELINE, CaptureSession, get_minicroft # noqa: E402 + +GOLDEN_PATH = Path(__file__).parent / "golden_utterances.jsonl" + +# Confusables lifted from other skills' domains, picked for lexical overlap +# with "run"/"execute"/"launch"/"command"/"script". +NEGATIVE_UTTERANCES = [ + ("what's the weather", "ovos-skill-weather.openvoiceos"), + ("play some music", "ovos-skill-music.openvoiceos"), + ("launch a timer for 5 minutes", "ovos-skill-alerts.openvoiceos"), + ("run the news for me", "ovos-skill-news.openvoiceos"), + ("execute a wolfram alpha search", "ovos-skill-wolfie.openvoiceos"), + ("tell me a joke", "skill-icanhazdadjokes.openvoiceos"), + ("search the web for cats", "ovos-skill-ddg.openvoiceos"), +] + + +_NEEDS_MANUAL_REASONS = { + "run command": ( + "bare master-corpus stub with no Script alias suffix -- " + "RunScriptCommandIntent requires both the Run vocabulary and a " + "dynamically-registered Script alias keyword (see initialize() in " + "ovos_skill_cmd/__init__.py), so this utterance alone can never " + "route. Kept as a flagged row (not deleted) for master-corpus " + "absorption: needs an alias suffix, e.g. 'run command backup'." + ), +} + + +def _load_golden_rows(): + rows = [] + with open(GOLDEN_PATH, encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + rows.append(json.loads(line)) + return rows + + +def _as_param(row): + if row.get("needs_manual"): + reason = _NEEDS_MANUAL_REASONS.get(row["utterance"]) + assert reason, f"missing _NEEDS_MANUAL_REASONS entry for {row['utterance']!r}" + return pytest.param(row, id=row["utterance"], marks=pytest.mark.xfail(strict=True, reason=reason)) + return pytest.param(row, id=row["utterance"]) + + +GOLDEN_ROWS = [_as_param(r) for r in _load_golden_rows()] + + +@pytest.fixture(scope="module") +def minicroft(): + mc = get_minicroft([SKILL_ID]) + yield mc + mc.stop() + + +def _capture(mc, text, session_id): + session = Session(session_id) + session.lang = LANG + session.pipeline = ADAPT_PIPELINE + utterance = Message( + "recognizer_loop:utterance", + {"utterances": [text], "lang": LANG}, + {"session": session.serialize(), "source": "A", "destination": "B"}, + ) + capture = CaptureSession(mc) + capture.capture(utterance, timeout=30) + return capture.finish() + + +@pytest.mark.timeout(60) +@pytest.mark.parametrize("row", GOLDEN_ROWS, ids=lambda r: r["utterance"]) +def test_golden_utterance(minicroft, row): + # NOTE: on this ovos-core/ovos-bus-client version, the Adapt pipeline + # emits the matched intent directly as msg_type + # ":" (observed via capture below) rather than a + # generic "ovos.intent.matched" wrapper carrying data.intent_name -- the + # latter is not present in this message stream. Assert against the + # observed msg_type, matching the pattern already used by + # ovos-skill-volume/ovos-skill-weather's golden suites. + expected_intent = f"{SKILL_ID}:{row['intent_label']}" + messages = _capture(minicroft, row["utterance"], f"golden-{row['utterance']}") + types = [m.msg_type for m in messages] + assert expected_intent in types, ( + f"{row['utterance']!r}: expected {expected_intent!r} in message types, got {types!r}" + ) + + +@pytest.mark.timeout(60) +@pytest.mark.parametrize("negative", NEGATIVE_UTTERANCES, ids=lambda n: n[0]) +def test_negative_confusable_not_claimed(minicroft, negative): + # NOTE: this repo's ovos-core/ovos-bus-client version never emits a + # generic "ovos.intent.matched" wrapper message (see the identical note + # on test_golden_utterance above) -- filtering on that msg_type here + # made this assertion vacuously true (`assert not []` always passes) + # regardless of what the skill actually claimed. Confirmed by mutation: + # feeding this check one of this suite's own golden rows as a + # "negative" still passed. Fixed to key on the observed + # ":" msg_type shape directly, matching the + # positive assertion above (and ddg/personal's negative checks). + text, source_skill = negative + messages = _capture(minicroft, text, f"negative-{text}") + types = [m.msg_type for m in messages] + claimed = any(t.startswith(f"{SKILL_ID}:") for t in types) + assert not claimed, f"{text!r} (from {source_skill}) was incorrectly claimed by {SKILL_ID}: {types!r}" From 0d7563294bb389c7be2cb33b33b76e2258307c62 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:32:03 +0000 Subject: [PATCH 28/61] Increment Version to 0.3.0a2 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 59ee186..af8c8b5 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -2,7 +2,7 @@ VERSION_MAJOR = 0 VERSION_MINOR = 3 VERSION_BUILD = 0 -VERSION_ALPHA = 1 +VERSION_ALPHA = 2 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 517f5db54a210271065c00bc8fde8df616e55a82 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:32:24 +0000 Subject: [PATCH 29/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 720be55..da0a2f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.0a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.0a2) (2026-08-13) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.0a1...0.3.0a2) + +**Merged pull requests:** + +- test: golden-utterance e2e suite for ovos-skill-cmd [\#61](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/61) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.3.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.0a1) (2026-08-10) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.2.14a4...0.3.0a1) From 9c6e90b51b10527fd1f6118a016872fbb9cfe88c Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:52:58 +0100 Subject: [PATCH 30/61] fix: allow ovos-workshop 9.x (#63) ovos-core now requires ovos-workshop>=9.3.11a1,<10.0.0, so the stale <9.0.0 cap made this skill refuse to install alongside current ovos-core (a normal install downgraded ovos-workshop to 8.x and broke core). This skill was verified loading and serving on ovos-workshop 9.3.13a1 on a live deployment. Co-authored-by: Claude Sonnet 5 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d463b0f..ecb02de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ keywords = ["ovos", "skill", "plugin"] dependencies = [ "ovos-plugin-manager>=2.1.0,<3.0.0", "ovos-utils>=0.0.38,<1.0.0", - "ovos-workshop>=0.0.15,<9.0.0" + "ovos-workshop>=0.0.15,<10.0.0" ] [project.optional-dependencies] From 90817e83448715e59bcffa08a9b5740180a2aa62 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:53:14 +0000 Subject: [PATCH 31/61] Increment Version to 0.3.1a1 --- ovos_skill_cmd/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index af8c8b5..7b63467 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,8 +1,8 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 VERSION_MINOR = 3 -VERSION_BUILD = 0 -VERSION_ALPHA = 2 +VERSION_BUILD = 1 +VERSION_ALPHA = 1 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 3eecd894e772258822f15e2eff649f1f079bbbdd Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:53:38 +0000 Subject: [PATCH 32/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index da0a2f6..2516470 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.1a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.1a1) (2026-08-14) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.0a2...0.3.1a1) + +**Merged pull requests:** + +- fix: allow ovos-workshop 9.x [\#63](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/63) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.3.0a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.0a2) (2026-08-13) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.0a1...0.3.0a2) From 259ffe8d7c40813cc5ef32c70fef28d48dbef940 Mon Sep 17 00:00:00 2001 From: "ovos-localize[bot]" <269068724+ovos-localize[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:06:00 +0100 Subject: [PATCH 33/61] translate(kab-DZ): update Run.voc (#65) Submitted by @athmanemokraoui via OVOS Localize Co-authored-by: ovos-localize[bot] --- ovos_skill_cmd/locale/kab-DZ/Run.voc | 1 + 1 file changed, 1 insertion(+) create mode 100644 ovos_skill_cmd/locale/kab-DZ/Run.voc diff --git a/ovos_skill_cmd/locale/kab-DZ/Run.voc b/ovos_skill_cmd/locale/kab-DZ/Run.voc new file mode 100644 index 0000000..6c01d46 --- /dev/null +++ b/ovos_skill_cmd/locale/kab-DZ/Run.voc @@ -0,0 +1 @@ +(selkem|sekker) (taladna|askript) From 763fab7df650f89a9aff86252e2526a288efc88e Mon Sep 17 00:00:00 2001 From: "ovos-localize[bot]" <269068724+ovos-localize[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:06:14 +0100 Subject: [PATCH 34/61] translate(kab-DZ): update running.dialog (#66) Submitted by @athmanemokraoui via OVOS Localize Co-authored-by: ovos-localize[bot] --- ovos_skill_cmd/locale/kab-DZ/running.dialog | 1 + 1 file changed, 1 insertion(+) create mode 100644 ovos_skill_cmd/locale/kab-DZ/running.dialog diff --git a/ovos_skill_cmd/locale/kab-DZ/running.dialog b/ovos_skill_cmd/locale/kab-DZ/running.dialog new file mode 100644 index 0000000..3db4668 --- /dev/null +++ b/ovos_skill_cmd/locale/kab-DZ/running.dialog @@ -0,0 +1 @@ +aselkem n (taladna|uskript) {alias} From c1dc6fdee72bce05e5b7332bc3d98a5c8946e247 Mon Sep 17 00:00:00 2001 From: "ovos-localize[bot]" <269068724+ovos-localize[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 00:06:17 +0100 Subject: [PATCH 35/61] translate(kab-DZ): update skill.json (#67) Submitted by @athmanemokraoui via OVOS Localize Co-authored-by: ovos-localize[bot] --- ovos_skill_cmd/locale/kab-DZ/skill.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ovos_skill_cmd/locale/kab-DZ/skill.json diff --git a/ovos_skill_cmd/locale/kab-DZ/skill.json b/ovos_skill_cmd/locale/kab-DZ/skill.json new file mode 100644 index 0000000..bc74cc8 --- /dev/null +++ b/ovos_skill_cmd/locale/kab-DZ/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "examples[0]: sekker taladna ___", + "examples[1]: sekker askript ___" + ] +} From f9bcd816fa6efb1f47d224582023e86d87562536 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Tue, 25 Aug 2026 23:06:29 +0000 Subject: [PATCH 36/61] Increment Version to 0.3.1a2 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 7b63467..4a84045 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -2,7 +2,7 @@ VERSION_MAJOR = 0 VERSION_MINOR = 3 VERSION_BUILD = 1 -VERSION_ALPHA = 1 +VERSION_ALPHA = 2 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 85602c302bd6ca9f36c735650c9f2b4cfb9e2a1e Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Tue, 25 Aug 2026 23:06:55 +0000 Subject: [PATCH 37/61] Update Changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2516470..7056c38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [0.3.1a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.1a2) (2026-08-25) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.1a1...0.3.1a2) + +**Merged pull requests:** + +- translate\(kab-DZ\): update skill.json [\#67](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/67) ([ovos-localize[bot]](https://github.com/apps/ovos-localize)) +- translate\(kab-DZ\): update running.dialog [\#66](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/66) ([ovos-localize[bot]](https://github.com/apps/ovos-localize)) +- translate\(kab-DZ\): update Run.voc [\#65](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/65) ([ovos-localize[bot]](https://github.com/apps/ovos-localize)) + ## [0.3.1a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.1a1) (2026-08-14) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.0a2...0.3.1a1) From 3f3e67830774c87a6cf3313609ce16b8277c8df4 Mon Sep 17 00:00:00 2001 From: "ovos-localize[bot]" <269068724+ovos-localize[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2026 02:30:46 +0100 Subject: [PATCH 38/61] fix: rename bare lang code locale directories (#69) Automated rename submitted by @JarbasAl via OVOS Localize. Co-authored-by: ovos-localize[bot] --- ovos_skill_cmd/locale/{kab-DZ => kab}/Run.voc | 0 ovos_skill_cmd/locale/{kab-DZ => kab}/running.dialog | 0 ovos_skill_cmd/locale/{kab-DZ => kab}/skill.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename ovos_skill_cmd/locale/{kab-DZ => kab}/Run.voc (100%) rename ovos_skill_cmd/locale/{kab-DZ => kab}/running.dialog (100%) rename ovos_skill_cmd/locale/{kab-DZ => kab}/skill.json (100%) diff --git a/ovos_skill_cmd/locale/kab-DZ/Run.voc b/ovos_skill_cmd/locale/kab/Run.voc similarity index 100% rename from ovos_skill_cmd/locale/kab-DZ/Run.voc rename to ovos_skill_cmd/locale/kab/Run.voc diff --git a/ovos_skill_cmd/locale/kab-DZ/running.dialog b/ovos_skill_cmd/locale/kab/running.dialog similarity index 100% rename from ovos_skill_cmd/locale/kab-DZ/running.dialog rename to ovos_skill_cmd/locale/kab/running.dialog diff --git a/ovos_skill_cmd/locale/kab-DZ/skill.json b/ovos_skill_cmd/locale/kab/skill.json similarity index 100% rename from ovos_skill_cmd/locale/kab-DZ/skill.json rename to ovos_skill_cmd/locale/kab/skill.json From a8d2151f4fb08b32d81a87dfb1d34bfa4ad89b7d Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 26 Aug 2026 01:30:59 +0000 Subject: [PATCH 39/61] Increment Version to 0.3.2a1 --- ovos_skill_cmd/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 4a84045..8e3412e 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,8 +1,8 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 VERSION_MINOR = 3 -VERSION_BUILD = 1 -VERSION_ALPHA = 2 +VERSION_BUILD = 2 +VERSION_ALPHA = 1 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From f1ac067a348e3fe463148a42373380d17053ed01 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 26 Aug 2026 01:31:21 +0000 Subject: [PATCH 40/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7056c38..756e44e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.2a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.2a1) (2026-08-26) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.1a2...0.3.2a1) + +**Merged pull requests:** + +- fix: rename bare lang code locale directories [\#69](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/69) ([ovos-localize[bot]](https://github.com/apps/ovos-localize)) + ## [0.3.1a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.1a2) (2026-08-25) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.1a1...0.3.1a2) From b42923bc8dfa21e3481ff573a2d03ad656fed7e7 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 2 Sep 2026 02:43:00 +0100 Subject: [PATCH 41/61] refactor: migrate adapt intent to intent file (#71) RunScriptCommandIntent used an Adapt IntentBuilder requiring the 'Run' keyword plus a dynamically-registered 'Script' keyword. Migrated to a Padatious RunScriptCommandIntent.intent per locale (en-US, es-ES, eu-ES, fr-FR, gl-ES, it-IT, pt-PT) with a {script} slot, replacing the dynamic alias registration with self.intent_service.register_entity('script', ...). Run.voc files are kept as-is (unused by the new intent, per migration convention). Two vendored golden-corpus rows with filler words ("please ... for me", "can you ... now") no longer route: a fixed Padatious template has no filler-word tolerance, unlike Adapt's anywhere-in-utterance keyword match. Flagged needs_manual (not deleted), matching the existing convention for the master-corpus "run command" stub row. Fail-before: added test/end2end/test_intent_file_migration.py, forcing the Padatious-only pipeline (PADACIOSO_PIPELINE) for "run script backup". Against unfixed source it failed (ovos.intent.unmatched, RunScriptCommandIntent not in message types). After the fix it passes. Full suite: 22 passed, 3 xfailed (0 pre-existing failures were weakened; two golden rows flagged xfail with a documented reason instead). ca-ES, da-DK, de-DE, and kab locales have Run.voc but no translation was supplied for this migration; they are left untouched (no .intent file, so the intent no longer matches in those locales) pending native review. Co-authored-by: Claude Sonnet 5 --- ovos_skill_cmd/__init__.py | 16 ++-- .../en-US/RunScriptCommandIntent.intent | 1 + .../locale/en-US/unknown.script.dialog | 1 + .../es-ES/RunScriptCommandIntent.intent | 1 + .../locale/es-ES/unknown.script.dialog | 1 + .../eu-ES/RunScriptCommandIntent.intent | 1 + .../locale/eu-ES/unknown.script.dialog | 1 + .../fr-FR/RunScriptCommandIntent.intent | 1 + .../locale/fr-FR/unknown.script.dialog | 1 + .../gl-ES/RunScriptCommandIntent.intent | 1 + .../locale/gl-ES/unknown.script.dialog | 1 + .../it-IT/RunScriptCommandIntent.intent | 1 + .../locale/it-IT/unknown.script.dialog | 1 + .../pt-PT/RunScriptCommandIntent.intent | 1 + .../locale/pt-PT/unknown.script.dialog | 1 + test/end2end/golden_utterances.jsonl | 4 +- test/end2end/test_golden_utterances.py | 38 +++++--- test/end2end/test_intent_file_migration.py | 89 +++++++++++++++++++ test/end2end/test_intents_en_us.py | 41 ++++++--- 19 files changed, 169 insertions(+), 33 deletions(-) create mode 100644 ovos_skill_cmd/locale/en-US/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/en-US/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/es-ES/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/es-ES/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/eu-ES/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/eu-ES/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/fr-FR/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/fr-FR/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/gl-ES/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/gl-ES/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/it-IT/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/it-IT/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/pt-PT/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/pt-PT/unknown.script.dialog create mode 100644 test/end2end/test_intent_file_migration.py diff --git a/ovos_skill_cmd/__init__.py b/ovos_skill_cmd/__init__.py index 8fc52cc..86d0bae 100644 --- a/ovos_skill_cmd/__init__.py +++ b/ovos_skill_cmd/__init__.py @@ -20,7 +20,6 @@ from ovos_utils.log import LOG from ovos_workshop.decorators import intent_handler -from ovos_workshop.intents import IntentBuilder from ovos_workshop.skills import OVOSSkill @@ -46,15 +45,18 @@ def initialize(self): self.gid = pwnam.pw_gid self.alias = self.settings.get('alias') or {} - for alias in self.alias: - LOG.info(f"Adding script keyword: {alias}") + samples = list(self.alias) + if samples: for lang in self.native_langs: - self.register_vocabulary(alias, 'Script', lang=lang) + LOG.info(f"Adding script entities: {samples}") + self.intent_service.register_entity('script', samples, lang) - @intent_handler(IntentBuilder('RunScriptCommandIntent') - .require('Script').require('Run')) + @intent_handler("RunScriptCommandIntent.intent") def run(self, message): - alias = message.data.get('Script') + alias = message.data.get('script') + if alias not in self.alias: + self.speak_dialog("unknown.script", {"name": alias}) + return self.speak_dialog("running", {"alias": alias}) script = self.alias[alias] LOG.info(f"alias: {alias} | command: {script}") diff --git a/ovos_skill_cmd/locale/en-US/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/en-US/RunScriptCommandIntent.intent new file mode 100644 index 0000000..f8d3288 --- /dev/null +++ b/ovos_skill_cmd/locale/en-US/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(run|execute|launch) (command|script) {script} diff --git a/ovos_skill_cmd/locale/en-US/unknown.script.dialog b/ovos_skill_cmd/locale/en-US/unknown.script.dialog new file mode 100644 index 0000000..7eade0c --- /dev/null +++ b/ovos_skill_cmd/locale/en-US/unknown.script.dialog @@ -0,0 +1 @@ +I don't know a script called {name} \ No newline at end of file diff --git a/ovos_skill_cmd/locale/es-ES/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/es-ES/RunScriptCommandIntent.intent new file mode 100644 index 0000000..6528d50 --- /dev/null +++ b/ovos_skill_cmd/locale/es-ES/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(corre[r]|ejecuta[r]|lanza[r]) (el|un|) (comando|script) {script} diff --git a/ovos_skill_cmd/locale/es-ES/unknown.script.dialog b/ovos_skill_cmd/locale/es-ES/unknown.script.dialog new file mode 100644 index 0000000..e7b3a3a --- /dev/null +++ b/ovos_skill_cmd/locale/es-ES/unknown.script.dialog @@ -0,0 +1 @@ +No conozco ningún script llamado {name} \ No newline at end of file diff --git a/ovos_skill_cmd/locale/eu-ES/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/eu-ES/RunScriptCommandIntent.intent new file mode 100644 index 0000000..a2bce8d --- /dev/null +++ b/ovos_skill_cmd/locale/eu-ES/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(jarri martxan|exekutatu|abiarazi) (komandoa|script-a) {script} diff --git a/ovos_skill_cmd/locale/eu-ES/unknown.script.dialog b/ovos_skill_cmd/locale/eu-ES/unknown.script.dialog new file mode 100644 index 0000000..50c3a18 --- /dev/null +++ b/ovos_skill_cmd/locale/eu-ES/unknown.script.dialog @@ -0,0 +1 @@ +Ez dut ezagutzen {name} izeneko script bat \ No newline at end of file diff --git a/ovos_skill_cmd/locale/fr-FR/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/fr-FR/RunScriptCommandIntent.intent new file mode 100644 index 0000000..3d43214 --- /dev/null +++ b/ovos_skill_cmd/locale/fr-FR/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(lance|exécute|démarre) (la|le|) (commande|script) {script} diff --git a/ovos_skill_cmd/locale/fr-FR/unknown.script.dialog b/ovos_skill_cmd/locale/fr-FR/unknown.script.dialog new file mode 100644 index 0000000..ffa253d --- /dev/null +++ b/ovos_skill_cmd/locale/fr-FR/unknown.script.dialog @@ -0,0 +1 @@ +Je ne connais pas de script appelé {name} \ No newline at end of file diff --git a/ovos_skill_cmd/locale/gl-ES/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/gl-ES/RunScriptCommandIntent.intent new file mode 100644 index 0000000..12a342f --- /dev/null +++ b/ovos_skill_cmd/locale/gl-ES/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(executa[r]|arrinca[r]) [o] (comando|script) {script} diff --git a/ovos_skill_cmd/locale/gl-ES/unknown.script.dialog b/ovos_skill_cmd/locale/gl-ES/unknown.script.dialog new file mode 100644 index 0000000..9f20873 --- /dev/null +++ b/ovos_skill_cmd/locale/gl-ES/unknown.script.dialog @@ -0,0 +1 @@ +Non coñezo ningún script chamado {name} \ No newline at end of file diff --git a/ovos_skill_cmd/locale/it-IT/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/it-IT/RunScriptCommandIntent.intent new file mode 100644 index 0000000..bd1dc8f --- /dev/null +++ b/ovos_skill_cmd/locale/it-IT/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(avvia|esegui|lancia|apri) (il|lo|un|uno|) (comando|script|codice) {script} diff --git a/ovos_skill_cmd/locale/it-IT/unknown.script.dialog b/ovos_skill_cmd/locale/it-IT/unknown.script.dialog new file mode 100644 index 0000000..4fc5000 --- /dev/null +++ b/ovos_skill_cmd/locale/it-IT/unknown.script.dialog @@ -0,0 +1 @@ +Non conosco nessuno script chiamato {name} \ No newline at end of file diff --git a/ovos_skill_cmd/locale/pt-PT/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/pt-PT/RunScriptCommandIntent.intent new file mode 100644 index 0000000..5ca38bf --- /dev/null +++ b/ovos_skill_cmd/locale/pt-PT/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(executa[r]|lança[r]|inicia[r]) [o] (comando|script) {script} diff --git a/ovos_skill_cmd/locale/pt-PT/unknown.script.dialog b/ovos_skill_cmd/locale/pt-PT/unknown.script.dialog new file mode 100644 index 0000000..e58a427 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-PT/unknown.script.dialog @@ -0,0 +1 @@ +Não conheço nenhum script chamado {name} \ No newline at end of file diff --git a/test/end2end/golden_utterances.jsonl b/test/end2end/golden_utterances.jsonl index 80da060..033ef60 100644 --- a/test/end2end/golden_utterances.jsonl +++ b/test/end2end/golden_utterances.jsonl @@ -4,6 +4,6 @@ {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "run script weather", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "execute command backup", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "launch script weather", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} -{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "please run command backup for me", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} -{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "can you execute script weather now", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "please run command backup for me", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "can you execute script weather now", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "run command", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} diff --git a/test/end2end/test_golden_utterances.py b/test/end2end/test_golden_utterances.py index 7d7d03f..d9ef1ea 100644 --- a/test/end2end/test_golden_utterances.py +++ b/test/end2end/test_golden_utterances.py @@ -3,10 +3,11 @@ The golden corpus (``golden_utterances.jsonl``) is a vendored slice of the shared ovoscope golden-utterance dataset (skill_id "ovos-skill-cmd.openvoiceos"), supplemented with rows derived from this -skill's own ``Run.voc``/``skill.json`` templates: the master corpus carries -only one bare stub row ("run command") for this skill, which cannot route on -its own because ``RunScriptCommandIntent`` requires *both* the ``Run`` -vocabulary and a dynamically-registered ``Script`` alias keyword (see +skill's own ``RunScriptCommandIntent.intent``/``skill.json`` templates: the +master corpus carries only one bare stub row ("run command") for this +skill, which cannot route on its own because ``RunScriptCommandIntent`` is +trained from ``RunScriptCommandIntent.intent`` and needs the ``{script}`` +slot filled by a dynamically-registered Padatious entity (see ``initialize()`` in ``ovos_skill_cmd/__init__.py``). That stub is kept here with ``needs_manual: true`` (flagged, not deleted) as a finding for the master corpus: it needs an alias suffix (e.g. "run command backup") to be a @@ -44,7 +45,7 @@ def _seed_settings() -> None: from ovos_bus_client.message import Message # noqa: E402 from ovos_bus_client.session import Session # noqa: E402 -from ovoscope import ADAPT_PIPELINE, CaptureSession, get_minicroft # noqa: E402 +from ovoscope import PADACIOSO_PIPELINE, CaptureSession, get_minicroft # noqa: E402 GOLDEN_PATH = Path(__file__).parent / "golden_utterances.jsonl" @@ -63,13 +64,30 @@ def _seed_settings() -> None: _NEEDS_MANUAL_REASONS = { "run command": ( - "bare master-corpus stub with no Script alias suffix -- " - "RunScriptCommandIntent requires both the Run vocabulary and a " - "dynamically-registered Script alias keyword (see initialize() in " + "bare master-corpus stub with no script alias suffix -- " + "RunScriptCommandIntent is trained from RunScriptCommandIntent.intent " + "and needs the {script} slot filled by a dynamically-registered " + "Padatious entity (see initialize() in " "ovos_skill_cmd/__init__.py), so this utterance alone can never " "route. Kept as a flagged row (not deleted) for master-corpus " "absorption: needs an alias suffix, e.g. 'run command backup'." ), + "please run command backup for me": ( + "RunScriptCommandIntent.intent is a fixed Padatious template with no " + "filler-word tolerance; the prior Adapt keyword match ('Run' + " + "'Script' present anywhere in the utterance) routed this regardless " + "of the surrounding 'please ... for me', which the .intent template " + "does not model. Kept as a flagged row (not deleted) for " + "master-corpus absorption." + ), + "can you execute script weather now": ( + "RunScriptCommandIntent.intent is a fixed Padatious template with no " + "filler-word tolerance; the prior Adapt keyword match ('Run' + " + "'Script' present anywhere in the utterance) routed this regardless " + "of the surrounding 'can you ... now', which the .intent template " + "does not model. Kept as a flagged row (not deleted) for " + "master-corpus absorption." + ), } @@ -105,7 +123,7 @@ def minicroft(): def _capture(mc, text, session_id): session = Session(session_id) session.lang = LANG - session.pipeline = ADAPT_PIPELINE + session.pipeline = PADACIOSO_PIPELINE utterance = Message( "recognizer_loop:utterance", {"utterances": [text], "lang": LANG}, @@ -119,7 +137,7 @@ def _capture(mc, text, session_id): @pytest.mark.timeout(60) @pytest.mark.parametrize("row", GOLDEN_ROWS, ids=lambda r: r["utterance"]) def test_golden_utterance(minicroft, row): - # NOTE: on this ovos-core/ovos-bus-client version, the Adapt pipeline + # NOTE: on this ovos-core/ovos-bus-client version, the Padatious pipeline # emits the matched intent directly as msg_type # ":" (observed via capture below) rather than a # generic "ovos.intent.matched" wrapper carrying data.intent_name -- the diff --git a/test/end2end/test_intent_file_migration.py b/test/end2end/test_intent_file_migration.py new file mode 100644 index 0000000..95a0d11 --- /dev/null +++ b/test/end2end/test_intent_file_migration.py @@ -0,0 +1,89 @@ +"""End-to-end proof that ``RunScriptCommandIntent`` is a Padatious ``.intent`` +match, not an Adapt keyword match. + +The session pipeline is pinned to ``PADACIOSO_PIPELINE`` only (Adapt excluded), +so this test can only pass if the intent is trained from +``RunScriptCommandIntent.intent`` and the ``{script}`` slot is populated from +a dynamically registered Padatious entity (the skill's ``alias`` setting). + +Run: + uv run pytest test/end2end/test_intent_file_migration.py -v +""" +import json +import os +import tempfile +from unittest import TestCase + +SKILL_ID = "ovos-skill-cmd.openvoiceos" +LANG = "en-US" +RUN_INTENT = f"{SKILL_ID}:RunScriptCommandIntent" +ALIASES = {"backup": "echo backup"} + + +def _seed_settings() -> None: + root = tempfile.mkdtemp(prefix="ovos-skill-cmd-e2e-intentfile-") + os.environ["XDG_CONFIG_HOME"] = os.path.join(root, "config") + settings_dir = os.path.join(root, "config", "mycroft", "skills", SKILL_ID) + os.makedirs(settings_dir, exist_ok=True) + with open(os.path.join(settings_dir, "settings.json"), "w") as handle: + json.dump( + {"alias": ALIASES, "__mycroft_skill_firstrun": False}, handle + ) + + +_seed_settings() + +from ovos_bus_client.message import Message # noqa: E402 +from ovos_bus_client.session import Session # noqa: E402 +from ovoscope import get_minicroft, CaptureSession, PADACIOSO_PIPELINE # noqa: E402 + + +def _session(tag: str) -> Session: + session = Session(f"e2e-en_us-cmd-intentfile-{tag}") + session.lang = LANG + session.pipeline = PADACIOSO_PIPELINE + return session + + +def _utterance(utt: str, session: Session) -> Message: + return Message( + "recognizer_loop:utterance", + {"utterances": [utt], "lang": LANG}, + {"session": session.serialize(), "source": "A", "destination": "B"}, + ) + + +class TestRunScriptCommandIntentFile(TestCase): + """RunScriptCommandIntent must route via Padatious/.intent alone.""" + + @classmethod + def setUpClass(cls): + cls.minicroft = get_minicroft([SKILL_ID]) + + @classmethod + def tearDownClass(cls): + if getattr(cls, "minicroft", None): + cls.minicroft.stop() + + def test_run_script_backup_padatious_only(self): + session = _session("run-script-backup") + capture = CaptureSession(self.minicroft) + capture.capture( + _utterance("run script backup", session), timeout=30 + ) + messages = capture.finish() + types = [m.msg_type for m in messages] + self.assertIn( + RUN_INTENT, types, + f"expected {RUN_INTENT!r} to be matched via the Adapt-less " + f"(Padatious-only) pipeline for 'run script backup', got {types}", + ) + spoken = [ + m.data.get("utterance", "") + for m in messages + if m.msg_type in ("speak", "ovos.utterance.speak") + ] + self.assertTrue( + any("running backup" in utt for utt in spoken), + f"expected a spoken response mentioning 'backup', got {spoken}", + ) diff --git a/test/end2end/test_intents_en_us.py b/test/end2end/test_intents_en_us.py index 7c68c61..44b87f3 100644 --- a/test/end2end/test_intents_en_us.py +++ b/test/end2end/test_intents_en_us.py @@ -1,19 +1,19 @@ """End-to-end intent-routing tests for ovos-skill-cmd (en-US). -These assert *per-utterance* that the Adapt pipeline routes an utterance to the -``RunScriptCommandIntent`` handler and that the skill speaks the configured -alias back. They deliberately use subset assertions over the captured message -stream rather than a strict full-sequence match: the exact ordered sequence -drifts across ovos-core / ovoscope releases (e.g. an extra +These assert *per-utterance* that the Padatious pipeline routes an utterance +to the ``RunScriptCommandIntent`` handler and that the skill speaks the +configured alias back. They deliberately use subset assertions over the +captured message stream rather than a strict full-sequence match: the exact +ordered sequence drifts across ovos-core / ovoscope releases (e.g. an extra ``ovos.intent.matched`` message, or ``speak`` vs ``ovos.utterance.speak``), which is orthogonal to what this skill is responsible for. -``RunScriptCommandIntent`` requires both the ``Run`` vocabulary (from -``Run.voc``) and a ``Script`` keyword, and the ``Script`` keywords are -registered dynamically from the skill's ``alias`` setting. The suite therefore -seeds a settings file with a couple of aliases under a private XDG config root +``RunScriptCommandIntent`` is trained from ``RunScriptCommandIntent.intent``, +with the ``{script}`` slot filled from a Padatious entity that is registered +dynamically from the skill's ``alias`` setting. The suite therefore seeds a +settings file with a couple of aliases under a private XDG config root *before* the MiniCroft loads the skill, so ``initialize()`` registers the -matching vocabulary. +matching entity. Run: uv run pytest test/end2end/ -v @@ -33,7 +33,7 @@ def _seed_settings() -> None: """Write a skill settings file with aliases under a private XDG root. Must run before the MiniCroft loads the skill so ``initialize()`` picks up - the aliases and registers the ``Script`` vocabulary the intent requires. + the aliases and registers the ``script`` entity the intent requires. """ root = tempfile.mkdtemp(prefix="ovos-skill-cmd-e2e-") os.environ["XDG_CONFIG_HOME"] = os.path.join(root, "config") @@ -49,13 +49,13 @@ def _seed_settings() -> None: from ovos_bus_client.message import Message # noqa: E402 from ovos_bus_client.session import Session # noqa: E402 -from ovoscope import get_minicroft, CaptureSession, ADAPT_PIPELINE # noqa: E402 +from ovoscope import get_minicroft, CaptureSession, PADACIOSO_PIPELINE # noqa: E402 def _session(tag: str) -> Session: session = Session(f"e2e-en_us-cmd-{tag}") session.lang = LANG - session.pipeline = ADAPT_PIPELINE + session.pipeline = PADACIOSO_PIPELINE return session @@ -109,7 +109,7 @@ def assertRoutesToRun(self, utterance: str, alias: str): class TestRunScriptCommandIntent(_RunRoutingMixin, TestCase): - """RunScriptCommandIntent routes across the Run.voc phrasings.""" + """RunScriptCommandIntent routes across the RunScriptCommandIntent.intent phrasings.""" def test_run_command_alias(self): self.assertRoutesToRun("run command backup", "backup") @@ -119,3 +119,16 @@ def test_execute_script_alias(self): def test_launch_command_alias(self): self.assertRoutesToRun("launch command backup", "backup") + + def test_unknown_alias_does_not_run(self): + messages = self._capture("run script that does not exist") + self.assertIn(RUN_INTENT, [m.msg_type for m in messages]) + spoken = self._spoken(messages) + self.assertTrue( + any("don't know a script" in utt for utt in spoken), + f"expected the unknown-script dialog to be spoken, got {spoken}", + ) + self.assertFalse( + any("running" in utt for utt in spoken), + f"did not expect the running dialog to be spoken, got {spoken}", + ) From 459cafa6a1b9e416c438a8298242dffb6d0c1dce Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 2 Sep 2026 01:43:16 +0000 Subject: [PATCH 42/61] Increment Version to 0.3.2a2 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 8e3412e..118d1ec 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -2,7 +2,7 @@ VERSION_MAJOR = 0 VERSION_MINOR = 3 VERSION_BUILD = 2 -VERSION_ALPHA = 1 +VERSION_ALPHA = 2 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From fd5a73c676e11ebfea1a55cc7c22da37e19dfa20 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 2 Sep 2026 01:43:38 +0000 Subject: [PATCH 43/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 756e44e..69359ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.2a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.2a2) (2026-09-02) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.2a1...0.3.2a2) + +**Merged pull requests:** + +- refactor: migrate RunScriptCommandIntent to a .intent file [\#71](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/71) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.3.2a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.2a1) (2026-08-26) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.1a2...0.3.2a1) From 5026216e2a5ffa863a708ba9786555db882539f7 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 2 Sep 2026 18:11:47 +0100 Subject: [PATCH 44/61] feat: add list-aliases intent for configured scripts (#74) Adds a new list_scripts.intent ("list my aliases" / "what scripts do you know" / "which commands can you run") that speaks back the configured alias names, or a no.scripts dialog when none are set. The bare-run gate described alongside this ("run {alias}" without the "script"/"command" keyword, matching only known aliases) was investigated but is not achievable cleanly in this skill's framework: padacioso/padatious only *penalizes* an unregistered entity value's confidence score, it does not reject the match, so a looser "(run|launch|start) {script}" template still captures arbitrary trailing words as the slot value and steals confusable utterances from other skills (verified live against "launch a timer for 5 minutes" and "run the news for me", both misrouted to this skill). Per the issue's fallback instruction, only the list-aliases intent (item 1) is implemented here. Fail-before: reverted the __init__.py change (source only, tests kept) and confirmed all 4 new list_scripts assertions fail (list_scripts intent never matched / no.scripts dialog never spoken); reapplying the fix makes all 4 pass. Full suite: 30 passed, 3 xfailed (unchanged pre-existing xfail count) vs the prior 23 passed, 3 xfailed baseline on dev. Co-authored-by: Claude Sonnet 5 --- ovos_skill_cmd/__init__.py | 9 ++ .../locale/en-US/list_scripts.intent | 3 + ovos_skill_cmd/locale/en-US/no.scripts.dialog | 2 + test/end2end/golden_utterances.jsonl | 3 + .../end2end/test_list_scripts_intent_en_us.py | 99 +++++++++++++++++++ .../test_list_scripts_no_alias_en_us.py | 67 +++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 ovos_skill_cmd/locale/en-US/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/en-US/no.scripts.dialog create mode 100644 test/end2end/test_list_scripts_intent_en_us.py create mode 100644 test/end2end/test_list_scripts_no_alias_en_us.py diff --git a/ovos_skill_cmd/__init__.py b/ovos_skill_cmd/__init__.py index 86d0bae..a292750 100644 --- a/ovos_skill_cmd/__init__.py +++ b/ovos_skill_cmd/__init__.py @@ -17,6 +17,7 @@ import subprocess from pwd import getpwnam +from ovos_utils.dialog import join_list from ovos_utils.log import LOG from ovos_workshop.decorators import intent_handler @@ -51,6 +52,14 @@ def initialize(self): LOG.info(f"Adding script entities: {samples}") self.intent_service.register_entity('script', samples, lang) + @intent_handler("list_scripts.intent") + def handle_list_scripts(self, message): + names = list(self.alias) + if not names: + self.speak_dialog("no.scripts") + return + self.speak(join_list(names, "and")) + @intent_handler("RunScriptCommandIntent.intent") def run(self, message): alias = message.data.get('script') diff --git a/ovos_skill_cmd/locale/en-US/list_scripts.intent b/ovos_skill_cmd/locale/en-US/list_scripts.intent new file mode 100644 index 0000000..953d583 --- /dev/null +++ b/ovos_skill_cmd/locale/en-US/list_scripts.intent @@ -0,0 +1,3 @@ +(list|what are) my (aliases|scripts|commands) +what (scripts|commands) (do you know|are configured) +which (scripts|commands) can you run diff --git a/ovos_skill_cmd/locale/en-US/no.scripts.dialog b/ovos_skill_cmd/locale/en-US/no.scripts.dialog new file mode 100644 index 0000000..f10d7f6 --- /dev/null +++ b/ovos_skill_cmd/locale/en-US/no.scripts.dialog @@ -0,0 +1,2 @@ +I don't have any scripts configured +No commands are set up yet diff --git a/test/end2end/golden_utterances.jsonl b/test/end2end/golden_utterances.jsonl index 033ef60..ced72e3 100644 --- a/test/end2end/golden_utterances.jsonl +++ b/test/end2end/golden_utterances.jsonl @@ -7,3 +7,6 @@ {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "please run command backup for me", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "can you execute script weather now", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} {"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "run command", "intent_method": "run", "intent_label": "RunScriptCommandIntent", "intent_type": "adapt", "expected_messages": ["speak"], "needs_manual": true} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "list my aliases", "intent_method": "handle_list_scripts", "intent_label": "list_scripts", "intent_type": "padatious", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "what commands are configured", "intent_method": "handle_list_scripts", "intent_label": "list_scripts", "intent_type": "padatious", "expected_messages": ["speak"], "needs_manual": false} +{"skill_id": "ovos-skill-cmd.openvoiceos", "utterance": "which scripts can you run", "intent_method": "handle_list_scripts", "intent_label": "list_scripts", "intent_type": "padatious", "expected_messages": ["speak"], "needs_manual": false} diff --git a/test/end2end/test_list_scripts_intent_en_us.py b/test/end2end/test_list_scripts_intent_en_us.py new file mode 100644 index 0000000..fdc6b1c --- /dev/null +++ b/test/end2end/test_list_scripts_intent_en_us.py @@ -0,0 +1,99 @@ +"""End-to-end intent-routing tests for the ``list_scripts`` intent (en-US). + +Asserts that phrasings from ``list_scripts.intent`` route to +``handle_list_scripts`` and that the skill speaks back the configured alias +names when present, or the ``no.scripts`` dialog when the ``alias`` setting +is empty. + +Run: + uv run pytest test/end2end/test_list_scripts_intent_en_us.py -v +""" +import json +import os +import tempfile +from unittest import TestCase + +SKILL_ID = "ovos-skill-cmd.openvoiceos" +LANG = "en-US" +LIST_INTENT = f"{SKILL_ID}:list_scripts" +ALIASES = {"backup": "echo backup", "weather": "echo weather"} + + +def _seed_settings(alias) -> None: + root = tempfile.mkdtemp(prefix="ovos-skill-cmd-e2e-list-") + os.environ["XDG_CONFIG_HOME"] = os.path.join(root, "config") + settings_dir = os.path.join(root, "config", "mycroft", "skills", SKILL_ID) + os.makedirs(settings_dir, exist_ok=True) + with open(os.path.join(settings_dir, "settings.json"), "w") as handle: + json.dump({"alias": alias, "__mycroft_skill_firstrun": False}, handle) + + +from ovos_bus_client.message import Message # noqa: E402 +from ovos_bus_client.session import Session # noqa: E402 +from ovoscope import get_minicroft, CaptureSession, PADACIOSO_PIPELINE # noqa: E402 + + +def _session(tag: str) -> Session: + session = Session(f"e2e-en_us-cmd-list-{tag}") + session.lang = LANG + session.pipeline = PADACIOSO_PIPELINE + return session + + +def _utterance(utt: str, session: Session) -> Message: + return Message( + "recognizer_loop:utterance", + {"utterances": [utt], "lang": LANG}, + {"session": session.serialize(), "source": "A", "destination": "B"}, + ) + + +class TestListScriptsIntent(TestCase): + """list_scripts.intent routes across its phrasings and speaks the aliases.""" + + @classmethod + def setUpClass(cls): + _seed_settings(ALIASES) + cls.minicroft = get_minicroft([SKILL_ID]) + + @classmethod + def tearDownClass(cls): + if getattr(cls, "minicroft", None): + cls.minicroft.stop() + + def _capture(self, utterance: str): + session = _session(str(hash(utterance))) + capture = CaptureSession(self.minicroft) + capture.capture(_utterance(utterance, session), timeout=30) + return capture.finish() + + def _spoken(self, messages): + return [ + m.data.get("utterance", "") + for m in messages + if m.msg_type in ("speak", "ovos.utterance.speak") + ] + + def assertRoutesToList(self, utterance: str): + messages = self._capture(utterance) + types = [m.msg_type for m in messages] + self.assertIn( + LIST_INTENT, types, + f"expected {LIST_INTENT!r} to be matched for {utterance!r}, " + f"got {types}", + ) + spoken = self._spoken(messages) + self.assertTrue( + any("backup" in utt and "weather" in utt for utt in spoken), + f"expected a spoken response mentioning both aliases for " + f"{utterance!r}, got {spoken}", + ) + + def test_list_my_aliases(self): + self.assertRoutesToList("list my aliases") + + def test_what_scripts_do_you_know(self): + self.assertRoutesToList("what scripts do you know") + + def test_which_commands_can_you_run(self): + self.assertRoutesToList("which commands can you run") diff --git a/test/end2end/test_list_scripts_no_alias_en_us.py b/test/end2end/test_list_scripts_no_alias_en_us.py new file mode 100644 index 0000000..7dea486 --- /dev/null +++ b/test/end2end/test_list_scripts_no_alias_en_us.py @@ -0,0 +1,67 @@ +"""End-to-end coverage for ``list_scripts`` when no alias is configured.""" +import json +import os +import tempfile +from unittest import TestCase + +SKILL_ID = "ovos-skill-cmd.openvoiceos" +LANG = "en-US" +LIST_INTENT = f"{SKILL_ID}:list_scripts" + + +def _seed_settings() -> None: + root = tempfile.mkdtemp(prefix="ovos-skill-cmd-e2e-list-empty-") + os.environ["XDG_CONFIG_HOME"] = os.path.join(root, "config") + settings_dir = os.path.join(root, "config", "mycroft", "skills", SKILL_ID) + os.makedirs(settings_dir, exist_ok=True) + with open(os.path.join(settings_dir, "settings.json"), "w") as handle: + json.dump({"alias": {}, "__mycroft_skill_firstrun": False}, handle) + + +from ovos_bus_client.message import Message # noqa: E402 +from ovos_bus_client.session import Session # noqa: E402 +from ovoscope import get_minicroft, CaptureSession, PADACIOSO_PIPELINE # noqa: E402 + + +class TestListScriptsIntentNoAlias(TestCase): + """list_scripts.intent speaks the no.scripts dialog when unconfigured.""" + + @classmethod + def setUpClass(cls): + _seed_settings() + cls.minicroft = get_minicroft([SKILL_ID]) + + @classmethod + def tearDownClass(cls): + if getattr(cls, "minicroft", None): + cls.minicroft.stop() + + def test_no_scripts_configured(self): + session = Session("e2e-en_us-cmd-list-empty") + session.lang = LANG + session.pipeline = PADACIOSO_PIPELINE + capture = CaptureSession(self.minicroft) + capture.capture( + Message( + "recognizer_loop:utterance", + {"utterances": ["list my aliases"], "lang": LANG}, + {"session": session.serialize(), "source": "A", "destination": "B"}, + ), + timeout=30, + ) + messages = capture.finish() + types = [m.msg_type for m in messages] + self.assertIn(LIST_INTENT, types) + spoken = [ + m.data.get("utterance", "") + for m in messages + if m.msg_type in ("speak", "ovos.utterance.speak") + ] + self.assertTrue( + any( + "don't have any scripts configured" in utt + or "No commands are set up yet" in utt + for utt in spoken + ), + f"expected the no.scripts dialog to be spoken, got {spoken}", + ) From 63f00195425c5f95a932d5fc60ea58ca010baedb Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 2 Sep 2026 17:12:21 +0000 Subject: [PATCH 45/61] Increment Version to 0.4.0a1 --- ovos_skill_cmd/version.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 118d1ec..458e064 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,8 +1,8 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 -VERSION_MINOR = 3 -VERSION_BUILD = 2 -VERSION_ALPHA = 2 +VERSION_MINOR = 4 +VERSION_BUILD = 0 +VERSION_ALPHA = 1 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 5589af29be63b2c839ea6a704fd15e3d2f7fc97b Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 2 Sep 2026 17:12:50 +0000 Subject: [PATCH 46/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69359ba..f911243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.4.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.4.0a1) (2026-09-02) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.2a2...0.4.0a1) + +**Merged pull requests:** + +- feat: add list-aliases intent for configured scripts [\#74](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/74) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.3.2a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.3.2a2) (2026-09-02) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.2a1...0.3.2a2) From 7b64b51df38ea59398ee153194d37f8987b08f6c Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 17:29:04 +0100 Subject: [PATCH 47/61] feat: add pt-BR nl-NL sv-SE locales (#77) --- ovos_skill_cmd/locale/nl-NL/Run.voc | 1 + ovos_skill_cmd/locale/nl-NL/RunScriptCommandIntent.intent | 1 + ovos_skill_cmd/locale/nl-NL/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/nl-NL/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/nl-NL/running.dialog | 1 + ovos_skill_cmd/locale/nl-NL/skill.json | 6 ++++++ ovos_skill_cmd/locale/nl-NL/unknown.script.dialog | 1 + ovos_skill_cmd/locale/pt-BR/Run.voc | 1 + ovos_skill_cmd/locale/pt-BR/RunScriptCommandIntent.intent | 1 + ovos_skill_cmd/locale/pt-BR/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/pt-BR/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/pt-BR/running.dialog | 1 + ovos_skill_cmd/locale/pt-BR/skill.json | 6 ++++++ ovos_skill_cmd/locale/pt-BR/unknown.script.dialog | 1 + ovos_skill_cmd/locale/sv-SE/Run.voc | 1 + ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent | 1 + ovos_skill_cmd/locale/sv-SE/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/sv-SE/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/sv-SE/running.dialog | 1 + ovos_skill_cmd/locale/sv-SE/skill.json | 6 ++++++ ovos_skill_cmd/locale/sv-SE/unknown.script.dialog | 1 + 21 files changed, 45 insertions(+) create mode 100644 ovos_skill_cmd/locale/nl-NL/Run.voc create mode 100644 ovos_skill_cmd/locale/nl-NL/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/nl-NL/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/nl-NL/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/nl-NL/running.dialog create mode 100644 ovos_skill_cmd/locale/nl-NL/skill.json create mode 100644 ovos_skill_cmd/locale/nl-NL/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/pt-BR/Run.voc create mode 100644 ovos_skill_cmd/locale/pt-BR/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/pt-BR/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/pt-BR/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/pt-BR/running.dialog create mode 100644 ovos_skill_cmd/locale/pt-BR/skill.json create mode 100644 ovos_skill_cmd/locale/pt-BR/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/sv-SE/Run.voc create mode 100644 ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/sv-SE/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/sv-SE/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/sv-SE/running.dialog create mode 100644 ovos_skill_cmd/locale/sv-SE/skill.json create mode 100644 ovos_skill_cmd/locale/sv-SE/unknown.script.dialog diff --git a/ovos_skill_cmd/locale/nl-NL/Run.voc b/ovos_skill_cmd/locale/nl-NL/Run.voc new file mode 100644 index 0000000..518b233 --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/Run.voc @@ -0,0 +1 @@ +(voer uit|start|lanceer) (commando|script) diff --git a/ovos_skill_cmd/locale/nl-NL/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/nl-NL/RunScriptCommandIntent.intent new file mode 100644 index 0000000..2ac1a09 --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(voer uit|start|lanceer) (commando|script) {script} diff --git a/ovos_skill_cmd/locale/nl-NL/list_scripts.intent b/ovos_skill_cmd/locale/nl-NL/list_scripts.intent new file mode 100644 index 0000000..4b46dce --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/list_scripts.intent @@ -0,0 +1,3 @@ +(toon|wat zijn) mijn (aliassen|scripts|commando's) +welke (scripts|commando's) (ken je|zijn geconfigureerd) +welke (scripts|commando's) kun je uitvoeren diff --git a/ovos_skill_cmd/locale/nl-NL/no.scripts.dialog b/ovos_skill_cmd/locale/nl-NL/no.scripts.dialog new file mode 100644 index 0000000..8516efa --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/no.scripts.dialog @@ -0,0 +1,2 @@ +Ik heb geen scripts geconfigureerd +Er zijn nog geen commando's ingesteld diff --git a/ovos_skill_cmd/locale/nl-NL/running.dialog b/ovos_skill_cmd/locale/nl-NL/running.dialog new file mode 100644 index 0000000..32a30c8 --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/running.dialog @@ -0,0 +1 @@ +(commando|script) {alias} wordt uitgevoerd diff --git a/ovos_skill_cmd/locale/nl-NL/skill.json b/ovos_skill_cmd/locale/nl-NL/skill.json new file mode 100644 index 0000000..6b95b90 --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "start commando ___", + "voer script ___ uit" + ] +} diff --git a/ovos_skill_cmd/locale/nl-NL/unknown.script.dialog b/ovos_skill_cmd/locale/nl-NL/unknown.script.dialog new file mode 100644 index 0000000..dbadfe5 --- /dev/null +++ b/ovos_skill_cmd/locale/nl-NL/unknown.script.dialog @@ -0,0 +1 @@ +Ik ken geen script genaamd {name} diff --git a/ovos_skill_cmd/locale/pt-BR/Run.voc b/ovos_skill_cmd/locale/pt-BR/Run.voc new file mode 100644 index 0000000..170f496 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/Run.voc @@ -0,0 +1 @@ +(execute|executar|lance|lançar|inicie|iniciar) (comando|script) diff --git a/ovos_skill_cmd/locale/pt-BR/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/pt-BR/RunScriptCommandIntent.intent new file mode 100644 index 0000000..69ed413 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(execute|executar|lance|lançar|inicie|iniciar) (comando|script) {script} diff --git a/ovos_skill_cmd/locale/pt-BR/list_scripts.intent b/ovos_skill_cmd/locale/pt-BR/list_scripts.intent new file mode 100644 index 0000000..cdf9ce0 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/list_scripts.intent @@ -0,0 +1,3 @@ +(liste|quais são) meus (apelidos|scripts|comandos) +quais (scripts|comandos) (você conhece|estão configurados) +quais (scripts|comandos) você pode executar diff --git a/ovos_skill_cmd/locale/pt-BR/no.scripts.dialog b/ovos_skill_cmd/locale/pt-BR/no.scripts.dialog new file mode 100644 index 0000000..0153746 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/no.scripts.dialog @@ -0,0 +1,2 @@ +Eu não tenho nenhum script configurado +Nenhum comando está configurado ainda diff --git a/ovos_skill_cmd/locale/pt-BR/running.dialog b/ovos_skill_cmd/locale/pt-BR/running.dialog new file mode 100644 index 0000000..9aa5ec5 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/running.dialog @@ -0,0 +1 @@ +executando (comando|script) {alias} diff --git a/ovos_skill_cmd/locale/pt-BR/skill.json b/ovos_skill_cmd/locale/pt-BR/skill.json new file mode 100644 index 0000000..50a3301 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "executar comando ___", + "rodar script ___" + ] +} diff --git a/ovos_skill_cmd/locale/pt-BR/unknown.script.dialog b/ovos_skill_cmd/locale/pt-BR/unknown.script.dialog new file mode 100644 index 0000000..647ea21 --- /dev/null +++ b/ovos_skill_cmd/locale/pt-BR/unknown.script.dialog @@ -0,0 +1 @@ +Eu não conheço um script chamado {name} diff --git a/ovos_skill_cmd/locale/sv-SE/Run.voc b/ovos_skill_cmd/locale/sv-SE/Run.voc new file mode 100644 index 0000000..0d934d7 --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/Run.voc @@ -0,0 +1 @@ +(kör|starta|lansera) (kommando|skript) diff --git a/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent new file mode 100644 index 0000000..f2c7928 --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(kör|starta|lansera) (kommando|skript) {script} diff --git a/ovos_skill_cmd/locale/sv-SE/list_scripts.intent b/ovos_skill_cmd/locale/sv-SE/list_scripts.intent new file mode 100644 index 0000000..286dc5e --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/list_scripts.intent @@ -0,0 +1,3 @@ +(lista|vilka är) mina (alias|skript|kommandon) +vilka (skript|kommandon) (känner du till|är konfigurerade) +vilka (skript|kommandon) kan du köra diff --git a/ovos_skill_cmd/locale/sv-SE/no.scripts.dialog b/ovos_skill_cmd/locale/sv-SE/no.scripts.dialog new file mode 100644 index 0000000..ca3982a --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/no.scripts.dialog @@ -0,0 +1,2 @@ +Jag har inga skript konfigurerade +Inga kommandon är inställda än diff --git a/ovos_skill_cmd/locale/sv-SE/running.dialog b/ovos_skill_cmd/locale/sv-SE/running.dialog new file mode 100644 index 0000000..ba80564 --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/running.dialog @@ -0,0 +1 @@ +kör (kommando|skript) {alias} diff --git a/ovos_skill_cmd/locale/sv-SE/skill.json b/ovos_skill_cmd/locale/sv-SE/skill.json new file mode 100644 index 0000000..ff9f671 --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "starta kommando ___", + "kör skript ___" + ] +} diff --git a/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog b/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog new file mode 100644 index 0000000..d32c76e --- /dev/null +++ b/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog @@ -0,0 +1 @@ +Jag känner inte till något skript som heter {name} From eccf13cab010bab5300f74def3212613c7e980d9 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 16:29:37 +0000 Subject: [PATCH 48/61] Increment Version to 0.5.0a1 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 458e064..a5b4b67 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,6 +1,6 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 -VERSION_MINOR = 4 +VERSION_MINOR = 5 VERSION_BUILD = 0 VERSION_ALPHA = 1 # END_VERSION_BLOCK From 484ccd2dc00197c81f9cf1cd3cf0eb8b00c65ce8 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 16:30:08 +0000 Subject: [PATCH 49/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f911243..4ab99f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.5.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.5.0a1) (2026-09-07) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.4.0a1...0.5.0a1) + +**Merged pull requests:** + +- feat: pt-BR nl-NL sv-SE locale parity [\#77](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/77) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.4.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.4.0a1) (2026-09-02) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.3.2a2...0.4.0a1) From 37795926b7190c3b20074b9dae0899a621159a43 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 19:03:11 +0100 Subject: [PATCH 50/61] chore: drop unused ovos-adapt-parser dependency (#80) --- .github/workflows/ovoscope.yml | 1 - pyproject.toml | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ovoscope.yml b/.github/workflows/ovoscope.yml index ed33f2f..0f48332 100644 --- a/.github/workflows/ovoscope.yml +++ b/.github/workflows/ovoscope.yml @@ -13,4 +13,3 @@ jobs: python_version: '3.11' install_extras: 'test' test_path: 'test/end2end/' - require_adapt: true diff --git a/pyproject.toml b/pyproject.toml index ecb02de..f49e22d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,8 +22,7 @@ dependencies = [ test = [ "ovoscope>=0.13.1,<1.0.0", "pytest>=7.0.0,<9", - "pytest-timeout>=2.0.0", - "ovos-adapt-parser>=1.0.0,<2.0.0" + "pytest-timeout>=2.0.0" ] [project.urls] From f9adf1ed1fc8560cfcb6b9a71b12bfa57f537dd9 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 18:03:25 +0000 Subject: [PATCH 51/61] Increment Version to 0.5.0a2 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index a5b4b67..eb8ab15 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -2,7 +2,7 @@ VERSION_MAJOR = 0 VERSION_MINOR = 5 VERSION_BUILD = 0 -VERSION_ALPHA = 1 +VERSION_ALPHA = 2 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From a5d500f01c6d2af8d6aad1d57c98a3dfcd29151a Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 18:03:48 +0000 Subject: [PATCH 52/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ab99f2..2fe2f1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.5.0a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.5.0a2) (2026-09-07) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.5.0a1...0.5.0a2) + +**Merged pull requests:** + +- chore: drop unused ovos-adapt-parser dependency [\#80](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/80) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.5.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.5.0a1) (2026-09-07) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.4.0a1...0.5.0a1) From e8d13662f2f1f1c47d4f6ea7735e7e690e46dc18 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 22:58:10 +0100 Subject: [PATCH 53/61] feat: add oc-FR locale (#78) --- ovos_skill_cmd/locale/oc-FR/Run.voc | 1 + ovos_skill_cmd/locale/oc-FR/RunScriptCommandIntent.intent | 1 + ovos_skill_cmd/locale/oc-FR/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/oc-FR/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/oc-FR/running.dialog | 1 + ovos_skill_cmd/locale/oc-FR/skill.json | 6 ++++++ ovos_skill_cmd/locale/oc-FR/unknown.script.dialog | 1 + 7 files changed, 15 insertions(+) create mode 100644 ovos_skill_cmd/locale/oc-FR/Run.voc create mode 100644 ovos_skill_cmd/locale/oc-FR/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/oc-FR/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/oc-FR/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/oc-FR/running.dialog create mode 100644 ovos_skill_cmd/locale/oc-FR/skill.json create mode 100644 ovos_skill_cmd/locale/oc-FR/unknown.script.dialog diff --git a/ovos_skill_cmd/locale/oc-FR/Run.voc b/ovos_skill_cmd/locale/oc-FR/Run.voc new file mode 100644 index 0000000..bad2a2c --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/Run.voc @@ -0,0 +1 @@ +(executa|lança|inicia) (un |una |l'|la |lo )(òrdre|comanda|script) diff --git a/ovos_skill_cmd/locale/oc-FR/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/oc-FR/RunScriptCommandIntent.intent new file mode 100644 index 0000000..1f385b6 --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(executa|lança|inicia) (l'òrdre|l'script|la comanda) {script} diff --git a/ovos_skill_cmd/locale/oc-FR/list_scripts.intent b/ovos_skill_cmd/locale/oc-FR/list_scripts.intent new file mode 100644 index 0000000..ad7dd8b --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/list_scripts.intent @@ -0,0 +1,3 @@ +(lista|quinas son) las miás (alias|scripts|òrdres) +quins (scripts|comandas) (coneisses|son configurats) +quinas òrdres pòdes executar diff --git a/ovos_skill_cmd/locale/oc-FR/no.scripts.dialog b/ovos_skill_cmd/locale/oc-FR/no.scripts.dialog new file mode 100644 index 0000000..a6f06c2 --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/no.scripts.dialog @@ -0,0 +1,2 @@ +Ai pas cap de script configurat +I a pas encara cap d'òrdre configurada diff --git a/ovos_skill_cmd/locale/oc-FR/running.dialog b/ovos_skill_cmd/locale/oc-FR/running.dialog new file mode 100644 index 0000000..0fc8241 --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/running.dialog @@ -0,0 +1 @@ +s'executa l'(òrdre|script) {alias} diff --git a/ovos_skill_cmd/locale/oc-FR/skill.json b/ovos_skill_cmd/locale/oc-FR/skill.json new file mode 100644 index 0000000..f9e9ab0 --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/skill.json @@ -0,0 +1,6 @@ +{ + "examples": [ + "executa l'òrdre ___", + "executa l'script ___" + ] +} diff --git a/ovos_skill_cmd/locale/oc-FR/unknown.script.dialog b/ovos_skill_cmd/locale/oc-FR/unknown.script.dialog new file mode 100644 index 0000000..47d5d57 --- /dev/null +++ b/ovos_skill_cmd/locale/oc-FR/unknown.script.dialog @@ -0,0 +1 @@ +Coneissi pas cap de script nomenat {name} From 97a7bd4458d57c97cebf325e9423b6730d789d82 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 21:58:27 +0000 Subject: [PATCH 54/61] Increment Version to 0.6.0a1 --- ovos_skill_cmd/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index eb8ab15..0205a32 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,8 +1,8 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 -VERSION_MINOR = 5 +VERSION_MINOR = 6 VERSION_BUILD = 0 -VERSION_ALPHA = 2 +VERSION_ALPHA = 1 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 6c01e1736c697a6f602e4b2e5484c303f814c43a Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Mon, 7 Sep 2026 21:58:49 +0000 Subject: [PATCH 55/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fe2f1b..b680601 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.6.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.6.0a1) (2026-09-07) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.5.0a2...0.6.0a1) + +**Merged pull requests:** + +- feat: oc-FR locale parity [\#78](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/78) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.5.0a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.5.0a2) (2026-09-07) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.5.0a1...0.5.0a2) From 2279ecda4ad1b8e484d8ae0d8666c117c8fcb70f Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 9 Sep 2026 07:52:07 +0100 Subject: [PATCH 56/61] feat: list_scripts intent and fallback dialogs in every locale (#83) --- ovos_skill_cmd/locale/ca-ES/RunScriptCommandIntent.intent | 1 + ovos_skill_cmd/locale/ca-ES/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/ca-ES/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/ca-ES/unknown.script.dialog | 1 + ovos_skill_cmd/locale/da-DK/RunScriptCommandIntent.intent | 1 + ovos_skill_cmd/locale/da-DK/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/da-DK/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/da-DK/unknown.script.dialog | 1 + ovos_skill_cmd/locale/de-DE/RunScriptCommandIntent.intent | 2 ++ ovos_skill_cmd/locale/de-DE/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/de-DE/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/de-DE/unknown.script.dialog | 1 + ovos_skill_cmd/locale/es-ES/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/es-ES/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/eu-ES/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/eu-ES/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/eu-ES/running.dialog | 1 + ovos_skill_cmd/locale/fr-FR/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/fr-FR/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/gl-ES/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/gl-ES/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/it-IT/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/it-IT/no.scripts.dialog | 2 ++ ovos_skill_cmd/locale/it-IT/running.dialog | 1 + ovos_skill_cmd/locale/pt-PT/list_scripts.intent | 3 +++ ovos_skill_cmd/locale/pt-PT/no.scripts.dialog | 2 ++ 26 files changed, 54 insertions(+) create mode 100644 ovos_skill_cmd/locale/ca-ES/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/ca-ES/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/ca-ES/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/ca-ES/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/da-DK/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/da-DK/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/da-DK/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/da-DK/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/de-DE/RunScriptCommandIntent.intent create mode 100644 ovos_skill_cmd/locale/de-DE/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/de-DE/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/de-DE/unknown.script.dialog create mode 100644 ovos_skill_cmd/locale/es-ES/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/es-ES/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/eu-ES/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/eu-ES/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/eu-ES/running.dialog create mode 100644 ovos_skill_cmd/locale/fr-FR/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/fr-FR/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/gl-ES/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/gl-ES/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/it-IT/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/it-IT/no.scripts.dialog create mode 100644 ovos_skill_cmd/locale/it-IT/running.dialog create mode 100644 ovos_skill_cmd/locale/pt-PT/list_scripts.intent create mode 100644 ovos_skill_cmd/locale/pt-PT/no.scripts.dialog diff --git a/ovos_skill_cmd/locale/ca-ES/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/ca-ES/RunScriptCommandIntent.intent new file mode 100644 index 0000000..2602ae7 --- /dev/null +++ b/ovos_skill_cmd/locale/ca-ES/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(executa|corre|llança) (el|un|) (script|comandament|ordre) {script} diff --git a/ovos_skill_cmd/locale/ca-ES/list_scripts.intent b/ovos_skill_cmd/locale/ca-ES/list_scripts.intent new file mode 100644 index 0000000..e52c39f --- /dev/null +++ b/ovos_skill_cmd/locale/ca-ES/list_scripts.intent @@ -0,0 +1,3 @@ +(llista|quins són) els meus (àlies|scripts|comandaments|ordres) +quins (scripts|comandaments|ordres) (coneixes|estan configurats) +quins (scripts|comandaments|ordres) pots executar diff --git a/ovos_skill_cmd/locale/ca-ES/no.scripts.dialog b/ovos_skill_cmd/locale/ca-ES/no.scripts.dialog new file mode 100644 index 0000000..b4236b5 --- /dev/null +++ b/ovos_skill_cmd/locale/ca-ES/no.scripts.dialog @@ -0,0 +1,2 @@ +No tinc cap script configurat +Encara no hi ha cap ordre configurada diff --git a/ovos_skill_cmd/locale/ca-ES/unknown.script.dialog b/ovos_skill_cmd/locale/ca-ES/unknown.script.dialog new file mode 100644 index 0000000..006ed50 --- /dev/null +++ b/ovos_skill_cmd/locale/ca-ES/unknown.script.dialog @@ -0,0 +1 @@ +No conec cap script anomenat {name} diff --git a/ovos_skill_cmd/locale/da-DK/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/da-DK/RunScriptCommandIntent.intent new file mode 100644 index 0000000..d01969f --- /dev/null +++ b/ovos_skill_cmd/locale/da-DK/RunScriptCommandIntent.intent @@ -0,0 +1 @@ +(kør|udfør|start) (kommando|kommandoen|script|scriptet) {script} diff --git a/ovos_skill_cmd/locale/da-DK/list_scripts.intent b/ovos_skill_cmd/locale/da-DK/list_scripts.intent new file mode 100644 index 0000000..f454cbd --- /dev/null +++ b/ovos_skill_cmd/locale/da-DK/list_scripts.intent @@ -0,0 +1,3 @@ +(vis|hvad er) mine (aliasser|scripts|kommandoer) +hvilke (scripts|kommandoer) (kender du|er sat op) +hvilke (scripts|kommandoer) kan du køre diff --git a/ovos_skill_cmd/locale/da-DK/no.scripts.dialog b/ovos_skill_cmd/locale/da-DK/no.scripts.dialog new file mode 100644 index 0000000..c008953 --- /dev/null +++ b/ovos_skill_cmd/locale/da-DK/no.scripts.dialog @@ -0,0 +1,2 @@ +Jeg har ingen scripts sat op +Der er ingen kommandoer sat op endnu diff --git a/ovos_skill_cmd/locale/da-DK/unknown.script.dialog b/ovos_skill_cmd/locale/da-DK/unknown.script.dialog new file mode 100644 index 0000000..ab1a443 --- /dev/null +++ b/ovos_skill_cmd/locale/da-DK/unknown.script.dialog @@ -0,0 +1 @@ +Jeg kender ikke et script der hedder {name} diff --git a/ovos_skill_cmd/locale/de-DE/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/de-DE/RunScriptCommandIntent.intent new file mode 100644 index 0000000..86b3f9f --- /dev/null +++ b/ovos_skill_cmd/locale/de-DE/RunScriptCommandIntent.intent @@ -0,0 +1,2 @@ +(führe|starte) (das|den|ein|einen|) (skript|befehl|kommando) {script} aus +(starte|führe) (skript|befehl|kommando) {script} diff --git a/ovos_skill_cmd/locale/de-DE/list_scripts.intent b/ovos_skill_cmd/locale/de-DE/list_scripts.intent new file mode 100644 index 0000000..b4234a9 --- /dev/null +++ b/ovos_skill_cmd/locale/de-DE/list_scripts.intent @@ -0,0 +1,3 @@ +(zeige|liste|was sind) meine (aliasse|skripte|befehle|kommandos) +welche (skripte|befehle|kommandos) (kennst du|sind eingerichtet|sind konfiguriert) +welche (skripte|befehle|kommandos) kannst du ausführen diff --git a/ovos_skill_cmd/locale/de-DE/no.scripts.dialog b/ovos_skill_cmd/locale/de-DE/no.scripts.dialog new file mode 100644 index 0000000..7b2fe97 --- /dev/null +++ b/ovos_skill_cmd/locale/de-DE/no.scripts.dialog @@ -0,0 +1,2 @@ +Ich habe keine Skripte eingerichtet +Es sind noch keine Befehle konfiguriert diff --git a/ovos_skill_cmd/locale/de-DE/unknown.script.dialog b/ovos_skill_cmd/locale/de-DE/unknown.script.dialog new file mode 100644 index 0000000..85d083b --- /dev/null +++ b/ovos_skill_cmd/locale/de-DE/unknown.script.dialog @@ -0,0 +1 @@ +Ich kenne kein Skript namens {name} diff --git a/ovos_skill_cmd/locale/es-ES/list_scripts.intent b/ovos_skill_cmd/locale/es-ES/list_scripts.intent new file mode 100644 index 0000000..686ab02 --- /dev/null +++ b/ovos_skill_cmd/locale/es-ES/list_scripts.intent @@ -0,0 +1,3 @@ +(lista|cuáles son) mis (alias|scripts|comandos) +qué (scripts|comandos) (conoces|están configurados) +qué (scripts|comandos) puedes ejecutar diff --git a/ovos_skill_cmd/locale/es-ES/no.scripts.dialog b/ovos_skill_cmd/locale/es-ES/no.scripts.dialog new file mode 100644 index 0000000..2df8c19 --- /dev/null +++ b/ovos_skill_cmd/locale/es-ES/no.scripts.dialog @@ -0,0 +1,2 @@ +No tengo ningún script configurado +Todavía no hay comandos configurados diff --git a/ovos_skill_cmd/locale/eu-ES/list_scripts.intent b/ovos_skill_cmd/locale/eu-ES/list_scripts.intent new file mode 100644 index 0000000..46e63b1 --- /dev/null +++ b/ovos_skill_cmd/locale/eu-ES/list_scripts.intent @@ -0,0 +1,3 @@ +(zerrendatu|zein dira) nire (aliasak|scriptak|komandoak) +zein (script|komando) (ezagutzen dituzu|daude konfiguratuta) +zein (script|komando) exekuta ditzakezu diff --git a/ovos_skill_cmd/locale/eu-ES/no.scripts.dialog b/ovos_skill_cmd/locale/eu-ES/no.scripts.dialog new file mode 100644 index 0000000..32fba7f --- /dev/null +++ b/ovos_skill_cmd/locale/eu-ES/no.scripts.dialog @@ -0,0 +1,2 @@ +Ez daukat scriptik konfiguratuta +Oraindik ez dago komandorik konfiguratuta diff --git a/ovos_skill_cmd/locale/eu-ES/running.dialog b/ovos_skill_cmd/locale/eu-ES/running.dialog new file mode 100644 index 0000000..149655f --- /dev/null +++ b/ovos_skill_cmd/locale/eu-ES/running.dialog @@ -0,0 +1 @@ +{alias} (komandoa|scripta) exekutatzen diff --git a/ovos_skill_cmd/locale/fr-FR/list_scripts.intent b/ovos_skill_cmd/locale/fr-FR/list_scripts.intent new file mode 100644 index 0000000..d4bfdb4 --- /dev/null +++ b/ovos_skill_cmd/locale/fr-FR/list_scripts.intent @@ -0,0 +1,3 @@ +(liste|quels sont) mes (alias|scripts|commandes) +quels (scripts|commandes) (connais-tu|sont configurés) +quels (scripts|commandes) peux-tu (lancer|exécuter) diff --git a/ovos_skill_cmd/locale/fr-FR/no.scripts.dialog b/ovos_skill_cmd/locale/fr-FR/no.scripts.dialog new file mode 100644 index 0000000..67cd803 --- /dev/null +++ b/ovos_skill_cmd/locale/fr-FR/no.scripts.dialog @@ -0,0 +1,2 @@ +Je n'ai aucun script configuré +Aucune commande n'est encore configurée diff --git a/ovos_skill_cmd/locale/gl-ES/list_scripts.intent b/ovos_skill_cmd/locale/gl-ES/list_scripts.intent new file mode 100644 index 0000000..b37766f --- /dev/null +++ b/ovos_skill_cmd/locale/gl-ES/list_scripts.intent @@ -0,0 +1,3 @@ +(lista|cales son) os meus (alias|scripts|comandos) +que (scripts|comandos) (coñeces|están configurados) +que (scripts|comandos) podes executar diff --git a/ovos_skill_cmd/locale/gl-ES/no.scripts.dialog b/ovos_skill_cmd/locale/gl-ES/no.scripts.dialog new file mode 100644 index 0000000..6667138 --- /dev/null +++ b/ovos_skill_cmd/locale/gl-ES/no.scripts.dialog @@ -0,0 +1,2 @@ +Non teño ningún script configurado +Aínda non hai comandos configurados diff --git a/ovos_skill_cmd/locale/it-IT/list_scripts.intent b/ovos_skill_cmd/locale/it-IT/list_scripts.intent new file mode 100644 index 0000000..60a068c --- /dev/null +++ b/ovos_skill_cmd/locale/it-IT/list_scripts.intent @@ -0,0 +1,3 @@ +(elenca|quali sono) i miei (alias|script|comandi) +quali (script|comandi) (conosci|sono configurati) +quali (script|comandi) puoi eseguire diff --git a/ovos_skill_cmd/locale/it-IT/no.scripts.dialog b/ovos_skill_cmd/locale/it-IT/no.scripts.dialog new file mode 100644 index 0000000..d5c0886 --- /dev/null +++ b/ovos_skill_cmd/locale/it-IT/no.scripts.dialog @@ -0,0 +1,2 @@ +Non ho nessuno script configurato +Nessun comando è ancora configurato diff --git a/ovos_skill_cmd/locale/it-IT/running.dialog b/ovos_skill_cmd/locale/it-IT/running.dialog new file mode 100644 index 0000000..3e71303 --- /dev/null +++ b/ovos_skill_cmd/locale/it-IT/running.dialog @@ -0,0 +1 @@ +eseguo (il comando|lo script) {alias} diff --git a/ovos_skill_cmd/locale/pt-PT/list_scripts.intent b/ovos_skill_cmd/locale/pt-PT/list_scripts.intent new file mode 100644 index 0000000..feec5ca --- /dev/null +++ b/ovos_skill_cmd/locale/pt-PT/list_scripts.intent @@ -0,0 +1,3 @@ +(lista|quais são) os meus (atalhos|scripts|comandos) +que (scripts|comandos) (conheces|estão configurados) +que (scripts|comandos) consegues executar diff --git a/ovos_skill_cmd/locale/pt-PT/no.scripts.dialog b/ovos_skill_cmd/locale/pt-PT/no.scripts.dialog new file mode 100644 index 0000000..17d58df --- /dev/null +++ b/ovos_skill_cmd/locale/pt-PT/no.scripts.dialog @@ -0,0 +1,2 @@ +Não tenho nenhum script configurado +Ainda não há comandos configurados From 477addab5e830a4dffc33049bcb51293724abc71 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:52:24 +0000 Subject: [PATCH 57/61] Increment Version to 0.7.0a1 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index 0205a32..c5e9ef6 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -1,6 +1,6 @@ # START_VERSION_BLOCK VERSION_MAJOR = 0 -VERSION_MINOR = 6 +VERSION_MINOR = 7 VERSION_BUILD = 0 VERSION_ALPHA = 1 # END_VERSION_BLOCK From b857cc38517172d9fe4a926a2d8399b4a571b0ea Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:52:43 +0000 Subject: [PATCH 58/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b680601..ef81a10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.7.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.7.0a1) (2026-09-09) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.6.0a1...0.7.0a1) + +**Merged pull requests:** + +- feat: list\_scripts intent and fallback dialogs in every locale [\#83](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/83) ([JarbasAl](https://github.com/JarbasAl)) + ## [0.6.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.6.0a1) (2026-09-07) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.5.0a2...0.6.0a1) From c5fb9d2699147fee41c61c1cb4a7deccf078b895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85ke?= Date: Wed, 9 Sep 2026 16:51:05 +0200 Subject: [PATCH 59/61] Locale sv-SE: Look over and improve language (#84) --- ovos_skill_cmd/locale/sv-SE/Run.voc | 2 +- ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent | 2 +- ovos_skill_cmd/locale/sv-SE/list_scripts.intent | 2 +- ovos_skill_cmd/locale/sv-SE/running.dialog | 2 +- ovos_skill_cmd/locale/sv-SE/skill.json | 4 ++-- ovos_skill_cmd/locale/sv-SE/unknown.script.dialog | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ovos_skill_cmd/locale/sv-SE/Run.voc b/ovos_skill_cmd/locale/sv-SE/Run.voc index 0d934d7..9417a5d 100644 --- a/ovos_skill_cmd/locale/sv-SE/Run.voc +++ b/ovos_skill_cmd/locale/sv-SE/Run.voc @@ -1 +1 @@ -(kör|starta|lansera) (kommando|skript) +(kör|starta) (kommando|skript) diff --git a/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent b/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent index f2c7928..59404ce 100644 --- a/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent +++ b/ovos_skill_cmd/locale/sv-SE/RunScriptCommandIntent.intent @@ -1 +1 @@ -(kör|starta|lansera) (kommando|skript) {script} +(kör|starta) (kommandot|skriptet) {script} diff --git a/ovos_skill_cmd/locale/sv-SE/list_scripts.intent b/ovos_skill_cmd/locale/sv-SE/list_scripts.intent index 286dc5e..f9d29a5 100644 --- a/ovos_skill_cmd/locale/sv-SE/list_scripts.intent +++ b/ovos_skill_cmd/locale/sv-SE/list_scripts.intent @@ -1,3 +1,3 @@ (lista|vilka är) mina (alias|skript|kommandon) -vilka (skript|kommandon) (känner du till|är konfigurerade) +vilka (skript|kommandon) (känner du till|är konfigurerade|finns) vilka (skript|kommandon) kan du köra diff --git a/ovos_skill_cmd/locale/sv-SE/running.dialog b/ovos_skill_cmd/locale/sv-SE/running.dialog index ba80564..1de83c4 100644 --- a/ovos_skill_cmd/locale/sv-SE/running.dialog +++ b/ovos_skill_cmd/locale/sv-SE/running.dialog @@ -1 +1 @@ -kör (kommando|skript) {alias} +kör (kommandot|skriptet) {alias} diff --git a/ovos_skill_cmd/locale/sv-SE/skill.json b/ovos_skill_cmd/locale/sv-SE/skill.json index ff9f671..83f0b1a 100644 --- a/ovos_skill_cmd/locale/sv-SE/skill.json +++ b/ovos_skill_cmd/locale/sv-SE/skill.json @@ -1,6 +1,6 @@ { "examples": [ - "starta kommando ___", - "kör skript ___" + "starta kommandot ___", + "kör skriptet ___" ] } diff --git a/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog b/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog index d32c76e..e5b1baa 100644 --- a/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog +++ b/ovos_skill_cmd/locale/sv-SE/unknown.script.dialog @@ -1 +1 @@ -Jag känner inte till något skript som heter {name} +Jag känner inte till något skript med namnet {name} From 520bb95720a267bbb0326822d5bee73b18c62182 Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:51:22 +0000 Subject: [PATCH 60/61] Increment Version to 0.7.0a2 --- ovos_skill_cmd/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ovos_skill_cmd/version.py b/ovos_skill_cmd/version.py index c5e9ef6..e002bf6 100644 --- a/ovos_skill_cmd/version.py +++ b/ovos_skill_cmd/version.py @@ -2,7 +2,7 @@ VERSION_MAJOR = 0 VERSION_MINOR = 7 VERSION_BUILD = 0 -VERSION_ALPHA = 1 +VERSION_ALPHA = 2 # END_VERSION_BLOCK __version__ = f"{VERSION_MAJOR}.{VERSION_MINOR}.{VERSION_BUILD}" + (f"a{VERSION_ALPHA}" if VERSION_ALPHA else "") From 4571e077a8e0c4c8c7ad1e8fb7f0185bfe06c21c Mon Sep 17 00:00:00 2001 From: JarbasAl <33701864+JarbasAl@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:51:46 +0000 Subject: [PATCH 61/61] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef81a10..0ef2823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.7.0a2](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.7.0a2) (2026-09-09) + +[Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.7.0a1...0.7.0a2) + +**Merged pull requests:** + +- Locale sv-SE: Look over and improve language [\#84](https://github.com/OpenVoiceOS/ovos-skill-cmd/pull/84) ([forslund](https://github.com/forslund)) + ## [0.7.0a1](https://github.com/OpenVoiceOS/ovos-skill-cmd/tree/0.7.0a1) (2026-09-09) [Full Changelog](https://github.com/OpenVoiceOS/ovos-skill-cmd/compare/0.6.0a1...0.7.0a1)