A command-line tool for planning, organizing, and writing stories using a hierarchical document structure
Project description
Prosemark CLI Writing Project Manager
Prosemark is a command-line tool for planning, organizing, and writing stories using a hierarchical document structure. It provides a clean, file-based approach to managing complex writing projects with structured content nodes, notes, and flexible organization.
Overview
Prosemark helps writers organize their work by breaking down documents into a hierarchical structure of nodes stored in plain Markdown files. Each node contains main content, metadata, and optional notes. The project uses a "binder" approach where the overall structure is maintained in a special _binder.md file, while individual content pieces are stored in separate files.
Key features:
- File-based storage: All content in plain Markdown files
- Hierarchical organization: Tree structure of content nodes
- UUIDv7 identifiers: Temporal ordering with collision resistance
- Editor integration: Launch your preferred editor for content editing
- Atomic operations: Safe file operations that preserve existing content
- Audit capabilities: Check project integrity and consistency
Installation
From Source (Development)
# Clone the repository
git clone https://github.com/yourusername/prosemark.git
cd prosemark
# Install with uv (recommended)
uv sync
uv run pmk --help
# Or install with pip
pip install -e .
pmk --help
System Requirements
- Python 3.13 or higher
- Your preferred text editor (set via EDITOR environment variable)
Quick Start
1. Initialize a New Project
# Create a new writing project
mkdir my-novel
cd my-novel
pmk init --title "My Great Novel"
This creates a _binder.md file with managed content sections for project structure.
2. Add Content Nodes
# Add top-level chapters
pmk add "Part 1: The Beginning"
pmk add "Chapter 1: Origins" --parent 01234567
# The output shows the generated UUIDv7 identifier:
# Added "Part 1: The Beginning" (01234567)
# Created files: 01234567.md, 01234567.notes.md
3. View Project Structure
pmk structure
# Output:
# Project Structure:
# ├─ Part 1: The Beginning (01234567)
# │ └─ Chapter 1: Origins (89abcdef)
4. Edit Content
# Edit the main content
pmk edit 89abcdef --part draft
# Edit notes
pmk edit 89abcdef --part notes
# Edit synopsis (metadata)
pmk edit 89abcdef --part synopsis
5. Create Freeform Content
# Quick writing for ideas outside the main structure
pmk write "Character development ideas"
# Creates: 20250920T1530_01234567-89ab-cdef-0123-456789abcdef.md
Command Reference
Project Management
pmk init --title TITLE [--path PATH]- Initialize new projectpmk audit [--fix]- Check project integrity
Content Management
pmk add TITLE [--parent ID] [--position INDEX]- Add new nodepmk edit NODE_ID --part {draft|notes|synopsis}- Edit contentpmk materialize TITLE [--parent ID]- Convert placeholder to nodepmk move NODE_ID [--parent ID] [--position INDEX]- Reorganize hierarchypmk remove NODE_ID [--delete-files] [--force]- Remove node
Viewing and Organization
pmk structure [--format {tree|json}]- Display project hierarchypmk write [TITLE]- Create timestamped freeform file
File Structure
Prosemark organizes projects with this structure:
my-novel/
├── _binder.md # Project structure (managed content)
├── 01234567.md # Node content file
├── 01234567.notes.md # Node notes file
├── 89abcdef.md # Another node
├── 89abcdef.notes.md # Its notes
└── 20250920T1530_*.md # Freeform writing files
Binder File Format
The _binder.md file contains your project structure between managed markers:
# My Novel
Your project description and notes.
<!-- pmk:begin-binder -->
- [Part 1: The Beginning](01234567.md)
- [Chapter 1: Origins](89abcdef.md)
- [Future Chapter]()
<!-- pmk:end-binder -->
Additional content is preserved outside the managed section.
Node File Format
Each node consists of two files with YAML frontmatter:
Content file (01234567.md):
---
id: 01234567
title: "Part 1: The Beginning"
synopsis: |
Opening section that establishes
the world and main characters
created: 2025-09-20T15:30:00Z
updated: 2025-09-20T15:30:00Z
---
# Part 1: The Beginning
Your story content goes here...
Notes file (01234567.notes.md):
---
id: 01234567
title: "Part 1: The Beginning"
created: 2025-09-20T15:30:00Z
updated: 2025-09-20T15:30:00Z
---
# Notes for Part 1
Research, character details, plot notes...
Configuration
Editor Setup
Set your preferred editor via environment variable:
export EDITOR="code --wait" # VS Code
export EDITOR="vim" # Vim
export EDITOR="nano" # Nano
Integration with Other Tools
Prosemark files are designed to work well with:
- Git: All files are plain text and diff-friendly
- Obsidian: Files appear as individual notes with preserved frontmatter
- Any text editor: Standard Markdown with YAML frontmatter
- Static site generators: Compatible with Jekyll, Hugo, etc.
Architecture
Prosemark uses hexagonal (ports and adapters) architecture:
- Domain: Core business logic (nodes, binders, identifiers)
- Ports: Interfaces for external dependencies
- Adapters: File system, editor, console implementations
- Use Cases: Application logic orchestrating the domain
- CLI: Command-line interface layer
This design ensures the core logic is independent of file systems, editors, or CLI frameworks.
Development
Tech Stack
- Python 3.13+ with type hints
- Typer for CLI framework
- PyYAML for frontmatter parsing
- pytest for testing with 100% coverage
- ruff for formatting and linting
- mypy for type checking
Development Setup
# Install development dependencies
uv sync --dev
# Run tests
uv run pytest
# Type checking
uv run mypy src/
# Linting and formatting
uv run ruff check src/
uv run ruff format src/
Testing
The project uses comprehensive testing:
- Contract tests: Verify API interfaces
- Unit tests: Test individual components
- Integration tests: Test complete workflows
- Performance tests: Ensure scalability
Run specific test suites:
uv run pytest tests/contract/ # Contract tests
uv run pytest tests/unit/ # Unit tests
uv run pytest tests/integration/ # Integration tests
uv run pytest tests/performance/ # Performance tests
Contributing
- Fork the repository
- Create a feature branch
- Write tests for new functionality
- Ensure all tests pass and coverage remains 100%
- Submit a pull request
License
Support
For issues, feature requests, or questions:
- File an issue on GitHub
- Check existing documentation in the
specs/directory - Review test cases for usage examples
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prosemark-0.4.1.tar.gz.
File metadata
- Download URL: prosemark-0.4.1.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1fadeee44600a0d8e95e7b72a59a2bb0b6fea9a21e9944fad822b88037cf83ce
|
|
| MD5 |
d9585bec20ac6a0b76e61599afadfe00
|
|
| BLAKE2b-256 |
d14fa9e2cec1d4a4ecc577a46b41350b877e341b7e1aad7818e4d876e672a44e
|
File details
Details for the file prosemark-0.4.1-py3-none-any.whl.
File metadata
- Download URL: prosemark-0.4.1-py3-none-any.whl
- Upload date:
- Size: 215.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5d2df2c4e9f7d5468056d3c4f17e8715d02157d1038ca94f973b577df2781bd
|
|
| MD5 |
9cc8a32d9974763e245193cda4aa1f07
|
|
| BLAKE2b-256 |
fa88e0c074dfd2129f95579277fcc417f486a8002f703044f1a8ebc9d24fdb6a
|