A Codex skill for reading, searching, exporting, creating, editing, replying to, resolving, and deleting Ed Discussion forum threads and comments through your saved browser session.
This is the generic version (course-agnostic). It is the same skill that powers
cs6300-forum for GT's CS6300 - just without the course id baked in.
SKILL.md- the skill instructions Codex readsscripts/ed_forum_ops.py- the Python wrapper around Ed's APIreferences/endpoints.md- the Ed API referenceagents/openai.yaml- the skill manifest
No third-party Python dependencies. Stdlib only.
The fastest path is the bundled skill-installer skill:
# In a Codex session
$skill-installer github.com/bmendonca3/ed-forum-ops-skill
Manual install (no Codex CLI):
mkdir -p ~/.codex/skills
git clone https://github.com/bmendonca3/ed-forum-ops-skill.git \
~/.codex/skills/ed-forum-opsThe skill authenticates as you by reusing a saved Ed login session. Generate it
once with playwright:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context()
page = context.new_page()
page.goto("https://edstem.org/us/login")
# ... complete SSO/email login, then:
context.storage_state(path="storage_state.json")
browser.close()Then move the file into place:
mkdir -p ~/.edstem-handsfree
mv storage_state.json ~/.edstem-handsfree/storage_state.json
chmod 600 ~/.edstem-handsfree/storage_state.jsonThe session token is what authenticates you - keep this file private.
python3 ~/.codex/skills/ed-forum-ops/scripts/ed_forum_ops.py \
list-threads --course-id YOUR_COURSE_ID --sort newOther commands: get-thread, create-thread, edit-thread, delete-thread,
add-comment, edit-comment, delete-comment, reply, accept, unaccept,
star, watch, vote, search.
Run python3 ... ed_forum_ops.py --help for the full surface.
Tip: try commands on a test thread first. The skill supports direct Ed API operations, so a wrong target id can post, edit, or delete real content.
Open Ed in your browser and navigate to the course. The URL looks like:
https://edstem.org/us/courses/COURSE_ID/...
The COURSE_ID segment is what you pass as --course-id.
- "storage state not found" - the path is
~/.edstem-handsfree/storage_state.json. Re-run the playwright snippet above. - 401 / redirected to login - your session expired. Refresh
storage_state.json. - Course id rejected - double-check the URL segment and that you are a member of that course.
Built by bmendonca3. Inspired by the cs6300-forum skill for GT CS6300.