diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index 44bca09..a449cdf 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -46,12 +46,12 @@ jobs:
GITLEAKS_ARGS: --no-git
dependency-review:
+ # The action requires GitHub's Dependency Graph repository setting. Keep the
+ # job opt-in so repositories without that setting do not report a false-red
+ # security workflow; pip-audit remains mandatory below.
if: >
github.event_name == 'pull_request' &&
- (
- github.event.repository.private == false ||
- vars.ENABLE_PRIVATE_DEPENDENCY_REVIEW == 'true'
- )
+ vars.ENABLE_DEPENDENCY_REVIEW == 'true'
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..bba5aa9
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,11 @@
+Structorium
+Copyright (c) 2025 Peter O'Malley
+
+This distribution preserves the original MIT license notice and Peter
+O'Malley's authorship metadata. The repository at
+https://github.com/DivyamTalwar/Structorium is currently maintained by
+Divyam Talwar and contains subsequent maintenance and development work.
+
+This notice records the metadata present in the project's initial public
+scaffold. It does not make claims about any unavailable upstream repository
+or transfer copyright ownership. See LICENSE for the complete license terms.
diff --git a/README.md b/README.md
index 1ddd742..3da23ae 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,12 @@
Structorium
Architecture. Automatically Enforced.
+
+The original MIT license and Peter O'Malley's authorship are preserved. This
+repository is maintained by Divyam Talwar. See NOTICE
+for the precise attribution statement.
+
+
@@ -2172,4 +2178,3 @@ copies or substantial portions of the Software.
↑ Back to top
-
diff --git a/pyproject.toml b/pyproject.toml
index 8e01813..c906dc4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -12,6 +12,9 @@ license = "MIT"
authors = [
{name = "Peter O'Malley", email = "pom@banodoco.ai"},
]
+maintainers = [
+ {name = "Divyam Talwar"},
+]
keywords = ["code-quality", "technical-debt", "linter", "static-analysis", "refactoring"]
classifiers = [
"Development Status :: 4 - Beta",
@@ -29,9 +32,9 @@ classifiers = [
dependencies = []
[project.urls]
-Homepage = "https://github.com/peteromallet/structorium"
-Repository = "https://github.com/peteromallet/structorium"
-Issues = "https://github.com/peteromallet/structorium/issues"
+Homepage = "https://github.com/DivyamTalwar/Structorium"
+Repository = "https://github.com/DivyamTalwar/Structorium"
+Issues = "https://github.com/DivyamTalwar/Structorium/issues"
[project.optional-dependencies]
treesitter = ["tree-sitter-language-pack>=0.3"]
diff --git a/tests/ci/test_metadata_contracts.py b/tests/ci/test_metadata_contracts.py
new file mode 100644
index 0000000..9262651
--- /dev/null
+++ b/tests/ci/test_metadata_contracts.py
@@ -0,0 +1,22 @@
+from pathlib import Path
+import tomllib
+
+
+ROOT = Path(__file__).resolve().parents[2]
+
+
+def test_package_metadata_preserves_author_and_names_current_maintainer() -> None:
+ metadata = tomllib.loads((ROOT / "pyproject.toml").read_text())["project"]
+
+ assert metadata["authors"][0]["name"] == "Peter O'Malley"
+ assert metadata["maintainers"][0]["name"] == "Divyam Talwar"
+ assert metadata["urls"]["Repository"].endswith("/DivyamTalwar/Structorium")
+
+
+def test_notice_and_license_preserve_original_attribution() -> None:
+ license_text = (ROOT / "LICENSE").read_text()
+ notice_text = (ROOT / "NOTICE").read_text()
+
+ assert "Copyright (c) 2025 Peter O'Malley" in license_text
+ assert "Copyright (c) 2025 Peter O'Malley" in notice_text
+ assert "does not make claims" in notice_text
diff --git a/tests/review/test_review_commands.py b/tests/review/test_review_commands.py
index 823fcfe..e41be4e 100644
--- a/tests/review/test_review_commands.py
+++ b/tests/review/test_review_commands.py
@@ -775,17 +775,20 @@ def test_do_run_batches_dry_run_generates_packet_and_prompts(
assert len(packet_files) == 1
blind_packet = tmp_path / ".structorium" / "review_packet_blind.json"
assert blind_packet.exists()
- prompt_files = list(runs_dir.glob("*/prompts/batch-*.md"))
+ prompt_files = sorted(runs_dir.glob("*/prompts/batch-*.md"))
assert len(prompt_files) == 2
- prompt_text = prompt_files[0].read_text()
- assert "Blind packet:" in prompt_text
- assert str(blind_packet) in prompt_text
- assert "Previously flagged issues" in prompt_text
- assert "Legacy surface remains primary" in prompt_text
- assert "Mechanical concern signals" in prompt_text
- assert "foo.ts mixes orchestration and transformation" in prompt_text
- assert "Should orchestration move to a dedicated coordinator?" in prompt_text
- assert "Workflow integrity checks" in prompt_text
+ prompt_texts = [prompt_file.read_text() for prompt_file in prompt_files]
+ assert all("Blind packet:" in prompt_text for prompt_text in prompt_texts)
+ assert all(str(blind_packet) in prompt_text for prompt_text in prompt_texts)
+ assert any(
+ "Previously flagged issues" in prompt_text for prompt_text in prompt_texts
+ )
+ joined_prompts = "\n".join(prompt_texts)
+ assert "Legacy surface remains primary" in joined_prompts
+ assert "Mechanical concern signals" in joined_prompts
+ assert "foo.ts mixes orchestration and transformation" in joined_prompts
+ assert "Should orchestration move to a dedicated coordinator?" in joined_prompts
+ assert "Workflow integrity checks" in joined_prompts
run_logs = sorted(runs_dir.glob("*/run.log"))
assert len(run_logs) == 1
run_log_text = run_logs[0].read_text()