From 9345f208a94d016a6527d8cc8ef0c1694e4e41a8 Mon Sep 17 00:00:00 2001 From: Gabriel-Darbord Date: Fri, 17 Jul 2026 23:10:51 +0200 Subject: [PATCH 1/4] Make PCRE2 an optional runtime enhancement --- src/BaselineOfMCP/BaselineOfMCP.class.st | 8 ++----- .../MCPToolMethodSearchTest.class.st | 22 +++++++++---------- ...MCPToolSearchWithoutPCRE2TestStub.class.st | 22 +++++++++++++++++++ src/MCP/MCPToolSearch.class.st | 12 ++++++---- 4 files changed, 42 insertions(+), 22 deletions(-) create mode 100644 src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st diff --git a/src/BaselineOfMCP/BaselineOfMCP.class.st b/src/BaselineOfMCP/BaselineOfMCP.class.st index 522f89f..e7bb5f8 100644 --- a/src/BaselineOfMCP/BaselineOfMCP.class.st +++ b/src/BaselineOfMCP/BaselineOfMCP.class.st @@ -29,11 +29,7 @@ BaselineOfMCP >> defineDependencies: spec [ baseline: 'TinyLogger' with: [ spec repository: 'github://jecisc/TinyLogger:v1.x.x/src'; - loads: #( 'Core' ) ]; - baseline: 'PCRE2' with: [ - spec - repository: 'github://Gabriel-Darbord/pharo-pcre2:main/src'; - loads: #( 'core' ) ] + loads: #( 'Core' ) ] ] { #category : 'baselines' } @@ -51,7 +47,7 @@ BaselineOfMCP >> defineGroups: spec [ BaselineOfMCP >> definePackages: spec [ "common" - spec package: 'MCP' with: [ spec requires: #( 'PharoCompatibility' 'JRPC' 'TinyLogger' 'PCRE2' ) ]. + spec package: 'MCP' with: [ spec requires: #( 'PharoCompatibility' 'JRPC' 'TinyLogger' ) ]. spec package: 'MCP-UI' with: [ spec requires: #( 'MCP' ) ]. spec package: 'MCP-Tests-Resources' with: [ spec requires: #( 'MCP' ) ]. spec package: 'MCP-Tests' with: [ spec requires: #( 'MCP' 'MCP-Tests-Resources' ) ]. diff --git a/src/MCP-Tests/MCPToolMethodSearchTest.class.st b/src/MCP-Tests/MCPToolMethodSearchTest.class.st index 5bd2829..9f295ce 100644 --- a/src/MCP-Tests/MCPToolMethodSearchTest.class.st +++ b/src/MCP-Tests/MCPToolMethodSearchTest.class.st @@ -32,18 +32,6 @@ MCPToolMethodSearchTest >> targetClassName [ ^ 'MCPToolMethodSearchTestTarget' ] -{ #category : 'tests' } -MCPToolMethodSearchTest >> testBasicRegexMatcherRemainsAvailableAsFallback [ - - | matcher tool | - tool := MCPToolSearchMethodMetadata new. - matcher := tool - basicRegexMatcherForPattern: 'MCP.*Test' - caseSensitive: true. - self assert: (matcher value: 'MCPToolMethodSearchTest'). - self deny: (matcher value: 'mcpToolMethodSearchTest') -] - { #category : 'tests' } MCPToolMethodSearchTest >> testCanFilterAcrossExplicitProtocolTarget [ @@ -704,6 +692,16 @@ MCPToolMethodSearchTest >> testParentClassNamesReturnParentMethods [ in: (data at: #methods) ] +{ #category : 'tests' } +MCPToolMethodSearchTest >> testRegexMatcherUsesBasicRegexWhenPCRE2Unavailable [ + + | matcher tool | + tool := MCPToolSearchWithoutPCRE2TestStub new. + matcher := tool regexMatcherForPattern: 'MCP.*Test' caseSensitive: true. + self assert: (matcher value: 'MCPToolMethodSearchTest'). + self deny: (matcher value: 'mcpToolMethodSearchTest') +] + { #category : 'tests' } MCPToolMethodSearchTest >> testRegexMatcherUsesPCRE2WhenLibraryAvailable [ diff --git a/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st b/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st new file mode 100644 index 0000000..9784d43 --- /dev/null +++ b/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st @@ -0,0 +1,22 @@ +" +Test tool that models an image where the optional PCRE2 package or native library is unavailable. +" +Class { + #name : 'MCPToolSearchWithoutPCRE2TestStub', + #superclass : 'MCPToolSearchMethodMetadata', + #category : 'MCP-Tests-Support', + #package : 'MCP-Tests', + #tag : 'Support' +} + +{ #category : 'testing' } +MCPToolSearchWithoutPCRE2TestStub class >> isAbstract [ + + ^ true +] + +{ #category : 'testing' } +MCPToolSearchWithoutPCRE2TestStub >> pcre2RegexLibraryAvailable [ + + ^ false +] diff --git a/src/MCP/MCPToolSearch.class.st b/src/MCP/MCPToolSearch.class.st index ce0680e..7b0107f 100644 --- a/src/MCP/MCPToolSearch.class.st +++ b/src/MCP/MCPToolSearch.class.st @@ -296,8 +296,9 @@ MCPToolSearch >> includeSourceSchemaPropertyWithDescription: includeSourceDescri { #category : 'private - results' } MCPToolSearch >> isRegexSyntaxError: anError [ - ^ anError class = RegexSyntaxError or: [ - anError class = PCRE2CompileError ] + | pcre2CompileErrorClass | + pcre2CompileErrorClass := Smalltalk at: #PCRE2CompileError ifAbsent: [ nil ]. + ^ anError class = RegexSyntaxError or: [ anError class = pcre2CompileErrorClass ] ] { #category : 'private - template' } @@ -435,10 +436,13 @@ MCPToolSearch >> parsedRequestFromToolRequest: request [ { #category : 'private - filtering' } MCPToolSearch >> pcre2RegexLibraryAvailable [ - "PCRE2 is an optional native runtime dependency: the Smalltalk package can be loaded while the host library is missing." + "PCRE2 is optional. Use it only when its Smalltalk package and native runtime library are already available." + | libraryClass pcre2Class | + libraryClass := Smalltalk at: #LibPCRE2UTF8 ifAbsent: [ ^ false ]. + pcre2Class := Smalltalk at: #PCRE2 ifAbsent: [ ^ false ]. ^ [ - LibPCRE2UTF8 config: PCRE2 configVersion. + libraryClass config: pcre2Class configVersion. true ] on: Error do: [ false ] From ab591de71088062b3c5bd4440edc66aa7bcbd12c Mon Sep 17 00:00:00 2001 From: Gabriel-Darbord Date: Fri, 17 Jul 2026 23:35:04 +0200 Subject: [PATCH 2/4] Keep PCRE2 as a loaded dependency --- src/BaselineOfMCP/BaselineOfMCP.class.st | 8 ++++++-- src/MCP/MCPToolSearch.class.st | 11 +++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/BaselineOfMCP/BaselineOfMCP.class.st b/src/BaselineOfMCP/BaselineOfMCP.class.st index e7bb5f8..522f89f 100644 --- a/src/BaselineOfMCP/BaselineOfMCP.class.st +++ b/src/BaselineOfMCP/BaselineOfMCP.class.st @@ -29,7 +29,11 @@ BaselineOfMCP >> defineDependencies: spec [ baseline: 'TinyLogger' with: [ spec repository: 'github://jecisc/TinyLogger:v1.x.x/src'; - loads: #( 'Core' ) ] + loads: #( 'Core' ) ]; + baseline: 'PCRE2' with: [ + spec + repository: 'github://Gabriel-Darbord/pharo-pcre2:main/src'; + loads: #( 'core' ) ] ] { #category : 'baselines' } @@ -47,7 +51,7 @@ BaselineOfMCP >> defineGroups: spec [ BaselineOfMCP >> definePackages: spec [ "common" - spec package: 'MCP' with: [ spec requires: #( 'PharoCompatibility' 'JRPC' 'TinyLogger' ) ]. + spec package: 'MCP' with: [ spec requires: #( 'PharoCompatibility' 'JRPC' 'TinyLogger' 'PCRE2' ) ]. spec package: 'MCP-UI' with: [ spec requires: #( 'MCP' ) ]. spec package: 'MCP-Tests-Resources' with: [ spec requires: #( 'MCP' ) ]. spec package: 'MCP-Tests' with: [ spec requires: #( 'MCP' 'MCP-Tests-Resources' ) ]. diff --git a/src/MCP/MCPToolSearch.class.st b/src/MCP/MCPToolSearch.class.st index 7b0107f..421d97f 100644 --- a/src/MCP/MCPToolSearch.class.st +++ b/src/MCP/MCPToolSearch.class.st @@ -296,9 +296,7 @@ MCPToolSearch >> includeSourceSchemaPropertyWithDescription: includeSourceDescri { #category : 'private - results' } MCPToolSearch >> isRegexSyntaxError: anError [ - | pcre2CompileErrorClass | - pcre2CompileErrorClass := Smalltalk at: #PCRE2CompileError ifAbsent: [ nil ]. - ^ anError class = RegexSyntaxError or: [ anError class = pcre2CompileErrorClass ] + ^ anError class = RegexSyntaxError or: [ anError class = PCRE2CompileError ] ] { #category : 'private - template' } @@ -436,13 +434,10 @@ MCPToolSearch >> parsedRequestFromToolRequest: request [ { #category : 'private - filtering' } MCPToolSearch >> pcre2RegexLibraryAvailable [ - "PCRE2 is optional. Use it only when its Smalltalk package and native runtime library are already available." + "PCRE2 is an optional native runtime dependency: the Smalltalk package can be loaded while the host library is missing." - | libraryClass pcre2Class | - libraryClass := Smalltalk at: #LibPCRE2UTF8 ifAbsent: [ ^ false ]. - pcre2Class := Smalltalk at: #PCRE2 ifAbsent: [ ^ false ]. ^ [ - libraryClass config: pcre2Class configVersion. + LibPCRE2UTF8 config: PCRE2 configVersion. true ] on: Error do: [ false ] From 8a7dd535c0438be673413cc58ffc5e9895d5fefc Mon Sep 17 00:00:00 2001 From: Gabriel-Darbord Date: Fri, 17 Jul 2026 23:38:31 +0200 Subject: [PATCH 3/4] Keep native PCRE2 fallback test focused --- src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st | 2 +- src/MCP/MCPToolSearch.class.st | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st b/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st index 9784d43..52dbdb7 100644 --- a/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st +++ b/src/MCP-Tests/MCPToolSearchWithoutPCRE2TestStub.class.st @@ -1,5 +1,5 @@ " -Test tool that models an image where the optional PCRE2 package or native library is unavailable. +Test tool that models an unavailable native PCRE2 library. " Class { #name : 'MCPToolSearchWithoutPCRE2TestStub', diff --git a/src/MCP/MCPToolSearch.class.st b/src/MCP/MCPToolSearch.class.st index 421d97f..ce0680e 100644 --- a/src/MCP/MCPToolSearch.class.st +++ b/src/MCP/MCPToolSearch.class.st @@ -296,7 +296,8 @@ MCPToolSearch >> includeSourceSchemaPropertyWithDescription: includeSourceDescri { #category : 'private - results' } MCPToolSearch >> isRegexSyntaxError: anError [ - ^ anError class = RegexSyntaxError or: [ anError class = PCRE2CompileError ] + ^ anError class = RegexSyntaxError or: [ + anError class = PCRE2CompileError ] ] { #category : 'private - template' } From f9d9c7c1053f392c1b1ce84306898d6f22c7083e Mon Sep 17 00:00:00 2001 From: Gabriel-Darbord Date: Sat, 18 Jul 2026 20:23:44 +0200 Subject: [PATCH 4/4] Use PCRE2 native-library availability probe --- src/MCP/MCPToolSearch.class.st | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/MCP/MCPToolSearch.class.st b/src/MCP/MCPToolSearch.class.st index ce0680e..5a936a3 100644 --- a/src/MCP/MCPToolSearch.class.st +++ b/src/MCP/MCPToolSearch.class.st @@ -296,8 +296,7 @@ MCPToolSearch >> includeSourceSchemaPropertyWithDescription: includeSourceDescri { #category : 'private - results' } MCPToolSearch >> isRegexSyntaxError: anError [ - ^ anError class = RegexSyntaxError or: [ - anError class = PCRE2CompileError ] + ^ anError class = RegexSyntaxError or: [ anError class = PCRE2CompileError ] ] { #category : 'private - template' } @@ -437,11 +436,7 @@ MCPToolSearch >> parsedRequestFromToolRequest: request [ MCPToolSearch >> pcre2RegexLibraryAvailable [ "PCRE2 is an optional native runtime dependency: the Smalltalk package can be loaded while the host library is missing." - ^ [ - LibPCRE2UTF8 config: PCRE2 configVersion. - true ] - on: Error - do: [ false ] + ^ LibPCRE2UTF8 isNativeLibraryAvailable ] { #category : 'private - filtering' }