run-newsroom
Run, drive, test and screenshot the newsroom mods (prose-lint) inside a real Claude Code session.
Skill by andrezzoid
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/andrezzoid-run-newsroom
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: testing, writing, agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/run-newsroom
What's inside
- Skill name
run-newsroom- Description
- Run, drive, test and screenshot the newsroom mods (prose-lint) inside a real Claude Code session. Use when asked to run or start prose-lint, see its alerts under a Write or Edit, check the strikethrough of fixed alerts, run /prose-lint or /prose-lint stats, or confirm a change to mods/prose-lint works in the real app, beyond the tests.
- License
- MIT
- Instructions
- 137 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (20)
- SKILL.md
- driver.py
- LICENSE · vendor/pyte/
- __init__.py · vendor/pyte/
- __main__.py · vendor/pyte/
- charsets.py · vendor/pyte/
- control.py · vendor/pyte/
- escape.py · vendor/pyte/
- graphics.py · vendor/pyte/
- modes.py · vendor/pyte/
- py.typed · vendor/pyte/
- screens.py · vendor/pyte/
- streams.py · vendor/pyte/
- LICENSE · vendor/wcwidth/
- __init__.py · vendor/wcwidth/
- table_vs16.py · vendor/wcwidth/
- table_wide.py · vendor/wcwidth/
- table_zero.py · vendor/wcwidth/
- unicode_versions.py · vendor/wcwidth/
- wcwidth.py · vendor/wcwidth/
SKILL.md (first lines)
newsroom is a Claude Code plugin marketplace. Its one mod, prose-lint, runs
inside Claude Code, so "running the app" means starting `claude` with
`--plugin-dir mods/prose-lint`. Use one of two handles: `claude -p` for the
slash commands and for the note Claude reads after a Write, or
`.claude/skills/run-newsroom/driver.py` for the transcript row the terminal
draws under the diff. Paths are relative to the repo root.
## Prerequisites
Vale on `PATH` (3.24.0 verified) and `claude` logged in (v2.1.295 verified).
The driver runs on any `python3`: its pyte and wcwidth sit in `vendor/`.
## Run (agent path): headless, for the commands and Claude's note
Every run loads this checkout's prose-lint in place of any installed copy.
Work in a scratch folder, so the mod reads no `.vale.ini` from this repo:
```bash
REPO=$(git rev-parse --show-toplevel)
mkdir -p "$TMPDIR/pl" && cd "$TMPDIR/pl"
printf 'This tool really serves as a bridge \xe2\x80\x94 it is crucial.\n' > sample.md
claude -p --plugin-dir "$REPO/mods/prose-lint" "/prose-lint sample.md"
claude -p --plugin-dir "$REPO/mods/prose-lint" "/prose-lint stats"
```
The first prints `prose-lint · 4 alerts in 1 file · bundled rules` and one
`line:col Rule: message` per alert. Neither costs a model turn.
The Write and Edit hooks need a turn. The note they hand Claude never shows in
stream-json, so ask Claude to quote it; the toast does show, as `ui_toast`:
```bash
cd "$TMPDIR/pl" && rm -f draft.md
claude -p --plugin-dir "$REPO/mods/prose-lint" --model haiku --permission-mode acceptEdits \
--output-format stream-json --verbose \
"Use the Write tool to create draft.md with exactly this content: This tool really serves as a bridge — it is crucial.
Then do not edit anything. Reply with every note you received about draft.md after the Write, quoted verbatim inside a code block, or NO NOTE if there was none." \
| jq -r 'select(.subtype == "ui_toast" or .type == "result") | .text // .result'
```
Expect `prose-lint: 4 alerts in draft.md`, then the note: `Vale (bundled
rules)`, the dash under `Must fix:`, the other three under `Fix, or tell the
user why not:`.
## Run (agent path): the terminal transcript row
`driver.py` starts an interactive `claude` in a pseudo-terminal, plays scripted
steps, and saves each screen as text. This run writes a draft with four alerts,
then fixes the dash so the turn's end strikes it out:
```bash
python3 .claude/skills/run-newsroom/driver.py \
--cwd /tmp/pl-tui --claude-args "--model haiku --permission-mode acceptEdits" \
--timeout 30 --wait "trust this folder" --idle 1 --keys Down --keys Enter --idle 3 --shot ready \
--timeout 180 \
--send "Use the Write tool to create draft.md with exactly this content: This tool really serves as a bridge — it is crucial. Then stop." \
--wait "prose-lint ·" --idle 4 --shot write \
--send "Use the Edit tool to replace only the dash in draft.md with a comma, then stop." \
--wait "fixed" --idle 4 --shot fixed
```
Shots land in `<cwd>/shots/`: `NAME.txt` to read, `NAME.ansi` to `cat` in a
terminal, `raw.log` with every byte. In `NAME.txt` a marker line under a drawn
line puts the underline's colour initial under each underlined cell (`r`
error, `y` warning, `b` suggestion) and `-` under struck-through ones.
`fixed.txt` shows:
```text
prose-lint · 4 alerts · 1 fixed · bundled rules
1 │ This tool really serves as a bridge — it is crucial.
bbbbbb bbbbbbbbbbb - yyyyy
```
| step | does |
|---|---|
| `--send TEXT` | types TEXT, then Enter |
| `--keys NAME` | Enter, Escape, Up, Down, Tab, CtrlC |
| `--wait REGEX` | waits for the screen to match; on timeout writes `timeout.txt` and exits 1 |
| `--idle SECS` | waits until the screen stops changing |
| `--shot NAME` | saves the screen |
| `--timeout SECS` | timeout for the waits after it |
## Run (human path)
```bash
claude --plugin-dir mods/prose-lint
```
Then ask Claude to write some prose. Ctrl-C twice to quit.
## Test
```bash
claude plugin validate .
claude plugin test mods/prose-lint
```
Both pass: validate warns that `plugin.json` has no `version`.
## Gotchas
- **Claude Code's sandbox denies `openpty()`**, so the driver runs outside it:
`.claude/settings.json` excludes `python3 .claude/skills/run-newsroom/driver.py *`.
The exclusion matches only a call that starts with that text, verbatim, and
chains nothing: no `cd`, pipe or redirect, or the call stays sandboxed and
fails with `out of pty devices`. Outside the sandbox `$TMPDIR` is macOS's own
`/var/folders/…/T/`, not the sandbox's, so give `--cwd` a literal `/tmp/…`
path and the shots land where you look for them. The headless path works in
the sandbox once it allows `api.anthropic.com`.
- **`--plugin-dir` keeps its own stats.** It stores them in
`~/.claude/plugins/store/prose-lint_inline-<hash>.json`, keyed by the
folder's name, apart from the installed copy's store, so test runs never
count in your `/prose-lint stats`. Inside the sandbox it stores none: the
write fails and the mod drops the failure.
- **The trust dialog defaults to "No, exit".** A fresh folder opens on it, and
Enter alone quits; the driver shows `claude exited` right after the first
`--send`. Press Down first.
- **Fixed alerts strike out at the turn's end**, not after the Edit. Wait forFrom andrezzoid/newsroom, MIT.
More from andrezzoid/newsroom
- 0.570score
principle-deep-module-design
andrezzoid
Design modules with simple interfaces and rich implementations.
SkillAFreshness: AClaude Code +9 - 0.570score
principle-comments-as-design
andrezzoid
Use comments as a design tool to capture abstractions, intent, and decisions code can't express.
SkillAFreshness: AClaude Code +9 - 0.570score
complexity-red-flags
andrezzoid
Detect and fix complexity creep: shallow modules, information leakage, pass-through methods/variables, temporal decomposition, conjoined methods…
SkillAFreshness: AClaude Code +9 - 0.566score
langfuse
andrezzoid
Interact with Langfuse and access its documentation: tracing, monitoring, creating datasets, running experiments, and evaluating AI applications.
SkillAFreshness: AClaude Code +9 - 0.565score
implement
andrezzoid
Implement a plan: a ticket (ENG-123 in Linear, owner/repo#12 or #12 in GitHub Issues), a spec file, or what this conversation settled.
SkillAFreshness: AClaude Code +9 - 0.564score
linear-cli
andrezzoid
Manage Linear issues from the command line using the linear cli.
SkillAFreshness: AClaude Code +9 - 0.561score
poke-holes
andrezzoid
Poke holes in a plan or a solution before anyone builds on it.
SkillAFreshness: AClaude Code +9 - 0.556score
babysit-pr
andrezzoid
Keep a pull request mergeable until it merges or closes, as a senior engineer would.
SkillAFreshness: AClaude Code +9 - 0.539score
domain-modeling
andrezzoid
Build and sharpen a project's domain model.
SkillAFreshness: AClaude Code +9 - 0.539score
codebase-design
andrezzoid
Shared vocabulary for designing deep modules.
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 14
- Last commit (this folder)
- Oct 21, 2026 (7 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/andrezzoid/newsroom
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from andrezzoid
- 0.570score
principle-deep-module-design
andrezzoid
Design modules with simple interfaces and rich implementations.
SkillAFreshness: AClaude Code +9 - 0.570score
principle-comments-as-design
andrezzoid
Use comments as a design tool to capture abstractions, intent, and decisions code can't express.
SkillAFreshness: AClaude Code +9 - 0.570score
complexity-red-flags
andrezzoid
Detect and fix complexity creep: shallow modules, information leakage, pass-through methods/variables, temporal decomposition, conjoined methods…
SkillAFreshness: AClaude Code +9 - 0.566score
langfuse
andrezzoid
Interact with Langfuse and access its documentation: tracing, monitoring, creating datasets, running experiments, and evaluating AI applications.
SkillAFreshness: AClaude Code +9 - 0.565score
implement
andrezzoid
Implement a plan: a ticket (ENG-123 in Linear, owner/repo#12 or #12 in GitHub Issues), a spec file, or what this conversation settled.
SkillAFreshness: AClaude Code +9 - 0.564score
linear-cli
andrezzoid
Manage Linear issues from the command line using the linear cli.
SkillAFreshness: AClaude Code +9
Cite this page
run-newsroom skill. Agent Mart. https://agentmart.dev/skills/andrezzoid-run-newsroom (last updated 2026-10-24)