ucu-mcp 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,36 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.4] - 2026-06-06
9
+
10
+ ### Re-publish of 0.3.3
11
+
12
+ 0.3.3 was published with a syntax error in the source test file
13
+ (`tests/unit/tools-layer.test.ts:355` was a continuation of a `//`
14
+ comment block that lost its `//` prefix on a hard line break, so
15
+ tsc parsed the second line as a bare identifier). The published
16
+ npm tarball was functionally correct (`dist/` was unaffected), but
17
+ the broken test file would fail to compile for any consumer
18
+ running `npm test` against the source. The fix (a single-character
19
+ comment prefix) was applied, but npm disallows re-publishing the
20
+ same version, so the fixed source ships as 0.3.4 with the same
21
+ contents and CHANGELOG entry as 0.3.3 plus this note.
22
+
23
+ ### Yanked
24
+
25
+ `ucu-mcp@0.3.3` was unpublished (yanked) shortly after release due to
26
+ the test file compile error. Users on `@latest` are now on 0.3.4.
27
+
28
+ ## [0.3.3] - 2026-06-06
29
+
30
+ ### Tests
31
+
32
+ - `tools-layer`: three new test cases cover `wait_for_element` value+textMode combinations (contains, exact, regex). They confirm the response surfaces the matched value unchanged so the model can branch on it. (Completes Singer Item 4)
33
+
34
+ ### Refactor
35
+
36
+ - JXA `textMatches` and `valueMatches` consolidated through a shared `matchesValue(filter, value, mode)` helper. No behavior change; the three branches (contains / exact / regex) now live in one place. (Completes Singer Item 8)
37
+
8
38
  ## [0.3.2] - 2026-06-06
9
39
 
10
40
  ### Bug fixes
@@ -863,45 +863,37 @@ export class MacOSPlatform {
863
863
  }
864
864
  }
865
865
 
866
- function textMatches(elemName, elemValue, elemDesc) {
867
- if (textFilter === null) return true;
868
- var sources = [elemName, elemValue, elemDesc];
869
- if (textMode === "exact") {
870
- var t = textFilter.toLowerCase();
871
- for (var i = 0; i < sources.length; i++) {
872
- if (sources[i].toLowerCase() === t) return true;
873
- }
874
- return false;
875
- } else if (textMode === "regex") {
866
+ // Shared filter helper. textMatches and valueMatches used to be near
867
+ // copies of the same three-branch dispatch (contains / exact / regex);
868
+ // this consolidates the logic so the two callers only differ in which
869
+ // sources they iterate. Declared before textMatches/valueMatches
870
+ // because JXA function declarations are order-sensitive within a
871
+ // script. (Singer Nit)
872
+ function matchesValue(filter, value, mode) {
873
+ if (filter === null) return true;
874
+ if (mode === "exact") {
875
+ return value.toLowerCase() === filter.toLowerCase();
876
+ } else if (mode === "regex") {
876
877
  try {
877
- var re = new RegExp(textFilter, "i");
878
- for (var i = 0; i < sources.length; i++) {
879
- if (re.test(sources[i])) return true;
880
- }
881
- } catch(e) {}
882
- return false;
878
+ return new RegExp(filter, "i").test(value);
879
+ } catch(e) { return false; }
883
880
  } else {
884
881
  // contains (default)
885
- var t = textFilter.toLowerCase();
886
- for (var i = 0; i < sources.length; i++) {
887
- if (sources[i].toLowerCase().indexOf(t) !== -1) return true;
888
- }
889
- return false;
882
+ return value.toLowerCase().indexOf(filter.toLowerCase()) !== -1;
890
883
  }
891
884
  }
892
885
 
893
- function valueMatches(elemValue) {
894
- if (valueFilter === null) return true;
895
- if (textMode === "exact") {
896
- return elemValue.toLowerCase() === valueFilter.toLowerCase();
897
- } else if (textMode === "regex") {
898
- try {
899
- return new RegExp(valueFilter, "i").test(elemValue);
900
- } catch(e) { return false; }
901
- } else {
902
- // contains (default)
903
- return elemValue.toLowerCase().indexOf(valueFilter.toLowerCase()) !== -1;
886
+ function textMatches(elemName, elemValue, elemDesc) {
887
+ if (textFilter === null) return true;
888
+ var sources = [elemName, elemValue, elemDesc];
889
+ for (var i = 0; i < sources.length; i++) {
890
+ if (matchesValue(textFilter, sources[i], textMode)) return true;
904
891
  }
892
+ return false;
893
+ }
894
+
895
+ function valueMatches(elemValue) {
896
+ return matchesValue(valueFilter, elemValue, textMode);
905
897
  }
906
898
 
907
899
  function matches(elem) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ucu-mcp",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "MCP server for Universal Computer Use — desktop automation for AI agents via Model Context Protocol",
5
5
  "type": "module",
6
6
  "bin": {