zork
Play Zork text adventure via dfrotz. Use /zork <command> to play (e.g., /zork go north), /zork for status, /zork new to restart, /zork setup to configure Obsidian sync.
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install jonathanprozzi-claude-utils-zork
Repository
Skill path: skills/zork
Play Zork text adventure via dfrotz. Use /zork <command> to play (e.g., /zork go north), /zork for status, /zork new to restart, /zork setup to configure Obsidian sync.
Open repositoryBest for
Primary workflow: Ship Full Stack.
Technical facets: Full Stack.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: jonathanprozzi.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install zork into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/jonathanprozzi/claude-utils before adding zork to shared team environments
- Use zork for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: zork
description: Play Zork text adventure via dfrotz. Use /zork <command> to play (e.g., /zork go north), /zork for status, /zork new to restart, /zork setup to configure Obsidian sync.
allowed-tools: Bash, Read, Edit
---
# Zork Interactive Fiction Skill
Play the classic text adventure Zork I via dfrotz, with persistent save state and optional Obsidian integration for capturing learnings.
## Quick Reference
| Command | What it does |
|---------|--------------|
| `/zork look` | Look around current room |
| `/zork go north` | Move north (or any direction) |
| `/zork take lamp` | Pick up an item |
| `/zork inventory` | Check what you're carrying |
| `/zork` | Show current status (look + inventory) |
| `/zork new` | Start a fresh game |
| `/zork setup` | Configure Obsidian vault for sync |
## How to Play
### Execute a single command:
```bash
bash scripts/play.sh "go north"
```
### Check current status:
```bash
bash scripts/status.sh
```
### Start a new game:
```bash
bash scripts/new.sh
```
### Configure Obsidian sync:
```bash
bash scripts/setup.sh /path/to/your/vault
```
## Game State
- **Save file**: `state/claude.sav.qzl` - automatically saved after each command
- **Transcript**: Append-only log of all commands and responses
- **Learnings**: Your observations about the game (update with /zork reflect)
## Obsidian Integration
If configured, transcript and learnings sync to your Obsidian vault as:
- `Claude Plays Zork Transcript.md`
- `Claude Plays Zork Learnings.md`
Run `bash scripts/setup.sh` to see current config or set a vault path.
## Tips
- Classic text adventure verbs: `look`, `examine`, `take`, `drop`, `open`, `close`, `go`, `inventory`
- Directions: `north`, `south`, `east`, `west`, `up`, `down`, `ne`, `nw`, `se`, `sw`
- You can abbreviate: `n` for north, `i` for inventory, `l` for look
- Save happens automatically after each command
## Purpose
This skill helps Claude build experiential intuition about text adventures and parser conventions, informing the design of AI companions in Emergent Quest.
---
## Referenced Files
> The following files are referenced in this skill and included for context.
### scripts/play.sh
```bash
#!/bin/bash
# play.sh - Execute one Zork command and return output
# Usage: ./play.sh "go north"
set -e
# Get script directory and skill root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
GAME="$SKILL_DIR/data/zork1.z3"
SAVE="$SKILL_DIR/state/claude.sav.qzl"
CONFIG="$SKILL_DIR/state/config.json"
CMD="$1"
if [ -z "$CMD" ]; then
echo "Usage: play.sh <command>"
echo "Example: play.sh 'go north'"
exit 1
fi
# Check if game file exists
if [ ! -f "$GAME" ]; then
echo "Error: Game file not found at $GAME"
exit 1
fi
# Function to get transcript path
get_transcript_path() {
if [ -f "$CONFIG" ]; then
VAULT=$(jq -r '.obsidian_vault // empty' "$CONFIG" 2>/dev/null)
if [ -n "$VAULT" ] && [ -d "$VAULT" ]; then
echo "$VAULT/Claude Plays Zork Transcript.md"
return
fi
fi
echo "$SKILL_DIR/state/TRANSCRIPT.md"
}
TRANSCRIPT=$(get_transcript_path)
# Run the command
if [ -f "$SAVE" ]; then
# Load from save, execute command, save (with overwrite), quit
OUTPUT=$(echo -e "$CMD\nsave\n$SAVE\ny\nquit\ny" | dfrotz -m -p -q -L "$SAVE" "$GAME" 2>&1)
else
# New game, execute command, save, quit
OUTPUT=$(echo -e "$CMD\nsave\n$SAVE\nquit\ny" | dfrotz -m -p -q "$GAME" 2>&1)
fi
# Log to transcript
{
echo ""
echo "## $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
echo "> $CMD"
echo ""
echo '```'
echo "$OUTPUT"
echo '```'
} >> "$TRANSCRIPT"
# Output the result
echo "$OUTPUT"
```
### scripts/status.sh
```bash
#!/bin/bash
# status.sh - Show current game status (look + inventory)
# Usage: ./status.sh
set -e
# Get script directory and skill root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
GAME="$SKILL_DIR/data/zork1.z3"
SAVE="$SKILL_DIR/state/claude.sav.qzl"
CONFIG="$SKILL_DIR/state/config.json"
# Check if game file exists
if [ ! -f "$GAME" ]; then
echo "Error: Game file not found at $GAME"
exit 1
fi
# Check if save file exists
if [ ! -f "$SAVE" ]; then
echo "No saved game found. Start a new game with /zork new or just /zork look"
exit 0
fi
# Run look and inventory commands
OUTPUT=$(echo -e "look\ninventory\nquit\ny" | dfrotz -m -p -q -L "$SAVE" "$GAME" 2>&1)
echo "=== Current Status ==="
echo ""
echo "$OUTPUT"
# Show Obsidian config if set
if [ -f "$CONFIG" ]; then
VAULT=$(jq -r '.obsidian_vault // empty' "$CONFIG" 2>/dev/null)
if [ -n "$VAULT" ]; then
echo ""
echo "=== Sync Config ==="
echo "Obsidian vault: $VAULT"
fi
fi
```
### scripts/new.sh
```bash
#!/bin/bash
# new.sh - Start a fresh game (archives current save)
# Usage: ./new.sh
set -e
# Get script directory and skill root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
GAME="$SKILL_DIR/data/zork1.z3"
SAVE="$SKILL_DIR/state/claude.sav.qzl"
CONFIG="$SKILL_DIR/state/config.json"
# Check if game file exists
if [ ! -f "$GAME" ]; then
echo "Error: Game file not found at $GAME"
exit 1
fi
# Archive existing save if present
if [ -f "$SAVE" ]; then
ARCHIVE="$SKILL_DIR/state/claude.sav.$(date '+%Y%m%d-%H%M%S').qzl"
mv "$SAVE" "$ARCHIVE"
echo "Archived previous save to: $ARCHIVE"
fi
# Function to get transcript path
get_transcript_path() {
if [ -f "$CONFIG" ]; then
VAULT=$(jq -r '.obsidian_vault // empty' "$CONFIG" 2>/dev/null)
if [ -n "$VAULT" ] && [ -d "$VAULT" ]; then
echo "$VAULT/Claude Plays Zork Transcript.md"
return
fi
fi
echo "$SKILL_DIR/state/TRANSCRIPT.md"
}
TRANSCRIPT=$(get_transcript_path)
# Start new game, do initial look, save
OUTPUT=$(echo -e "look\nsave\n$SAVE\nquit\ny" | dfrotz -m -p -q "$GAME" 2>&1)
# Log to transcript
{
echo ""
echo "---"
echo ""
echo "# New Game Started - $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
echo '```'
echo "$OUTPUT"
echo '```'
} >> "$TRANSCRIPT"
echo "=== New Game Started ==="
echo ""
echo "$OUTPUT"
```
### scripts/setup.sh
```bash
#!/bin/bash
# setup.sh - Configure Obsidian vault for learnings sync
# Usage: ./setup.sh [vault_path]
set -e
# Get script directory and skill root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(dirname "$SCRIPT_DIR")"
CONFIG="$SKILL_DIR/state/config.json"
VAULT_PATH="$1"
if [ -z "$VAULT_PATH" ]; then
echo "=== Zork Skill Setup ==="
echo ""
echo "This skill can sync your play transcript and learnings to an Obsidian vault."
echo ""
if [ -f "$CONFIG" ]; then
CURRENT=$(jq -r '.obsidian_vault // "not set"' "$CONFIG" 2>/dev/null)
echo "Current setting: $CURRENT"
else
echo "Current setting: not configured (using local state/)"
fi
echo ""
echo "To configure, run:"
echo " setup.sh /path/to/your/obsidian/vault"
echo ""
echo "To clear the setting and use local storage:"
echo " setup.sh clear"
exit 0
fi
if [ "$VAULT_PATH" = "clear" ]; then
if [ -f "$CONFIG" ]; then
rm "$CONFIG"
echo "Cleared Obsidian vault setting. Using local state/ directory."
else
echo "No config to clear."
fi
exit 0
fi
# Validate path
if [ ! -d "$VAULT_PATH" ]; then
echo "Error: Directory does not exist: $VAULT_PATH"
exit 1
fi
# Save config
echo "{\"obsidian_vault\": \"$VAULT_PATH\"}" > "$CONFIG"
echo "=== Configuration Saved ==="
echo ""
echo "Obsidian vault: $VAULT_PATH"
echo ""
echo "Transcript and learnings will sync to:"
echo " - $VAULT_PATH/Claude Plays Zork Transcript.md"
echo " - $VAULT_PATH/Claude Plays Zork Learnings.md"
```