diff --git a/README.md b/README.md index f75c8d57..8cc67390 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Murphy — AI-Driven Website Evaluation +[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) + Murphy automatically evaluates websites by generating and executing test scenarios in a real browser with an AI judge. It supports two planning strategies — **broad feature discovery** (default) and **goal-directed exploration** (`--goal`) — followed by test execution. It produces structured evaluation reports with pass/fail results, failure categorization, and actionable summaries. Built on top of [browser-use](https://github.com/browser-use/browser-use) (AI browser automation library). @@ -337,3 +339,13 @@ See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for details on the codebase str ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) for development workflow, testing, code style, and contribution guidelines. + +--- + +## License + +Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for details. + +This project bundles a vendored copy of [browser-use](https://github.com/browser-use/browser-use) (MIT). See [NOTICE](NOTICE). + +Copyright © 2026 MIH AI B.V. diff --git a/murphy/__init__.py b/murphy/__init__.py index f8841457..b113a182 100644 --- a/murphy/__init__.py +++ b/murphy/__init__.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — AI-driven website evaluation powered by browser-use.""" __version__ = '1.1.0' diff --git a/murphy/__main__.py b/murphy/__main__.py index 7cdd9dc5..419af093 100644 --- a/murphy/__main__.py +++ b/murphy/__main__.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Allow running as: python -m murphy --url """ import sys diff --git a/murphy/api/__init__.py b/murphy/api/__init__.py index e69de29b..4fd0ef95 100644 --- a/murphy/api/__init__.py +++ b/murphy/api/__init__.py @@ -0,0 +1,12 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/murphy/api/auth.py b/murphy/api/auth.py index e8cea687..035276e5 100644 --- a/murphy/api/auth.py +++ b/murphy/api/auth.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — auth detection and manual login helpers.""" from __future__ import annotations diff --git a/murphy/api/cli.py b/murphy/api/cli.py index 2d5db9a0..9fecb6f6 100644 --- a/murphy/api/cli.py +++ b/murphy/api/cli.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy CLI — single command entry point. Usage: diff --git a/murphy/api/jobs.py b/murphy/api/jobs.py index e2c81cc0..b8bc3334 100644 --- a/murphy/api/jobs.py +++ b/murphy/api/jobs.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy REST API — job store, dispatch, and execution wrappers.""" from __future__ import annotations diff --git a/murphy/api/request_models.py b/murphy/api/request_models.py index 497511a9..237f116a 100644 --- a/murphy/api/request_models.py +++ b/murphy/api/request_models.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy REST API — request and response models.""" from __future__ import annotations diff --git a/murphy/api/rest.py b/murphy/api/rest.py index 3d2c6d8a..d1f66ec2 100644 --- a/murphy/api/rest.py +++ b/murphy/api/rest.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy REST API — HTTP interface for programmatic evaluation. Exposes Murphy's evaluation pipeline as REST endpoints: diff --git a/murphy/api/server.py b/murphy/api/server.py index 023eaf97..31560bab 100644 --- a/murphy/api/server.py +++ b/murphy/api/server.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — Interactive test review server. Serves an HTML UI for reviewing generated tests before execution, diff --git a/murphy/api/templates.py b/murphy/api/templates.py index 8d1baf18..a7820ae1 100644 --- a/murphy/api/templates.py +++ b/murphy/api/templates.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — HTML templates for the interactive test review UI.""" from __future__ import annotations diff --git a/murphy/browser/__init__.py b/murphy/browser/__init__.py index e69de29b..4fd0ef95 100644 --- a/murphy/browser/__init__.py +++ b/murphy/browser/__init__.py @@ -0,0 +1,12 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/murphy/browser/actions.py b/murphy/browser/actions.py index 5db39878..25ffb045 100644 --- a/murphy/browser/actions.py +++ b/murphy/browser/actions.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Custom agent actions for Murphy evaluation scenarios.""" from __future__ import annotations diff --git a/murphy/browser/cleanup.py b/murphy/browser/cleanup.py index e92209a4..ca1ccf72 100644 --- a/murphy/browser/cleanup.py +++ b/murphy/browser/cleanup.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Browser process cleanup for Murphy. Ensures orphan Chromium processes from crashed runs are cleaned up, diff --git a/murphy/browser/patches.py b/murphy/browser/patches.py index fe437fb5..b58b3728 100644 --- a/murphy/browser/patches.py +++ b/murphy/browser/patches.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Monkey-patch: make browser_use's schema_dict_to_pydantic_model resolve $defs/$ref before validation so schemas with nested Pydantic models work.""" diff --git a/murphy/browser/session_utils.py b/murphy/browser/session_utils.py index b0519786..babf2465 100644 --- a/murphy/browser/session_utils.py +++ b/murphy/browser/session_utils.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Session management helpers for stabilizing browser state between test runs.""" from __future__ import annotations diff --git a/murphy/config.py b/murphy/config.py index 8cde0915..de0180c0 100644 --- a/murphy/config.py +++ b/murphy/config.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — shared constants and configuration.""" import os diff --git a/murphy/core/__init__.py b/murphy/core/__init__.py index e69de29b..4fd0ef95 100644 --- a/murphy/core/__init__.py +++ b/murphy/core/__init__.py @@ -0,0 +1,12 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/murphy/core/analysis.py b/murphy/core/analysis.py index ce2f0907..13813503 100644 --- a/murphy/core/analysis.py +++ b/murphy/core/analysis.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — website analysis (Phase 1 of evaluation).""" import logging diff --git a/murphy/core/execution.py b/murphy/core/execution.py index f891701a..f14acc56 100644 --- a/murphy/core/execution.py +++ b/murphy/core/execution.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — test execution (Phase 3 of evaluation).""" import asyncio diff --git a/murphy/core/generation.py b/murphy/core/generation.py index 4ecdfb20..db50b2d5 100644 --- a/murphy/core/generation.py +++ b/murphy/core/generation.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — test plan generation (Phase 2 of evaluation).""" import logging diff --git a/murphy/core/judge.py b/murphy/core/judge.py index 48e06a82..b751c44d 100644 --- a/murphy/core/judge.py +++ b/murphy/core/judge.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Murphy's own judge — evaluates agent success based on action trace, not self-report. diff --git a/murphy/core/pipeline.py b/murphy/core/pipeline.py index e080465f..38ad84d5 100644 --- a/murphy/core/pipeline.py +++ b/murphy/core/pipeline.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — shared pipeline orchestration. Lifecycle-managed helpers that encapsulate the common pattern of: diff --git a/murphy/core/quality.py b/murphy/core/quality.py index c5e51317..c44774e2 100644 --- a/murphy/core/quality.py +++ b/murphy/core/quality.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — test plan and scenario quality validation.""" import re diff --git a/murphy/core/summary.py b/murphy/core/summary.py index 6714d903..29f48ba8 100644 --- a/murphy/core/summary.py +++ b/murphy/core/summary.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — results classification, summary building, and report writing.""" import logging diff --git a/murphy/evaluate.py b/murphy/evaluate.py index bcecc708..b5e632b6 100644 --- a/murphy/evaluate.py +++ b/murphy/evaluate.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy evaluate — public API facade. Single import point for Murphy's pipeline functions. All logic lives in diff --git a/murphy/io/__init__.py b/murphy/io/__init__.py index e69de29b..4fd0ef95 100644 --- a/murphy/io/__init__.py +++ b/murphy/io/__init__.py @@ -0,0 +1,12 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/murphy/io/features_io.py b/murphy/io/features_io.py index 7d4eb702..4b8434b5 100644 --- a/murphy/io/features_io.py +++ b/murphy/io/features_io.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — features markdown read/write (analogous to test_plan_io.py for YAML).""" from __future__ import annotations diff --git a/murphy/io/fixtures.py b/murphy/io/fixtures.py index 4250cb0c..f3f05434 100644 --- a/murphy/io/fixtures.py +++ b/murphy/io/fixtures.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Dummy fixture files for upload scenario testing.""" from pathlib import Path diff --git a/murphy/io/regen_report.py b/murphy/io/regen_report.py index 3a89cce8..1a2d3fea 100644 --- a/murphy/io/regen_report.py +++ b/murphy/io/regen_report.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Quick script to regenerate markdown from existing JSON report.""" import logging diff --git a/murphy/io/report.py b/murphy/io/report.py index 1521a806..d5c034de 100644 --- a/murphy/io/report.py +++ b/murphy/io/report.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Report generation — orchestration and re-exports. Sub-modules: diff --git a/murphy/io/report_helpers.py b/murphy/io/report_helpers.py index 9fd7a553..3fbc635d 100644 --- a/murphy/io/report_helpers.py +++ b/murphy/io/report_helpers.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Report generation — shared helpers and utilities.""" from __future__ import annotations diff --git a/murphy/io/report_json.py b/murphy/io/report_json.py index b5b1e83b..63472d96 100644 --- a/murphy/io/report_json.py +++ b/murphy/io/report_json.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Report generation — JSON output and screenshot management.""" from __future__ import annotations diff --git a/murphy/io/report_markdown.py b/murphy/io/report_markdown.py index e5c2e4f6..2ec98a17 100644 --- a/murphy/io/report_markdown.py +++ b/murphy/io/report_markdown.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Report generation — Markdown output.""" from __future__ import annotations diff --git a/murphy/io/test_plan_io.py b/murphy/io/test_plan_io.py index a9fdc8ee..d32d36d0 100644 --- a/murphy/io/test_plan_io.py +++ b/murphy/io/test_plan_io.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """YAML serialization for Murphy test plans. Saves test plans to a human-editable YAML file before execution, diff --git a/murphy/llm.py b/murphy/llm.py index 32d7697f..c7de6652 100644 --- a/murphy/llm.py +++ b/murphy/llm.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy — LLM factory supporting multiple providers via browser_use.""" import os diff --git a/murphy/models.py b/murphy/models.py index 3ed79170..1adc0584 100644 --- a/murphy/models.py +++ b/murphy/models.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Pydantic models for the Murphy evaluation pipeline.""" from enum import IntEnum diff --git a/murphy/personas/__init__.py b/murphy/personas/__init__.py index 5f92ab9b..cd3ed7ca 100644 --- a/murphy/personas/__init__.py +++ b/murphy/personas/__init__.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Murphy personas — data-driven persona generation from analytics.""" from murphy.personas.base import AnalyticsConnector diff --git a/murphy/personas/base.py b/murphy/personas/base.py index aec772d9..c3b1115a 100644 --- a/murphy/personas/base.py +++ b/murphy/personas/base.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Abstract connector protocol for analytics integrations.""" from __future__ import annotations diff --git a/murphy/personas/bridge.py b/murphy/personas/bridge.py index 9218738d..0f7c5b93 100644 --- a/murphy/personas/bridge.py +++ b/murphy/personas/bridge.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Thin adapter between discovered personas and the Murphy test pipeline. Slugifies names, formats distribution/execution/judge blocks from the diff --git a/murphy/personas/clustering.py b/murphy/personas/clustering.py index 3ee95ffc..0f3b31dd 100644 --- a/murphy/personas/clustering.py +++ b/murphy/personas/clustering.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Phase 3a — Clustering: group scored sessions into persona clusters. Pure algorithmic module (no LLM calls). Uses K-Means with automatic K diff --git a/murphy/personas/compressor.py b/murphy/personas/compressor.py index 8c890b2e..16fa40f0 100644 --- a/murphy/personas/compressor.py +++ b/murphy/personas/compressor.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Session compressor — converts AnalyticsSession into a token-efficient text timeline. Produces sections: metadata header, optional cognitive summary, navigation diff --git a/murphy/personas/demo.py b/murphy/personas/demo.py index cedbcf95..6dfa4ec8 100644 --- a/murphy/personas/demo.py +++ b/murphy/personas/demo.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Demo: run the persona discovery and scoring pipeline and display results. Usage:: diff --git a/murphy/personas/discovery.py b/murphy/personas/discovery.py index 40696131..81c65345 100644 --- a/murphy/personas/discovery.py +++ b/murphy/personas/discovery.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Phase 1 — Discovery: observe sessions and cluster into a trait schema. Two steps: diff --git a/murphy/personas/models.py b/murphy/personas/models.py index 5e02a19f..f6a4b71e 100644 --- a/murphy/personas/models.py +++ b/murphy/personas/models.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Canonical analytics models shared across all vendor integrations.""" from __future__ import annotations diff --git a/murphy/personas/persona_labeling.py b/murphy/personas/persona_labeling.py index a4477beb..58a2cc12 100644 --- a/murphy/personas/persona_labeling.py +++ b/murphy/personas/persona_labeling.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Phase 3b — Persona Labeling: use the LLM to name and describe persona clusters. Takes algorithmic clustering output (centroids + sizes) and the trait diff --git a/murphy/personas/pipeline.py b/murphy/personas/pipeline.py index c085e3f8..f71a6314 100644 --- a/murphy/personas/pipeline.py +++ b/murphy/personas/pipeline.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Persona pipeline orchestrator — ties PostHog data fetching, discovery, and scoring together. Top-level entry point: :func:`run_persona_pipeline`. diff --git a/murphy/personas/pipeline_models.py b/murphy/personas/pipeline_models.py index c8169100..12c04016 100644 --- a/murphy/personas/pipeline_models.py +++ b/murphy/personas/pipeline_models.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Pydantic models for the persona discovery and scoring pipeline. These models serve as structured output formats for LLM calls via diff --git a/murphy/personas/posthog_adapter.py b/murphy/personas/posthog_adapter.py index 6d5be8f9..b8040d8a 100644 --- a/murphy/personas/posthog_adapter.py +++ b/murphy/personas/posthog_adapter.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """PostHog adapter — maps PostHogClient output to canonical analytics models.""" from __future__ import annotations diff --git a/murphy/personas/posthog_client.py b/murphy/personas/posthog_client.py index eaed9028..b47580ce 100644 --- a/murphy/personas/posthog_client.py +++ b/murphy/personas/posthog_client.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """PostHog API client for ingesting events, persons, cohorts, and metadata. Uses the HogQL Query API (POST /api/projects/:project_id/query/) for events diff --git a/murphy/personas/scoring.py b/murphy/personas/scoring.py index 1ead19fa..7d123eb4 100644 --- a/murphy/personas/scoring.py +++ b/murphy/personas/scoring.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Phase 2 — Scoring: score sessions against a fixed trait schema. Each session is scored independently via an LLM call that receives the diff --git a/murphy/personas/storage.py b/murphy/personas/storage.py index bd2d69b8..1c60a33b 100644 --- a/murphy/personas/storage.py +++ b/murphy/personas/storage.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """Persona persistence — save and load discovered personas as JSON.""" from __future__ import annotations diff --git a/murphy/prompts.py b/murphy/prompts.py index e494eab9..eefd8572 100644 --- a/murphy/prompts.py +++ b/murphy/prompts.py @@ -1,3 +1,16 @@ +# Copyright © 2026 MIH AI B.V. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Murphy — LLM prompt text for evaluation phases.