Back to skills
SkillHub ClubShip Full StackFull Stack

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.

Stars
11
Hot score
85
Updated
March 20, 2026
Overall rating
C1.4
Composite score
1.4
Best-practice grade
D52.4

Install command

npx @skill-hub/cli install jonathanprozzi-claude-utils-zork

Repository

jonathanprozzi/claude-utils

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 repository

Best 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

Claude CodeCodex CLIGemini CLIOpenCode

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"

```

zork | SkillHub