← Files Marketing CouncilARCHIVED FILE
.github/workflows/plugin-ci.yml
4.98 KB · Oct 2, 2026 · 00:31 UTC
name: Plugin CI
on:
push:
branches:
- main
- fix/chatgpt-plugin-discovery-routing
- feat/omni-marketing-skill-packs
pull_request:
branches:
- main
permissions:
contents: read
jobs:
verify:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Discovery version consistency
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_release_version_is_consistent_across_public_manifests -v
- name: Discovery route registry coverage
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_dynamic_router_exists_and_covers_every_focused_skill -v
- name: Discovery main router contract
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_main_skill_declares_dynamic_router_and_safe_fallback -v
- name: Discovery metadata files
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_all_skills_have_openai_metadata_files -v
- name: Discovery implicit invocation policy
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_all_skills_allow_implicit_invocation -v
- name: Discovery explicit default prompts
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_all_skills_have_explicit_default_prompts -v
- name: Discovery renderable labels
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_all_skills_have_renderable_interface_labels -v
- name: Discovery discriminative skill descriptions
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_skill_descriptions_are_discriminative_enough_for_implicit_routing -v
- name: Discovery public skill-count consistency
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_public_surfaces_report_29_total_and_28_focused_skills -v
- name: Discovery CI release coverage
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_plugin_ci_runs_for_main_pushes_and_pull_requests -v
- name: Discovery CI token hardening
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_plugin_ci_uses_read_only_token_without_persisted_credentials -v
- name: Discovery adapter release consistency
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_adapter_docs_reference_current_release_and_skill_inventory -v
- name: Discovery release preflight safety
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_release_preflight_validates_exact_current_archive_in_fresh_directory -v
- name: Discovery release snapshot runbook
run: python -m unittest tests.test_plugin_discovery.PluginDiscoveryTests.test_release_notes_include_resubmission_requirement_for_snapshot_skills -v
- name: Skill router regression tests
run: python -m unittest tests.test_skill_router -v
- name: Dynamic DAG router tests
run: python -m unittest tests.test_dynamic_router -v
- name: Omni full-pack contract tests
run: python -m unittest tests.test_omni_skill_packs -v
- name: Validate submission draft
run: python scripts/validate_submission_pack.py submission/submission-pack.json --json
- name: Validate documentation lifecycle
run: python scripts/validate_documentation.py --json
- name: Run full unit test suite
run: python -m unittest discover -s tests -v
- name: Validate source distribution
run: python scripts/validate_distribution.py . --json
- name: Build host packages
run: python scripts/build_host_packages.py --output-root /tmp/marketing-council-dist
- name: Build OpenAI submission skill bundles
run: python scripts/build_openai_submission_pack.py --output-root /tmp/marketing-council-submission --json
- name: Validate OpenAI plugin package
run: |
rm -rf /tmp/marketing-council-openai
mkdir -p /tmp/marketing-council-openai
python - <<'PY'
import json, pathlib, zipfile
repo = pathlib.Path('.').resolve()
version = json.loads((repo / '.codex-plugin' / 'plugin.json').read_text(encoding='utf-8'))['version']
archive = pathlib.Path('/tmp/marketing-council-dist') / f'marketing-council-openai-plugin-v{version}.zip'
if not archive.is_file():
raise SystemExit(f'missing current release archive: {archive}')
out = pathlib.Path('/tmp/marketing-council-openai')
with zipfile.ZipFile(archive) as zf:
zf.extractall(out)
print(archive)
PY
python scripts/validate_openai_plugin.py /tmp/marketing-council-openai --json
SHA-256: 58fac5d45a9bc31ef17c6010e0a46d48f7169d6dea754c1483dd8b57c3b8390c