allows('name')->andReturn($name); $ability->allows('isDirect')->andReturn($direct); return $ability; } private function coreWith(Ability ...$abilities): Integration { $core = Mockery::mock(Integration::class); $core->allows('id')->andReturn('core'); $core->allows('isAvailable')->andReturn(true); $core->allows('abilities')->andReturn(array_values($abilities)); return $core; } public function testNamesActiveIntegrationsAndCoreRules(): void { $core = $this->coreWith($this->ability('lit/guide', true), $this->ability('lit/menu-list', false)); $text = (new InstructionsBuilder(new IntegrationRegistry($core)))->build(); self::assertStringContainsString('Aktive Integrationen: core', $text); self::assertStringContainsString('lit-guide', $text); self::assertStringContainsString('Status', $text); self::assertLessThan(2000, strlen($text), 'Instructions must stay short – they are loaded in every conversation.'); } public function testListsPostTypesWhenAProviderIsGiven(): void { $core = $this->coreWith($this->ability('lit/guide', true)); $text = (new InstructionsBuilder(new IntegrationRegistry($core), static fn (): array => ['page', 'post']))->build(); self::assertStringContainsString('Inhaltstypen: page, post', $text); self::assertStringContainsString('lit-content-types', $text); self::assertStringContainsString('confirm: true', $text); } public function testListsTheCurrentlyDirectToolsByToolNameAndNamesTheRestNeutrally(): void { $core = $this->coreWith( $this->ability('lit/guide', true), $this->ability('lit/menu-list', false) ); $text = (new InstructionsBuilder(new IntegrationRegistry($core)))->build(); self::assertStringContainsString('Direkt aufrufbare Tools: lit-guide', $text); self::assertStringContainsString('mcp-adapter-execute-ability', $text); self::assertStringNotContainsString('lit-menu-list', $text); } public function testDirectToolListReflectsExposurePolicyOverrides(): void { $core = $this->coreWith( $this->ability('lit/guide', true), $this->ability('lit/menu-list', false) ); $policy = new ExposurePolicy(['lit/menu-list' => 'direct']); $text = (new InstructionsBuilder(new IntegrationRegistry($core), null, $policy))->build(); self::assertStringContainsString('lit-menu-list', $text); } }