From ff0af59a0841a5d85a0cc979d2f8d1ba26e79111 Mon Sep 17 00:00:00 2001 From: Justin Soderberg <723679+sodejm@users.noreply.github.com> Date: Fri, 2 Oct 2026 22:20:25 -0400 Subject: [PATCH] feat(portability): standardize manifest extension and prerequisites on org.cops namespace --- cops/portable.py | 5 +++-- cops/validation.py | 2 +- docs/ADDING_A_PLUGIN.md | 6 +++--- docs/NAMING.md | 1 + docs/PORTABILITY.md | 7 ++++++- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../detection-hunting/attack-path-workbench/plugin.json | 2 +- .../detection-quality-workbench/README.md | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../detection-quality-workbench/plugin.json | 2 +- .../scripts/validate_package.py | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../detection-hunting/sentinel-hunt-workbench/plugin.json | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../soc-investigation-workbench/plugin.json | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../threat-intelligence-enrichment/plugin.json | 2 +- plugins/identity-access/entra-identity-workbench/README.md | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../identity-access/entra-identity-workbench/plugin.json | 2 +- .../entra-identity-workbench/scripts/validate_package.py | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../incident-response-sandbox/plugin.json | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../logging-telemetry/security-logging-advisor/plugin.json | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 plugins/logging-telemetry/telemetry-proof-pack/plugin.json | 2 +- .../telemetry-proof-pack/scripts/validate_package.py | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../offensive-security/attack-surface-planner/plugin.json | 2 +- plugins/offensive-security/foundry-agent-harness/README.md | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../offensive-security/foundry-agent-harness/plugin.json | 2 +- .../foundry-agent-harness/scripts/validate_package.py | 2 +- .../exposure-triage-workbench/README.md | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../exposure-triage-workbench/plugin.json | 2 +- .../exposure-triage-workbench/scripts/validate_package.py | 2 +- .../{com.sodejm.copse => org.cops}/prerequisites.json | 0 .../patch-security-review/plugin.json | 2 +- scripts/agent/install_prerequisites.py | 2 +- specs/marketplace-portability.spec.md | 4 ++-- tests/step_defs/test_marketplace_contract.py | 6 +++--- 43 files changed, 42 insertions(+), 35 deletions(-) rename plugins/detection-hunting/attack-path-workbench/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/detection-hunting/detection-quality-workbench/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/detection-hunting/sentinel-hunt-workbench/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/detection-hunting/soc-investigation-workbench/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/detection-hunting/threat-intelligence-enrichment/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/identity-access/entra-identity-workbench/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/incident-response/incident-response-sandbox/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/logging-telemetry/security-logging-advisor/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/logging-telemetry/telemetry-proof-pack/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/offensive-security/attack-surface-planner/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/offensive-security/foundry-agent-harness/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/vulnerability-management/exposure-triage-workbench/{com.sodejm.copse => org.cops}/prerequisites.json (100%) rename plugins/vulnerability-management/patch-security-review/{com.sodejm.copse => org.cops}/prerequisites.json (100%) diff --git a/cops/portable.py b/cops/portable.py index 452caae..38c6d0c 100644 --- a/cops/portable.py +++ b/cops/portable.py @@ -23,11 +23,12 @@ "investigationwb", "attackpath", "attack_surface_planner", "entrawb", "exposuretriage", "foundryharness", "scenarios", "detectionquality", "rules", "proofpack", "routes", "patchreview", "incident_response", "threat_intel", - "agents", "com.github.copilot", "com.sodejm.copse", + "agents", "com.github.copilot", "org.cops", } SOURCE_ONLY_ENTRIES = { ".claude-plugin", ".codex-plugin", "commands", "adapters", "package.json", ".gitignore", "Makefile", "task.md", "tests", + ".pytest_cache", "__pycache__", ".mypy_cache", } NATIVE_ENTRIES = {".claude-plugin", ".codex-plugin", "commands", "adapters"} @@ -95,7 +96,7 @@ def validate_portable_package(package: Path) -> None: raise ValidationError(f"{package} must contain at least one skill") for skill in skills: _skill_frontmatter(skill, package) - namespace = "com.sodejm.copse" + namespace = "org.cops" if manifest.get("extensions", {}).get(namespace) is None: raise ValidationError(f"{package}/plugin.json must declare {namespace}") prereq = package / namespace / "prerequisites.json" diff --git a/cops/validation.py b/cops/validation.py index 1236703..88abb83 100644 --- a/cops/validation.py +++ b/cops/validation.py @@ -247,7 +247,7 @@ def validate_package(record: PluginRecord, root: Path = ROOT) -> None: package_root = root / record.path resolved_root = package_root.resolve() - prereq_path = "com.sodejm.copse/prerequisites.json" + prereq_path = "org.cops/prerequisites.json" for relative in ("plugin.json", ".claude-plugin/plugin.json", ".codex-plugin/plugin.json", prereq_path, "skills"): path = package_root / relative diff --git a/docs/ADDING_A_PLUGIN.md b/docs/ADDING_A_PLUGIN.md index e8a1ae8..389c2f0 100644 --- a/docs/ADDING_A_PLUGIN.md +++ b/docs/ADDING_A_PLUGIN.md @@ -29,7 +29,7 @@ At minimum, add: plugin.json .codex-plugin/plugin.json .claude-plugin/plugin.json -com.sodejm.copse/prerequisites.json +org.cops/prerequisites.json package.json README.md skills//SKILL.md @@ -43,8 +43,8 @@ host manifests may point to the same canonical skills and scripts, but must not fork their behavior. Use only v1 standard fields in the root manifest. Put COPS-specific manifest -data under `extensions.com.sodejm.copse` and its support files in the -`com.sodejm.copse/` directory. Declare required external commands in +data under `extensions["org.cops"]` and its support files in the +`org.cops/` directory. Declare required external commands in `prerequisites.json` using `schema_version: "1.0"` and a `tools` array. Each tool has an `id`, the command to detect, and package IDs keyed by supported managers (`brew`, `apt-get`, `dnf`, or `winget`). Use an empty array when no external tool diff --git a/docs/NAMING.md b/docs/NAMING.md index 997daaa..83734f4 100644 --- a/docs/NAMING.md +++ b/docs/NAMING.md @@ -8,6 +8,7 @@ | Repository slug | `copilot-operation-plugin-for-security` | | Existing package, agent, command and plugin ID | `security-logging-advisor` | | Marketplace ID | `cops-security-marketplace` | +| COPS extension namespace and directory | `org.cops` | Use the expanded project name in introductions and COPS in headings and everyday prose. Describe COPS as a cybersecurity project for plugins, agents, and skills. diff --git a/docs/PORTABILITY.md b/docs/PORTABILITY.md index ea31c35..ebcecf7 100644 --- a/docs/PORTABILITY.md +++ b/docs/PORTABILITY.md @@ -94,7 +94,12 @@ python3 scripts/agent/export_portable.py --output dist/agent-plugins The exported packages strip away internal host-specific directories (such as `.claude-plugin/` and `.codex-plugin/`), leaving a lean, standards-compliant plugin containing: - `plugin.json`: The standard root manifest. - `skills/`: Markdown-documented capabilities conforming to the Agent Skills standard. -- `com.sodejm.copse/prerequisites.json`: Declarative system dependencies. +- `org.cops/prerequisites.json`: Declarative system dependencies. + +COPS uses the project namespace `org.cops` for both the manifest's +`extensions["org.cops"]` key and its support directory. When updating an older +package that uses the username-based namespace, replace the manifest key and +directory together, update references, and regenerate any portable exports. ### Declarative Prerequisites (No Surprise Scripts) Rather than executing arbitrary installation scripts during setup, COPS declares prerequisites as structured JSON metadata. You can inspect what external tools (like `git` or specific linters) a plugin requires without running untrusted code: diff --git a/plugins/detection-hunting/attack-path-workbench/com.sodejm.copse/prerequisites.json b/plugins/detection-hunting/attack-path-workbench/org.cops/prerequisites.json similarity index 100% rename from plugins/detection-hunting/attack-path-workbench/com.sodejm.copse/prerequisites.json rename to plugins/detection-hunting/attack-path-workbench/org.cops/prerequisites.json diff --git a/plugins/detection-hunting/attack-path-workbench/plugin.json b/plugins/detection-hunting/attack-path-workbench/plugin.json index 84992e9..6c7e5e3 100644 --- a/plugins/detection-hunting/attack-path-workbench/plugin.json +++ b/plugins/detection-hunting/attack-path-workbench/plugin.json @@ -20,6 +20,6 @@ "displayName": "COPS Attack Path Workbench", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/detection-hunting/detection-quality-workbench/README.md b/plugins/detection-hunting/detection-quality-workbench/README.md index 25f7507..b8ddd90 100644 --- a/plugins/detection-hunting/detection-quality-workbench/README.md +++ b/plugins/detection-hunting/detection-quality-workbench/README.md @@ -64,7 +64,7 @@ flowchart LR detection-quality-workbench/ ├── .claude-plugin/plugin.json # Claude marketplace manifest ├── .codex-plugin/plugin.json # Codex marketplace manifest -├── com.sodejm.copse/prerequisites.json # Copilot Studio configuration +├── org.cops/prerequisites.json # Copilot Studio configuration ├── package.json # Canonical package descriptor ├── plugin.json # Universal plugin manifest ├── README.md # Primary overview and usage documentation diff --git a/plugins/detection-hunting/detection-quality-workbench/com.sodejm.copse/prerequisites.json b/plugins/detection-hunting/detection-quality-workbench/org.cops/prerequisites.json similarity index 100% rename from plugins/detection-hunting/detection-quality-workbench/com.sodejm.copse/prerequisites.json rename to plugins/detection-hunting/detection-quality-workbench/org.cops/prerequisites.json diff --git a/plugins/detection-hunting/detection-quality-workbench/plugin.json b/plugins/detection-hunting/detection-quality-workbench/plugin.json index bb33398..8e4aca4 100644 --- a/plugins/detection-hunting/detection-quality-workbench/plugin.json +++ b/plugins/detection-hunting/detection-quality-workbench/plugin.json @@ -26,6 +26,6 @@ "displayName": "COPS Detection Quality & Regression Workbench", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/detection-hunting/detection-quality-workbench/scripts/validate_package.py b/plugins/detection-hunting/detection-quality-workbench/scripts/validate_package.py index 1441abc..8c974bd 100644 --- a/plugins/detection-hunting/detection-quality-workbench/scripts/validate_package.py +++ b/plugins/detection-hunting/detection-quality-workbench/scripts/validate_package.py @@ -26,7 +26,7 @@ def validate() -> int: PLUGIN_ROOT / "plugin.json", PLUGIN_ROOT / ".claude-plugin" / "plugin.json", PLUGIN_ROOT / ".codex-plugin" / "plugin.json", - PLUGIN_ROOT / "com.sodejm.copse" / "prerequisites.json", + PLUGIN_ROOT / "org.cops" / "prerequisites.json", PLUGIN_ROOT / "schemas" / "rule.schema.json", PLUGIN_ROOT / "schemas" / "fixture.schema.json", PLUGIN_ROOT / "schemas" / "report.schema.json", diff --git a/plugins/detection-hunting/sentinel-hunt-workbench/com.sodejm.copse/prerequisites.json b/plugins/detection-hunting/sentinel-hunt-workbench/org.cops/prerequisites.json similarity index 100% rename from plugins/detection-hunting/sentinel-hunt-workbench/com.sodejm.copse/prerequisites.json rename to plugins/detection-hunting/sentinel-hunt-workbench/org.cops/prerequisites.json diff --git a/plugins/detection-hunting/sentinel-hunt-workbench/plugin.json b/plugins/detection-hunting/sentinel-hunt-workbench/plugin.json index 6eb9827..1e006c5 100644 --- a/plugins/detection-hunting/sentinel-hunt-workbench/plugin.json +++ b/plugins/detection-hunting/sentinel-hunt-workbench/plugin.json @@ -20,6 +20,6 @@ "displayName": "COPS Sentinel Hunt Workbench", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/detection-hunting/soc-investigation-workbench/com.sodejm.copse/prerequisites.json b/plugins/detection-hunting/soc-investigation-workbench/org.cops/prerequisites.json similarity index 100% rename from plugins/detection-hunting/soc-investigation-workbench/com.sodejm.copse/prerequisites.json rename to plugins/detection-hunting/soc-investigation-workbench/org.cops/prerequisites.json diff --git a/plugins/detection-hunting/soc-investigation-workbench/plugin.json b/plugins/detection-hunting/soc-investigation-workbench/plugin.json index d24088f..54b2427 100644 --- a/plugins/detection-hunting/soc-investigation-workbench/plugin.json +++ b/plugins/detection-hunting/soc-investigation-workbench/plugin.json @@ -20,6 +20,6 @@ "displayName": "COPS SOC Investigation Workbench", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/detection-hunting/threat-intelligence-enrichment/com.sodejm.copse/prerequisites.json b/plugins/detection-hunting/threat-intelligence-enrichment/org.cops/prerequisites.json similarity index 100% rename from plugins/detection-hunting/threat-intelligence-enrichment/com.sodejm.copse/prerequisites.json rename to plugins/detection-hunting/threat-intelligence-enrichment/org.cops/prerequisites.json diff --git a/plugins/detection-hunting/threat-intelligence-enrichment/plugin.json b/plugins/detection-hunting/threat-intelligence-enrichment/plugin.json index cef15e8..b332d9a 100644 --- a/plugins/detection-hunting/threat-intelligence-enrichment/plugin.json +++ b/plugins/detection-hunting/threat-intelligence-enrichment/plugin.json @@ -9,6 +9,6 @@ "keywords": ["cybersecurity", "threat-intelligence", "misp", "taxii", "microsoft", "enrichment"], "extensions": { "com.openai": {"displayName": "COPS Threat Intelligence Enrichment", "category": "Developer Tools"}, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/identity-access/entra-identity-workbench/README.md b/plugins/identity-access/entra-identity-workbench/README.md index afb0047..22031d9 100644 --- a/plugins/identity-access/entra-identity-workbench/README.md +++ b/plugins/identity-access/entra-identity-workbench/README.md @@ -42,7 +42,7 @@ flowchart LR entra-identity-workbench/ ├── .claude-plugin/plugin.json # Claude marketplace manifest ├── .codex-plugin/plugin.json # Codex marketplace manifest -├── com.sodejm.copse/prerequisites.json # Copilot Studio runtime prerequisites +├── org.cops/prerequisites.json # Copilot Studio runtime prerequisites ├── package.json # Canonical package descriptor ├── plugin.json # Universal plugin manifest ├── README.md # Primary overview and usage documentation diff --git a/plugins/identity-access/entra-identity-workbench/com.sodejm.copse/prerequisites.json b/plugins/identity-access/entra-identity-workbench/org.cops/prerequisites.json similarity index 100% rename from plugins/identity-access/entra-identity-workbench/com.sodejm.copse/prerequisites.json rename to plugins/identity-access/entra-identity-workbench/org.cops/prerequisites.json diff --git a/plugins/identity-access/entra-identity-workbench/plugin.json b/plugins/identity-access/entra-identity-workbench/plugin.json index 70096e3..47fee3e 100644 --- a/plugins/identity-access/entra-identity-workbench/plugin.json +++ b/plugins/identity-access/entra-identity-workbench/plugin.json @@ -25,6 +25,6 @@ "displayName": "COPS Entra Identity Workbench", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/identity-access/entra-identity-workbench/scripts/validate_package.py b/plugins/identity-access/entra-identity-workbench/scripts/validate_package.py index f9858a2..774f86d 100644 --- a/plugins/identity-access/entra-identity-workbench/scripts/validate_package.py +++ b/plugins/identity-access/entra-identity-workbench/scripts/validate_package.py @@ -28,7 +28,7 @@ def validate() -> int: PLUGIN_ROOT / "plugin.json", PLUGIN_ROOT / ".claude-plugin" / "plugin.json", PLUGIN_ROOT / ".codex-plugin" / "plugin.json", - PLUGIN_ROOT / "com.sodejm.copse" / "prerequisites.json", + PLUGIN_ROOT / "org.cops" / "prerequisites.json", PLUGIN_ROOT / "schemas" / "manifest.schema.json", PLUGIN_ROOT / "schemas" / "graph.schema.json", PLUGIN_ROOT / "schemas" / "report.schema.json", diff --git a/plugins/incident-response/incident-response-sandbox/com.sodejm.copse/prerequisites.json b/plugins/incident-response/incident-response-sandbox/org.cops/prerequisites.json similarity index 100% rename from plugins/incident-response/incident-response-sandbox/com.sodejm.copse/prerequisites.json rename to plugins/incident-response/incident-response-sandbox/org.cops/prerequisites.json diff --git a/plugins/incident-response/incident-response-sandbox/plugin.json b/plugins/incident-response/incident-response-sandbox/plugin.json index ec4fb23..b18b348 100644 --- a/plugins/incident-response/incident-response-sandbox/plugin.json +++ b/plugins/incident-response/incident-response-sandbox/plugin.json @@ -9,6 +9,6 @@ "keywords": ["cybersecurity", "incident-response", "sandbox", "offline"], "extensions": { "com.openai": {"displayName": "COPS Incident Response Sandbox", "category": "Developer Tools"}, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/logging-telemetry/security-logging-advisor/com.sodejm.copse/prerequisites.json b/plugins/logging-telemetry/security-logging-advisor/org.cops/prerequisites.json similarity index 100% rename from plugins/logging-telemetry/security-logging-advisor/com.sodejm.copse/prerequisites.json rename to plugins/logging-telemetry/security-logging-advisor/org.cops/prerequisites.json diff --git a/plugins/logging-telemetry/security-logging-advisor/plugin.json b/plugins/logging-telemetry/security-logging-advisor/plugin.json index 31f2f8f..4f2ea82 100644 --- a/plugins/logging-telemetry/security-logging-advisor/plugin.json +++ b/plugins/logging-telemetry/security-logging-advisor/plugin.json @@ -20,6 +20,6 @@ "displayName": "COPS Security Logging Advisor", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/logging-telemetry/telemetry-proof-pack/com.sodejm.copse/prerequisites.json b/plugins/logging-telemetry/telemetry-proof-pack/org.cops/prerequisites.json similarity index 100% rename from plugins/logging-telemetry/telemetry-proof-pack/com.sodejm.copse/prerequisites.json rename to plugins/logging-telemetry/telemetry-proof-pack/org.cops/prerequisites.json diff --git a/plugins/logging-telemetry/telemetry-proof-pack/plugin.json b/plugins/logging-telemetry/telemetry-proof-pack/plugin.json index 6a4ff8c..d464f8a 100644 --- a/plugins/logging-telemetry/telemetry-proof-pack/plugin.json +++ b/plugins/logging-telemetry/telemetry-proof-pack/plugin.json @@ -26,6 +26,6 @@ "displayName": "COPS Telemetry-to-Detection Proof Pack", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/logging-telemetry/telemetry-proof-pack/scripts/validate_package.py b/plugins/logging-telemetry/telemetry-proof-pack/scripts/validate_package.py index 3d666e2..40b8fd5 100644 --- a/plugins/logging-telemetry/telemetry-proof-pack/scripts/validate_package.py +++ b/plugins/logging-telemetry/telemetry-proof-pack/scripts/validate_package.py @@ -27,7 +27,7 @@ def validate() -> int: PLUGIN_ROOT / "plugin.json", PLUGIN_ROOT / ".claude-plugin" / "plugin.json", PLUGIN_ROOT / ".codex-plugin" / "plugin.json", - PLUGIN_ROOT / "com.sodejm.copse" / "prerequisites.json", + PLUGIN_ROOT / "org.cops" / "prerequisites.json", PLUGIN_ROOT / "schemas" / "manifest.schema.json", PLUGIN_ROOT / "schemas" / "proof.schema.json", PLUGIN_ROOT / "schemas" / "report.schema.json", diff --git a/plugins/offensive-security/attack-surface-planner/com.sodejm.copse/prerequisites.json b/plugins/offensive-security/attack-surface-planner/org.cops/prerequisites.json similarity index 100% rename from plugins/offensive-security/attack-surface-planner/com.sodejm.copse/prerequisites.json rename to plugins/offensive-security/attack-surface-planner/org.cops/prerequisites.json diff --git a/plugins/offensive-security/attack-surface-planner/plugin.json b/plugins/offensive-security/attack-surface-planner/plugin.json index ecf7c38..45d9b98 100644 --- a/plugins/offensive-security/attack-surface-planner/plugin.json +++ b/plugins/offensive-security/attack-surface-planner/plugin.json @@ -9,6 +9,6 @@ "keywords": ["cybersecurity", "offensive-security", "attack-surface", "offline-planning"], "extensions": { "com.openai": {"displayName": "COPS Attack Surface Planner", "category": "Developer Tools"}, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/offensive-security/foundry-agent-harness/README.md b/plugins/offensive-security/foundry-agent-harness/README.md index 674ce93..c0d3b47 100644 --- a/plugins/offensive-security/foundry-agent-harness/README.md +++ b/plugins/offensive-security/foundry-agent-harness/README.md @@ -73,7 +73,7 @@ The harness includes 6 pre-built scenarios covering the major attack vectors aga foundry-agent-harness/ ├── .claude-plugin/plugin.json # Claude marketplace manifest ├── .codex-plugin/plugin.json # Codex marketplace manifest -├── com.sodejm.copse/prerequisites.json # Copilot Studio runtime configuration +├── org.cops/prerequisites.json # Copilot Studio runtime configuration ├── package.json # Canonical plugin package descriptor ├── plugin.json # Universal plugin manifest ├── README.md # Overview, design principles, and guide diff --git a/plugins/offensive-security/foundry-agent-harness/com.sodejm.copse/prerequisites.json b/plugins/offensive-security/foundry-agent-harness/org.cops/prerequisites.json similarity index 100% rename from plugins/offensive-security/foundry-agent-harness/com.sodejm.copse/prerequisites.json rename to plugins/offensive-security/foundry-agent-harness/org.cops/prerequisites.json diff --git a/plugins/offensive-security/foundry-agent-harness/plugin.json b/plugins/offensive-security/foundry-agent-harness/plugin.json index b0da1b1..4169615 100644 --- a/plugins/offensive-security/foundry-agent-harness/plugin.json +++ b/plugins/offensive-security/foundry-agent-harness/plugin.json @@ -25,6 +25,6 @@ "displayName": "COPS Microsoft Foundry Adversarial Agent Review Harness", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/offensive-security/foundry-agent-harness/scripts/validate_package.py b/plugins/offensive-security/foundry-agent-harness/scripts/validate_package.py index e1555a1..8c47665 100644 --- a/plugins/offensive-security/foundry-agent-harness/scripts/validate_package.py +++ b/plugins/offensive-security/foundry-agent-harness/scripts/validate_package.py @@ -30,7 +30,7 @@ def validate() -> int: PLUGIN_ROOT / "plugin.json", PLUGIN_ROOT / ".claude-plugin" / "plugin.json", PLUGIN_ROOT / ".codex-plugin" / "plugin.json", - PLUGIN_ROOT / "com.sodejm.copse" / "prerequisites.json", + PLUGIN_ROOT / "org.cops" / "prerequisites.json", PLUGIN_ROOT / "schemas" / "scenario.schema.json", PLUGIN_ROOT / "schemas" / "report.schema.json", ] diff --git a/plugins/vulnerability-management/exposure-triage-workbench/README.md b/plugins/vulnerability-management/exposure-triage-workbench/README.md index 50aae28..8f85a64 100644 --- a/plugins/vulnerability-management/exposure-triage-workbench/README.md +++ b/plugins/vulnerability-management/exposure-triage-workbench/README.md @@ -46,7 +46,7 @@ flowchart LR exposure-triage-workbench/ ├── .claude-plugin/plugin.json # Claude marketplace manifest ├── .codex-plugin/plugin.json # Codex marketplace manifest -├── com.sodejm.copse/prerequisites.json # Copilot Studio runtime prerequisites +├── org.cops/prerequisites.json # Copilot Studio runtime prerequisites ├── package.json # Canonical package descriptor ├── plugin.json # Universal plugin manifest ├── README.md # Primary overview and usage documentation diff --git a/plugins/vulnerability-management/exposure-triage-workbench/com.sodejm.copse/prerequisites.json b/plugins/vulnerability-management/exposure-triage-workbench/org.cops/prerequisites.json similarity index 100% rename from plugins/vulnerability-management/exposure-triage-workbench/com.sodejm.copse/prerequisites.json rename to plugins/vulnerability-management/exposure-triage-workbench/org.cops/prerequisites.json diff --git a/plugins/vulnerability-management/exposure-triage-workbench/plugin.json b/plugins/vulnerability-management/exposure-triage-workbench/plugin.json index 3214643..664d257 100644 --- a/plugins/vulnerability-management/exposure-triage-workbench/plugin.json +++ b/plugins/vulnerability-management/exposure-triage-workbench/plugin.json @@ -22,6 +22,6 @@ "displayName": "COPS Exposure Triage Workbench", "category": "Developer Tools" }, - "com.sodejm.copse": {} + "org.cops": {} } } diff --git a/plugins/vulnerability-management/exposure-triage-workbench/scripts/validate_package.py b/plugins/vulnerability-management/exposure-triage-workbench/scripts/validate_package.py index a53da93..69d70ce 100644 --- a/plugins/vulnerability-management/exposure-triage-workbench/scripts/validate_package.py +++ b/plugins/vulnerability-management/exposure-triage-workbench/scripts/validate_package.py @@ -27,7 +27,7 @@ def validate() -> int: PLUGIN_ROOT / "plugin.json", PLUGIN_ROOT / ".claude-plugin" / "plugin.json", PLUGIN_ROOT / ".codex-plugin" / "plugin.json", - PLUGIN_ROOT / "com.sodejm.copse" / "prerequisites.json", + PLUGIN_ROOT / "org.cops" / "prerequisites.json", PLUGIN_ROOT / "schemas" / "triage-input.schema.json", PLUGIN_ROOT / "schemas" / "triage-report.schema.json", ] diff --git a/plugins/vulnerability-management/patch-security-review/com.sodejm.copse/prerequisites.json b/plugins/vulnerability-management/patch-security-review/org.cops/prerequisites.json similarity index 100% rename from plugins/vulnerability-management/patch-security-review/com.sodejm.copse/prerequisites.json rename to plugins/vulnerability-management/patch-security-review/org.cops/prerequisites.json diff --git a/plugins/vulnerability-management/patch-security-review/plugin.json b/plugins/vulnerability-management/patch-security-review/plugin.json index 16c9380..b9bc41c 100644 --- a/plugins/vulnerability-management/patch-security-review/plugin.json +++ b/plugins/vulnerability-management/patch-security-review/plugin.json @@ -7,5 +7,5 @@ "repository": "https://github.com/sodejm/copilot-operation-plugin-for-security", "license": "PolyForm-Noncommercial-1.0.0", "keywords": ["patch-review", "vulnerability-management", "appsec"], - "extensions": {"com.openai": {"displayName": "COPS Patch Security Review", "category": "Developer Tools"}, "com.sodejm.copse": {}} + "extensions": {"com.openai": {"displayName": "COPS Patch Security Review", "category": "Developer Tools"}, "org.cops": {}} } diff --git a/scripts/agent/install_prerequisites.py b/scripts/agent/install_prerequisites.py index a87a402..6d3cf8e 100644 --- a/scripts/agent/install_prerequisites.py +++ b/scripts/agent/install_prerequisites.py @@ -34,7 +34,7 @@ def main() -> int: raise PrerequisiteError(f"unknown plugin: {args.plugin}") selected: list[tuple[str, list[dict]]] = [] for record in records: - location = f"{record.path}/com.sodejm.copse/prerequisites.json" + location = f"{record.path}/org.cops/prerequisites.json" document = load_json(ROOT / location, ROOT) tools = validate_prerequisites(document, location) selected.append((record.id, tools)) diff --git a/specs/marketplace-portability.spec.md b/specs/marketplace-portability.spec.md index 3185a3e..91dca4c 100644 --- a/specs/marketplace-portability.spec.md +++ b/specs/marketplace-portability.spec.md @@ -34,8 +34,8 @@ delivery state. - New package-root entries must be classified as portable or source-only before export; unreviewed entries fail validation. An optional `mcp.json` is retained and checked against the v1 configuration contract. -- Each package declares tool prerequisites in - `com.sodejm.copse/prerequisites.json`. Installation +- Each package declares COPS-specific manifest data under `extensions["org.cops"]` + and tool prerequisites in `org.cops/prerequisites.json`. Installation is a separate, explicit command and never runs during discovery or validation. - Package descriptions state only capabilities present in the distributed package. Development-only or pending integrations remain explicit. diff --git a/tests/step_defs/test_marketplace_contract.py b/tests/step_defs/test_marketplace_contract.py index 0ef194f..105192a 100644 --- a/tests/step_defs/test_marketplace_contract.py +++ b/tests/step_defs/test_marketplace_contract.py @@ -64,7 +64,7 @@ def host_package(context, tmp_path): (source / "plugin.json").write_text(json.dumps({ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "fixture-plugin", - "extensions": {"com.sodejm.copse": {}}, + "extensions": {"org.cops": {}}, }), encoding="utf-8") skill = source / "skills" / "fixture-skill" skill.mkdir(parents=True) @@ -72,7 +72,7 @@ def host_package(context, tmp_path): "---\nname: fixture-skill\ndescription: Fixture skill.\n---\n\nRun a check.\n", encoding="utf-8", ) - namespace = source / "com.sodejm.copse" + namespace = source / "org.cops" namespace.mkdir() (namespace / "prerequisites.json").write_text( '{"schema_version":"1.0","tools":[]}', encoding="utf-8" @@ -174,7 +174,7 @@ def prerequisites_rejected(context): def portable_content(context): destination = context["destination"] assert (destination / "skills/fixture-skill/SKILL.md").is_file() - assert (destination / "com.sodejm.copse/prerequisites.json").is_file() + assert (destination / "org.cops/prerequisites.json").is_file() @then("the portable package excludes native host files")