From 8f6aca17a0b94bbcc08f5b22112440861bb5329e Mon Sep 17 00:00:00 2001 From: kevinngo1304 Date: Wed, 8 Jul 2026 08:44:22 +0200 Subject: [PATCH] OSS compliance: add Apache-2.0 source headers and README license section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Manual follow-up steps to PR #16: - Add the Apache-2.0 license header to all 52 source files under murphy/ (browser_use/ left untouched — vendored MIT code, retains its attribution). - Add the Apache-2.0 license badge under the README title and a License section referencing LICENSE and NOTICE. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- README.md | 12 ++++++++++++ murphy/__init__.py | 13 +++++++++++++ murphy/__main__.py | 13 +++++++++++++ murphy/api/__init__.py | 12 ++++++++++++ murphy/api/auth.py | 13 +++++++++++++ murphy/api/cli.py | 13 +++++++++++++ murphy/api/jobs.py | 13 +++++++++++++ murphy/api/request_models.py | 13 +++++++++++++ murphy/api/rest.py | 13 +++++++++++++ murphy/api/server.py | 13 +++++++++++++ murphy/api/templates.py | 13 +++++++++++++ murphy/browser/__init__.py | 12 ++++++++++++ murphy/browser/actions.py | 13 +++++++++++++ murphy/browser/cleanup.py | 13 +++++++++++++ murphy/browser/patches.py | 13 +++++++++++++ murphy/browser/session_utils.py | 13 +++++++++++++ murphy/config.py | 13 +++++++++++++ murphy/core/__init__.py | 12 ++++++++++++ murphy/core/analysis.py | 13 +++++++++++++ murphy/core/execution.py | 13 +++++++++++++ murphy/core/generation.py | 13 +++++++++++++ murphy/core/judge.py | 13 +++++++++++++ murphy/core/pipeline.py | 13 +++++++++++++ murphy/core/quality.py | 13 +++++++++++++ murphy/core/summary.py | 13 +++++++++++++ murphy/evaluate.py | 13 +++++++++++++ murphy/io/__init__.py | 12 ++++++++++++ murphy/io/features_io.py | 13 +++++++++++++ murphy/io/fixtures.py | 13 +++++++++++++ murphy/io/regen_report.py | 13 +++++++++++++ murphy/io/report.py | 13 +++++++++++++ murphy/io/report_helpers.py | 13 +++++++++++++ murphy/io/report_json.py | 13 +++++++++++++ murphy/io/report_markdown.py | 13 +++++++++++++ murphy/io/test_plan_io.py | 13 +++++++++++++ murphy/llm.py | 13 +++++++++++++ murphy/models.py | 13 +++++++++++++ murphy/personas/__init__.py | 13 +++++++++++++ murphy/personas/base.py | 13 +++++++++++++ murphy/personas/bridge.py | 13 +++++++++++++ murphy/personas/clustering.py | 13 +++++++++++++ murphy/personas/compressor.py | 13 +++++++++++++ murphy/personas/demo.py | 13 +++++++++++++ murphy/personas/discovery.py | 13 +++++++++++++ murphy/personas/models.py | 13 +++++++++++++ murphy/personas/persona_labeling.py | 13 +++++++++++++ murphy/personas/pipeline.py | 13 +++++++++++++ murphy/personas/pipeline_models.py | 13 +++++++++++++ murphy/personas/posthog_adapter.py | 13 +++++++++++++ murphy/personas/posthog_client.py | 13 +++++++++++++ murphy/personas/scoring.py | 13 +++++++++++++ murphy/personas/storage.py | 13 +++++++++++++ murphy/prompts.py | 13 +++++++++++++ 53 files changed, 684 insertions(+) diff --git a/README.md b/README.md index f75c8d577..8cc67390c 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 f88414573..b113a182e 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 7cdd9dc53..419af093b 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 e69de29bb..4fd0ef95c 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 e8cea6878..035276e54 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 2d5db9a00..9fecb6f67 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 e2c81cc03..b8bc33346 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 497511a9e..237f116a3 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 3d2c6d8a9..d1f66ec26 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 023eaf970..31560bab1 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 8d1baf186..a7820ae19 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 e69de29bb..4fd0ef95c 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 5db398785..25ffb045b 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 e92209a4b..ca1ccf72e 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 fe437fb5c..b58b37288 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 b05197865..babf2465e 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 8cde09154..de0180c07 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 e69de29bb..4fd0ef95c 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 ce2f09075..138135037 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 f891701ac..f14acc56e 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 4ecdfb204..db50b2d52 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 48e06a823..b751c44dd 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 e080465f8..38ad84d50 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 c5e51317d..c44774e25 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 6714d9034..29f48ba86 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 bcecc708f..b5e632b67 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 e69de29bb..4fd0ef95c 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 7d4eb702f..4b8434b5e 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 4250cb0cc..f3f054340 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 3a89cce85..1a2d3fea5 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 1521a8069..d5c034deb 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 9fd7a5534..3fbc635d2 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 b5b1e83b5..63472d964 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 e5c2e4f6a..2ec98a174 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 a9fdc8ee3..d32d36d0e 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 32d7697fb..c7de66529 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 3ed79170c..1adc05842 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 5f92ab9bc..cd3ed7caa 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 aec772d9f..c3b1115af 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 9218738d7..0f7c5b93c 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 3ee95ffc8..0f3b31dd7 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 8c890b2eb..16fa40f0b 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 cedbcf955..6dfa4ec80 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 40696131c..81c653452 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 5e02a19f7..f6a4b71ed 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 a4477bebd..58a2cc12d 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 c085e3f88..f71a6314e 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 c81691007..12c040166 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 6d5be8f94..b8040d8ad 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 eaed9028d..b47580ceb 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 1ead19fa7..7d123eb4a 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 bd2d69b85..1c60a33bf 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 e494eab93..eefd85726 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.