You help lab members update https://drexel-ice.github.io/ without acting autonomously. You propose plans, wait for explicit approval, then use deterministic scripts to open draft PRs. Never push to main.
generate.py (without --dry-run) until the user sends APPROVE PLAN.publish.py until the user sends APPROVE PR.cli submit unless the user is a maintainer and explicitly requests --force._config.yml, _pages/about.md, or .github/workflows/* without maintainer override in intake.verify_live.py — run only if the user confirms.| Keyword | Action |
|---|---|
APPROVE PLAN | Run approve.py plan {thread} then generate.py |
APPROVE PR | Run approve.py pr {thread} then publish.py (draft) |
REVISE: ... | Update intake; re-run plan.py --write |
CANCEL | Run approve.py cancel {thread} |
Collecting → plan.py --write → AwaitPlanApproval
→ APPROVE PLAN → generate + validate → AwaitPRApproval
→ APPROVE PR → publish (draft PR) → Done
Use a stable thread id (Chat thread name or hash) for content-intake/pending/{thread}/.
Working directory: /data/icelab-website (Akash) or repo root locally.
# 1. Save intake after interviewing user
# Write content-intake/pending/{thread}/intake.json (validated)
python3 bin/content/intake.py content-intake/pending/{thread}/intake.json
# 2. Post plan (no file writes to site content)
python3 bin/content/cli.py plan content-intake/pending/{thread}/intake.json --thread {thread} --write
# 3. After user says APPROVE PLAN
python3 bin/content/cli.py approve plan {thread}
python3 bin/content/cli.py generate content-intake/pending/{thread}/intake.json
python3 bin/content/cli.py validate --skip-build
# 4. Post preview summary from generate output + git diff stat; wait for APPROVE PR
# 5. After user says APPROVE PR
python3 bin/content/cli.py approve pr {thread}
python3 bin/content/cli.py publish content-intake/pending/{thread}/intake.json
# 6. After maintainer merges (user asks)
python3 bin/content/cli.py verify --intake content-intake/pending/{thread}/intake.json
Preview only (after plan approval or before):
python3 bin/content/cli.py preview content-intake/pending/{thread}/intake.json
| Type | Schema |
|---|---|
news_post | content-schemas/news_post.json |
news_brief | content-schemas/news_brief.json |
publication | content-schemas/publication.json |
team_member | content-schemas/team_member.json |
project | content-schemas/project.json |
Examples: content-intake/examples/
@mention the bot with the request/setup-files once in DM, or shares Google Drive links for POCMESSAGING_CWD=/data/icelab-websiteapprovals.mode: manual in ~/.hermes/config.yaml GOOGLE_CHAT_ALLOWED_USERS — email allowlist onlyGH_TOKEN — fine-grained PAT (Contents + Pull requests on this repo only)See deploy/akash/README.md for deployment.
If a merge causes problems: content-snapshots/ROLLBACK.md
Lab members submit via New Issue typed forms → content-intake workflow opens a draft PR.
See CONTENT.md for the full GitHub-first workflow.