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
Metadata
Release files for prosemark 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| prosemark-0.4.1.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| prosemark-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.6 MB
Release files / prosemark-0.4.1.tar.gz
| Download URL | prosemark-0.4.1.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1fadeee44600a0d8e95e7b72a59a2bb0b6fea9a21e9944fad822b88037cf83ce
|
|
BLAKE2b-256 checksum How to use checksums |
d14fa9e2cec1d4a4ecc577a46b41350b877e341b7e1aad7818e4d876e672a44e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.19
|
Release files / prosemark-0.4.1-py3-none-any.whl
| Download URL | prosemark-0.4.1-py3-none-any.whl |
|---|---|
| Size | 215.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f5d2df2c4e9f7d5468056d3c4f17e8715d02157d1038ca94f973b577df2781bd
|
|
BLAKE2b-256 checksum How to use checksums |
fa88e0c074dfd2129f95579277fcc417f486a8002f703044f1a8ebc9d24fdb6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.19
|