Rebrand as Auto Research and add Codex plugin support#3
Conversation
There was a problem hiding this comment.
Pull request overview
This PR rebrands the project as Auto Research, introduces a root-centered Codex skill bundle with a mirrored plugins/codex-autoresearch distribution, and adds sync/validation tooling + tests to keep Claude and Codex packaging aligned.
Changes:
- Rebrand docs/metadata (wiki, SECURITY/CONTRIBUTING/CHANGELOG, architecture) to “Auto Research” and
Maleick/AutoResearch. - Add Codex plugin distribution: root bundle (
SKILL.md,agents/,references/,scripts/) mirrored intoplugins/codex-autoresearch/skills/codex-autoresearch/. - Add packaging validation scripts and pytest coverage for distribution parity + dual results-log compatibility.
Reviewed changes
Copilot reviewed 95 out of 97 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| wiki/Safety.md | Rewrite safety page to point at root Codex contract and Claude compatibility surface. |
| wiki/Installation.md | Update installation instructions for Claude and add Codex local marketplace flow. |
| wiki/Home.md | Rebrand wiki home and update navigation/positioning. |
| wiki/Contributing.md | Update contributing workflow around root bundle + packaging checks. |
| wiki/Configuration.md | Update configuration docs and document dual results-log compatibility. |
| wiki/Commands.md | Document Claude /autoresearch* compatibility surface + Codex entrypoints. |
| tests/test_results_compatibility.py | Add test asserting research-results.tsv and autoresearch-results.tsv stay in sync. |
| tests/test_plugin_distribution.py | Add tests for sync mirroring and distribution validator against a minimal repo. |
| scripts/sync_plugin_payload.py | New sync tool to mirror root bundle into packaged Codex plugin payload. |
| scripts/run_contributor_gate.py | New contributor gate runner (sync check, distribution validation, tests, optional smoke). |
| scripts/hook_stop.py | New stop-hook logic for managed runs (continuation + archive readiness guard). |
| scripts/hook_start.py | New session-start hook emitting a managed-run checklist. |
| scripts/hook_context.py | New hook runtime pointer persistence with atomic writes and repo-relative paths. |
| scripts/check_plugin_distribution.py | New validator ensuring plugin manifest/marketplace metadata + mirrored file parity. |
| scripts/bootstrap_local_plugin.py | New installer for machine-local marketplace entry + installed bundle copy. |
| scripts/autoresearch_wizard.py | New CLI wrapper to generate setup summary/questions via helpers. |
| scripts/autoresearch_supervisor_status.py | New CLI wrapper for supervisor snapshot computation. |
| scripts/autoresearch_subagent_plan.py | New tool emitting a stable JSON plan for a standing subagent pool. |
| scripts/autoresearch_runtime_ctl.py | New CLI for background run artifacts (launch/status/stop/resume/complete). |
| scripts/autoresearch_record_iteration.py | New CLI to append an iteration result to the TSV log(s). |
| scripts/autoresearch_init_run.py | New CLI to initialize state/results artifacts and update hook context pointer. |
| scripts/autoresearch_complete_run.py | New CLI to complete a foreground run and write post-run artifacts. |
| scripts/init.py | Mark scripts as a package to support test imports. |
| references/subagent-orchestration.md | New root reference for standing subagent orchestration model. |
| references/structured-output-spec.md | New root reference defining setup/iteration/completion output phases. |
| references/state-management.md | New root reference specifying autoresearch-state.json semantics. |
| references/ship-workflow.md | New root workflow reference for shipping/readiness. |
| references/security-workflow.md | New root workflow reference for security pass. |
| references/scenario-workflow.md | New root workflow reference for scenario expansion. |
| references/runtime-hard-invariants.md | New root reference for re-anchoring invariants. |
| references/results-logging.md | New root reference defining TSV schema + dual-log rule. |
| references/predict-workflow.md | New root workflow reference for pre-mortem/design critique. |
| references/plan-workflow.md | New root workflow reference for wizard/setup flow. |
| references/loop-workflow.md | New root workflow reference for setup/iterate/decide loop. |
| references/learn-workflow.md | New root workflow reference for documentation loop. |
| references/interaction-wizard.md | New root contract for interactive launch approval + minimal questions. |
| references/fix-workflow.md | New root workflow reference for fix loop. |
| references/debug-workflow.md | New root workflow reference for debug loop. |
| references/core-principles.md | New root principles + artifact discipline reference. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/sync_plugin_payload.py | Mirrored sync tool inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/run_contributor_gate.py | Mirrored contributor gate runner inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/hook_stop.py | Mirrored stop hook inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/hook_start.py | Mirrored start hook inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/hook_context.py | Mirrored hook context pointer logic inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/check_plugin_distribution.py | Mirrored distribution validator inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/bootstrap_local_plugin.py | Mirrored local installer inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_wizard.py | Mirrored wizard CLI inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_supervisor_status.py | Mirrored supervisor CLI inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_subagent_plan.py | Mirrored subagent plan tool inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_runtime_ctl.py | Mirrored runtime ctl inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_record_iteration.py | Mirrored record-iteration CLI inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_init_run.py | Mirrored init-run CLI inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/autoresearch_complete_run.py | Mirrored complete-run CLI inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/scripts/init.py | Mirrored package marker inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/subagent-orchestration.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/structured-output-spec.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/state-management.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/ship-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/security-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/scenario-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/runtime-hard-invariants.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/results-logging.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/predict-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/plan-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/loop-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/learn-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/interaction-wizard.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/fix-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/debug-workflow.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/references/core-principles.md | Mirrored reference inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/agents/openai.yaml | Mirrored agent interface metadata inside packaged Codex payload. |
| plugins/codex-autoresearch/skills/codex-autoresearch/SKILL.md | Packaged Codex SKILL entrypoint describing activation contract + distribution rules. |
| plugins/codex-autoresearch/.codex-plugin/plugin.json | Add Codex plugin manifest for codex-autoresearch v3.0.0. |
| plugins/autoresearch/skills/autoresearch/SKILL.md | Reframe Claude skill as compatibility wrapper (“Auto Research Claude Wrapper”). |
| plugins/autoresearch/.claude-plugin/plugin.json | Bump Claude plugin version to 3.0.0 and update repo/description. |
| feature-list.json | Add feature tracking for rebrand + cross-platform rewrite acceptance tests. |
| docs/autoresearch-loop.svg | Update hero copy to “Cross-platform autonomous iteration engine”. |
| docs/ARCHITECTURE.md | Rewrite architecture doc for root bundle + dual distribution surfaces + validation model. |
| agents/openai.yaml | Add root agent interface metadata for Codex positioning. |
| VERSION | Bump version to 3.0.0. |
| SKILL.md | Add root Codex-facing SKILL entrypoint. |
| SECURITY.md | Update security/safety documentation for cross-platform model and new repo URL. |
| CONTRIBUTING.md | Rewrite contributor docs around root bundle + distribution validation workflow. |
| CHANGELOG.md | Add 3.0.0 release notes and keep prior 2.x history. |
| .gitignore | Add new runtime artifacts and Python cache ignores. |
| .github/workflows/validate.yml | Update CI validation: Python setup, sync/validation scripts, new tests, doc hygiene checks. |
| .github/workflows/release.yml | Rename release title to “Auto Research …”. |
| .claude-plugin/marketplace.json | Rebrand marketplace metadata and bump version to 3.0.0. |
| .agents/plugins/marketplace.json | Add repo-local Codex marketplace manifest referencing local plugin path. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - name: Check for absolute local paths in docs | ||
| run: | | ||
| ERRORS=0 | ||
| # autoresearch.md (root command) takes free-form input — no argument-hint required. | ||
| # Sub-commands in commands/autoresearch/*.md do require argument-hint. | ||
| for f in plugins/autoresearch/commands/autoresearch/*.md plugins/autoresearch/commands/autoresearch.md; do | ||
| [ -f "$f" ] || continue | ||
| if ! grep -qP '^name:' "$f"; then | ||
| echo "ERROR: $f missing 'name:'" | ||
| ERRORS=$((ERRORS+1)) | ||
| fi | ||
| if ! grep -qP '^description:' "$f"; then | ||
| echo "ERROR: $f missing 'description:'" | ||
| ERRORS=$((ERRORS+1)) | ||
| fi | ||
| done | ||
| for f in plugins/autoresearch/commands/autoresearch/*.md; do | ||
| [ -f "$f" ] || continue | ||
| if ! grep -qP '^argument-hint:' "$f"; then | ||
| echo "ERROR: $f missing 'argument-hint:'" | ||
| ERRORS=$((ERRORS+1)) | ||
| fi | ||
| done | ||
| if [ "$ERRORS" -gt 0 ]; then | ||
| echo "$ERRORS frontmatter error(s) found" | ||
| exit 1 | ||
| fi | ||
| echo "Frontmatter OK" | ||
| ! rg -n "/Users/|/home/" README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md wiki docs .claude-plugin plugins | ||
|
|
||
| - name: Check workflow cross-references | ||
| id: crossrefs | ||
| continue-on-error: true | ||
| - name: Check for stale public positioning | ||
| run: | | ||
| ERRORS=0 | ||
| for f in plugins/autoresearch/commands/autoresearch/*.md; do | ||
| [ -f "$f" ] || continue | ||
| CMD=$(basename "$f" .md) | ||
| REF="plugins/autoresearch/skills/autoresearch/references/${CMD}-workflow.md" | ||
| if [ ! -f "$REF" ]; then | ||
| echo "ERROR: command $CMD has no matching $REF" | ||
| ERRORS=$((ERRORS+1)) | ||
| fi | ||
| done | ||
| if [ "$ERRORS" -gt 0 ]; then | ||
| echo "$ERRORS cross-reference error(s) found" | ||
| exit 1 | ||
| fi | ||
| echo "Cross-references OK" | ||
| ! rg -n "Claude Code only|Claude-only" README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md wiki docs .claude-plugin plugins | ||
|
|
||
| - name: Fail if any check failed | ||
| if: steps.version.outcome == 'failure' || steps.frontmatter.outcome == 'failure' || steps.crossrefs.outcome == 'failure' | ||
| - name: Check shared content for Claude-local paths | ||
| run: | | ||
| echo "One or more validation checks failed — see step details above" | ||
| exit 1 | ||
| ! rg -n "\.claude/" SKILL.md agents references scripts tests .agents plugins/codex-autoresearch |
There was a problem hiding this comment.
These steps use ! rg ... to assert “no matches”. If rg is missing (exit code 127), the leading ! will invert it to success, silently skipping the intended check. Add an explicit command -v rg (or install ripgrep) and/or set -e so command-not-found fails the job.
| def load_json(path: Path) -> dict[str, Any]: | ||
| try: | ||
| payload = json.loads(path.read_text(encoding="utf-8")) | ||
| except json.JSONDecodeError as exc: | ||
| raise DistributionError(f"Invalid JSON file: {path}") from exc | ||
| if not isinstance(payload, dict): | ||
| raise DistributionError(f"Expected a JSON object in {path}") | ||
| return payload |
There was a problem hiding this comment.
load_json() only catches json.JSONDecodeError; if a required manifest file is missing (e.g. .codex-plugin/plugin.json or the repo marketplace), this will raise an unhandled FileNotFoundError and bypass the script’s normal DistributionError messaging. Catch OSError/FileNotFoundError here and re-raise as DistributionError so validation failures are reported consistently and without a stack trace.
| def resolve_plugin_relative_path(plugin_root: Path, value: str) -> Path: | ||
| rel_path = Path(value) | ||
| if rel_path.is_absolute(): | ||
| raise DistributionError(f"Plugin manifest path must be relative: {value}") | ||
| if value.startswith("./"): | ||
| rel_path = Path(value[2:]) | ||
| return (plugin_root / rel_path).resolve() | ||
|
|
There was a problem hiding this comment.
resolve_plugin_relative_path() resolves paths from the plugin manifest but does not prevent .. traversal (e.g. "../../etc/passwd" would resolve outside plugin_root). This can cause the distribution validator to read/accept files outside the plugin bundle. Enforce that resolved paths stay within plugin_root (e.g., by checking resolved.relative_to(plugin_root)), and raise DistributionError if they escape.
| def relative_files(root: Path, pattern: str) -> list[Path]: | ||
| return sorted(path.relative_to(root) for path in root.glob(pattern) if path.is_file()) | ||
|
|
||
|
|
||
| def ensure_matching_files(source_root: Path, bundled_root: Path, pattern: str) -> list[str]: | ||
| source_files = relative_files(source_root, pattern) | ||
| bundled_files = relative_files(bundled_root, pattern) | ||
| if source_files != bundled_files: | ||
| raise DistributionError( | ||
| f"File mismatch for pattern {pattern!r}: source={source_files}, bundled={bundled_files}" | ||
| ) |
There was a problem hiding this comment.
relative_files() will return an empty list when root doesn’t exist, which means ensure_matching_files() can pass even if required source directories (like agents/, scripts/, references/) are missing. Since these are part of the declared root bundle contract, consider failing fast when source_root (and likely bundled_root) does not exist/is not a directory.
Summary
plugins/codex-autoresearchdistribution while keeping the stable Claude/autoresearch*compatibility surfaceTest Plan
python3 scripts/sync_plugin_payload.py --repo . --checkpython3 scripts/check_plugin_distribution.py --repo .pytest -q tests/test_plugin_distribution.py tests/test_results_compatibility.pyverify