npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

simple-task-master

v0.3.1

Published

A simple command-line task management tool

Readme

Simple Task Master (STM)

npm version Node.js CI License: MIT

A powerful, lightweight command-line task management tool built for developers who prefer markdown files over complex project management systems. STM stores tasks as individual markdown files with YAML frontmatter, making them both human-readable and version control friendly.

✨ Features

  • 📝 Markdown-based tasks: Each task is stored as a readable markdown file
  • 🏷️ Flexible tagging system: Organize tasks with multiple tags
  • 🔍 Powerful search: Find tasks by content, title, tags, or status
  • 📊 Multiple output formats: JSON, table, CSV, or pretty-printed views
  • 🔒 Safe concurrent access: Built-in file locking prevents data corruption
  • ⚡ Fast performance: Optimized for handling thousands of tasks
  • 🎯 Simple workflow: Initialize, add, list, update - that's it!
  • 🔄 Export capabilities: Export tasks to various formats for reporting
  • 🔧 Custom metadata fields: Add any custom fields for external tool integration
  • ⚙️ Flexible configuration: Configurable task directories and runtime settings with reset capabilities

🚀 Quick Start

Installation

Global Installation (Recommended)

npm install -g simple-task-master

Using npx (No Installation)

npx simple-task-master init

Basic Usage

  1. Initialize a new task repository:

    stm init
  2. Add your first task:

    stm add "Implement user authentication" --tags=backend,security --priority=high
  3. List all tasks:

    stm list
  4. View a specific task:

    stm show 1
  5. Update task status:

    stm update 1 --status=in-progress

📝 Task Structure

STM tasks use three main content sections to organize information clearly:

Section Purposes

  • Description (--description): Why & What

    • Problem context and background
    • Solution overview and approach
    • Acceptance criteria and definition of done
  • Details (--details): How

    • Implementation approach and technical design
    • Architecture notes and design decisions
    • Step-by-step implementation plan
  • Validation (--validation): Quality Assurance

    • Testing strategy and approach
    • Verification steps and quality checks
    • Manual testing procedures and checklists

Example Task Structure

---
id: 1
title: 'Implement user authentication'
status: 'pending'
---

# Implement user authentication

## Description

**Problem**: Users currently cannot securely access the application.

**Solution**: Implement JWT-based authentication with secure password handling.

**Acceptance Criteria**:
- [ ] Users can register with email/password
- [ ] Users can login and receive JWT tokens
- [ ] Protected routes require valid tokens
- [ ] Passwords are securely hashed

## Details

**Implementation approach**:
- Use bcrypt for password hashing (salt rounds: 12)
- JWT tokens with 24-hour expiration
- Express middleware for route protection
- Database schema: users table with email, password_hash, created_at

**Architecture**:
- auth.ts: Core authentication logic
- middleware/auth.ts: Route protection
- routes/auth.ts: Login/register endpoints

## Validation

**Testing strategy**:
- Unit tests for password hashing/verification
- Integration tests for auth endpoints
- E2E tests for complete login flow

**Manual verification**:
- [ ] Register new user via API
- [ ] Login returns valid JWT
- [ ] Protected routes reject invalid tokens
- [ ] Password reset flow works end-to-end

📖 Command Reference

stm init

Initialize STM repository in the current directory.

# Initialize with default settings
stm init

# Initialize with custom task directory
stm init --tasks-dir ./my-tasks

Creates:

  • .simple-task-master/ directory
  • config.json configuration file
  • tasks/ directory (or your custom directory)
  • Updates .gitignore to exclude task files but include config

Options:

  • --tasks-dir <path>: Custom directory for storing task files (default: .simple-task-master/tasks/)

stm add <title>

Add a new task with the specified title.

# Basic task
stm add "Fix login bug"

# Task with tags and priority
stm add "Implement dashboard" --tags=frontend,ui --priority=high

# Task with description
stm add "Update documentation" --description="Update API docs and examples"

# Task with due date
stm add "Deploy to production" --due-date="2024-12-31"

Options:

  • --tags, -t <tags>: Comma-separated list of tags
  • --priority, -p <priority>: Task priority (low, medium, high)
  • --description, -d <description>: Task description
  • --due-date <date>: Due date (YYYY-MM-DD format)
  • --status, -s <status>: Initial status (pending, in-progress, done)

stm list

List tasks with optional filtering and formatting.

# List all tasks
stm list

# Filter by status
stm list --status=pending
stm list --status=in-progress
stm list --status=done

# Filter by tags
stm list --tags=frontend,ui
stm list --tags=backend

# Search in task content
stm list --search="authentication"

# Combine filters
stm list --status=pending --tags=backend --search="API"

# Different output formats
stm list --format=json
stm list --format=csv
stm list --format=table
stm list --pretty  # Enhanced pretty-printing

Filtering Options:

  • --status, -s <status>: Filter by status (pending, in-progress, done)
  • --tags, -t <tags>: Filter by comma-separated tags
  • --search <query>: Search in task titles and descriptions

Output Options:

  • --format, -f <format>: Output format (json, table, csv)
  • --pretty, -p: Enable pretty-printing with colors and formatting

stm show <id>

Display detailed information about a specific task.

# Show task by ID
stm show 1

# Show with different formats
stm show 1 --format=json
stm show 1 --format=yaml

Options:

  • --format, -f <format>: Output format (default, json, yaml)

stm update <id>

Update an existing task's properties with flexible options for metadata, content sections, and editor integration.

Basic Property Updates

# Update status
stm update 1 --status=done

# Update title
stm update 1 --title="New task title"

# Update tags
stm update 1 --tags=urgent,backend,security

Section-Specific Updates

# Update description section directly
stm update 42 --desc "Revised task description with new requirements"

# Update details section with multi-line content
stm update 42 --details "## Implementation Notes
- Use TypeScript for type safety
- Add comprehensive error handling
- Include unit tests"

# Update validation section
stm update 42 --validation "✓ All tests pass
✓ Code review completed
✓ Manual QA approved"

Stdin Input Support

# Pipe content to description section
echo "New description from command output" | stm update 42 --desc -

# Pipe test results to validation section
npm test | stm update 42 --validation -

# Use complex piping with other tools
curl -s api.example.com/requirements | stm update 42 --details -

# Multi-line input using heredoc
stm update 42 --validation - << 'EOF'
✓ Unit tests: 45/45 passing
✓ Integration tests: 12/12 passing
✓ Performance benchmarks within limits
✓ Security scan: no vulnerabilities
EOF

Key=Value Assignment Syntax

# Basic assignments
stm update 42 status=done title="Completed feature implementation"

# Content section assignments
stm update 42 desc="Updated description" details="New implementation details"

# Array operations - adding tags
stm update 42 tags+=security,performance

# Array operations - removing tags
stm update 42 tags-=deprecated,old

# Multiple mixed operations
stm update 42 status=in-progress tags+=urgent desc="High priority update"

Editor Integration

# Open task in editor when no changes specified
stm update 42

# Disable editor fallback
stm update 42 --no-editor

Combined Usage Examples

# Update metadata and add validation results
stm update 42 status=done --validation "✓ All tests pass
✓ Manual QA complete"

# Update multiple sections with different input methods
stm update 42 --desc "Updated requirements" details="$(cat implementation-notes.md)"

# Complex workflow with piped validation
npm run test:full | stm update 42 status=done --validation -

# Batch update with assignment syntax
stm update 42 status=in-progress tags+=urgent,hotfix desc="Critical bug fix in progress"

Options:

  • --title, -t <title>: Update task title
  • --desc, -d <text>: Update description section (use - for stdin)
  • --details <text>: Update details section (use - for stdin)
  • --validation <text>: Update validation section (use - for stdin)
  • --status, -s <status>: Update status (pending, in-progress, done)
  • --tags <tags>: Set task tags (comma-separated)
  • --deps <dependencies>: Set task dependencies (comma-separated IDs)
  • --no-editor: Disable editor fallback when no changes are specified

Assignment Syntax:

  • key=value: Set field value
  • key+=value: Add to array fields (tags, dependencies)
  • key-=value: Remove from array fields (tags, dependencies)

Valid Fields for Assignments:

  • title: Task title
  • content: Full task content (markdown body)
  • status: Task status (pending, in-progress, done)
  • tags: Task tags (comma-separated for arrays)
  • dependencies: Task dependencies (comma-separated IDs)
  • desc: Description section content
  • details: Details section content
  • validation: Validation section content
  • Any custom field: You can add custom metadata fields for external tool integration

stm grep <pattern>

Search for tasks using regular expressions.

# Search in task content
stm grep "authentication"

# Case-insensitive search
stm grep -i "API"

# Search in specific fields
stm grep --field=title "user"
stm grep --field=description "implement"

# Different output formats
stm grep "bug" --format=json
stm grep "feature" --format=table

Options:

  • --case-insensitive, -i: Case-insensitive search
  • --field <field>: Search in specific field (title, description, tags)
  • --format, -f <format>: Output format (default, json, table)

stm export

Export tasks to various formats for reporting and analysis.

# Export all tasks to JSON
stm export --format=json > tasks.json

# Export to CSV
stm export --format=csv > tasks.csv

# Export filtered tasks
stm export --status=done --format=json > completed-tasks.json

# Export with specific fields
stm export --format=csv --fields=id,title,status,tags

Options:

  • --format, -f <format>: Export format (json, csv, md)
  • --status, -s <status>: Filter by status
  • --tags, -t <tags>: Filter by tags
  • --fields <fields>: Comma-separated fields to include in export

stm delete <id>

Delete a task permanently.

# Delete a task
stm delete 123

# Force delete (bypass dependency checks)
stm delete 123 --force

Note: Deletion is permanent. Tasks that depend on the deleted task may become invalid unless --force is used.

Options:

  • --force, -f: Force deletion even if other tasks depend on this task

stm config

View and modify Simple Task Master configuration settings.

# View all configuration
stm config --list

# Get specific configuration value
stm config --get tasksDir
stm config --get lockTimeoutMs
stm config --get maxTaskSizeBytes

# Change tasks directory
stm config --set tasksDir=docs/tasks

# Change lock timeout to 60 seconds
stm config --set lockTimeoutMs=60000

# Change max task size to 2MB
stm config --set maxTaskSizeBytes=2097152

# Reset individual configuration values to defaults
stm config --reset tasksDir
stm config --reset lockTimeoutMs

# Reset all configuration values to defaults
stm config --reset-all

Options:

  • --get <key>: Get a specific configuration value
  • --set <key=value>: Set a configuration value
  • --list: List all configuration values as JSON
  • --reset <key>: Reset a specific configuration value to its default
  • --reset-all: Reset all configuration values to defaults

Configuration Keys:

  • tasksDir: Directory where task files are stored (relative or absolute path)
  • lockTimeoutMs: Lock acquisition timeout in milliseconds (default: 30000)
  • maxTaskSizeBytes: Maximum task file size in bytes (default: 1048576)

Common Use Cases:

# Move tasks to a project-specific directory
stm config --set tasksDir=./project/tasks

# Increase timeout for slower systems
stm config --set lockTimeoutMs=60000

# Allow larger task files (e.g., 5MB)
stm config --set maxTaskSizeBytes=5242880

# Check current configuration
stm config --list

# Use in scripts
TASKS_DIR=$(stm config --get tasksDir)
echo "Tasks are stored in: $TASKS_DIR"

# Reset to defaults when switching projects
stm config --reset tasksDir        # Back to .simple-task-master/tasks
stm config --reset lockTimeoutMs   # Back to 30 seconds
stm config --reset-all             # Reset everything to defaults

⚙️ Configuration

STM stores its configuration in .simple-task-master/config.json. You can view and modify these settings using the config command or by editing the JSON file directly.

Using the Config Command

The config command provides a safe way to view and modify configuration without manually editing JSON:

# View current configuration
stm config --list

# Get a specific value
stm config --get tasksDir

# Change a setting
stm config --set lockTimeoutMs=45000

# Reset settings to defaults
stm config --reset tasksDir
stm config --reset-all

Configuration File Format

{
  "schema": 1,
  "lockTimeoutMs": 30000,
  "maxTaskSizeBytes": 1048576,
  "tasksDir": "./my-tasks"
}

Configuration Options

tasksDir (string)

Directory where task files are stored. Can be relative or absolute path.

  • Default: .simple-task-master/tasks/
  • Valid values: Any valid directory path within the project
  • Restrictions:
    • Cannot use system directories (/etc, /usr, etc.)
    • Cannot contain path traversal sequences (..)
    • Must be within the project directory if absolute

Examples:

# Use a project-specific directory
stm config --set tasksDir=./todos

# Use a nested structure
stm config --set tasksDir=./docs/project-tasks

# Check current value
stm config --get tasksDir

lockTimeoutMs (number)

Maximum time in milliseconds to wait for acquiring a file lock. Prevents indefinite waiting when another process is accessing task files.

  • Default: 30000 (30 seconds)
  • Valid values: Positive integer
  • Recommended range: 5000-120000 (5-120 seconds)

Examples:

# Increase for slower systems or network drives
stm config --set lockTimeoutMs=60000

# Decrease for faster failure detection
stm config --set lockTimeoutMs=10000

maxTaskSizeBytes (number)

Maximum allowed size for a single task file in bytes. Prevents excessive memory usage and ensures reasonable performance.

  • Default: 1048576 (1 MB)
  • Valid values: Positive integer
  • Recommended range: 10240-10485760 (10 KB - 10 MB)

Examples:

# Allow larger tasks (2 MB)
stm config --set maxTaskSizeBytes=2097152

# Allow very large tasks (5 MB)
stm config --set maxTaskSizeBytes=5242880

# Common sizes:
# 512 KB = 524288
# 1 MB   = 1048576 (default)
# 2 MB   = 2097152
# 5 MB   = 5242880
# 10 MB  = 10485760

Validation Rules

The config command validates all settings before saving:

  • tasksDir:

    • Must be a valid path format
    • Cannot contain system directory paths
    • Cannot use path traversal (../)
    • Shows warning if changing with existing tasks
  • lockTimeoutMs:

    • Must be a positive integer
    • Values below 1000 (1 second) are not recommended
    • Very high values may cause long waits
  • maxTaskSizeBytes:

    • Must be a positive integer
    • Values below 1024 (1 KB) are not practical
    • Consider system memory when setting high values

Custom Task Directory

By default, STM stores tasks in .simple-task-master/tasks/. However, you can configure a custom directory for task storage, which is useful for:

  • Organizing tasks in a project-specific location
  • Separating tasks from the STM configuration
  • Using existing directories for task management
  • Following your team's directory structure conventions

Setting Up a Custom Task Directory

Option 1: Initialize with a custom directory

# Use a relative path (recommended)
stm init --tasks-dir ./project-tasks

# Use a nested directory structure
stm init --tasks-dir ./docs/tasks

# Initialize in an existing directory
stm init --tasks-dir ./existing-tasks-folder

Option 2: Modify config.json after initialization

{
  "schema": 1,
  "lockTimeoutMs": 30000,
  "maxTaskSizeBytes": 1048576,
  "tasksDir": "./my-custom-tasks"
}

Examples

# Initialize with tasks in a 'todo' directory
stm init --tasks-dir ./todo

# Initialize with tasks in a documentation folder
stm init --tasks-dir ./docs/project-tasks

# Initialize with deeply nested structure
stm init --tasks-dir ./project/management/tasks

Important Considerations

  1. Relative vs Absolute Paths

    • Relative paths (recommended): Portable across different systems and users
    • Absolute paths: Must be within the project directory for security
  2. Git Integration

    • STM automatically updates .gitignore to exclude task files
    • The pattern added depends on your custom directory
    • Config file remains tracked for team synchronization
  3. Migration Guide

    If you have an existing STM workspace and want to move tasks to a custom directory:

    # 1. Move existing tasks to the new location
    mv .simple-task-master/tasks ./my-tasks
       
    # 2. Update config.json
    # Add: "tasksDir": "./my-tasks"
       
    # 3. Update .gitignore
    # Replace: .simple-task-master/tasks/
    # With: my-tasks/
  4. Limitations

    • Custom directories cannot be inside .simple-task-master/
    • System directories (/etc, /usr, etc.) are not allowed
    • Directory traversal sequences (..) in paths are blocked
    • Absolute paths must be within the current project

📁 File Structure

Default Structure:

project-root/
├── .simple-task-master/
│   ├── config.json          # STM configuration
│   ├── tasks/               # Default task files directory
│   │   ├── 1-task-title.md  # Individual task files
│   │   ├── 2-another-task.md
│   │   └── ...
│   └── lock                 # Lock file (temporary)
└── .gitignore               # Updated to exclude tasks/

With Custom Task Directory:

project-root/
├── .simple-task-master/
│   ├── config.json          # Contains "tasksDir": "./my-tasks"
│   └── lock                 # Lock file (temporary)
├── my-tasks/                # Custom task directory
│   ├── 1-task-title.md      # Individual task files
│   ├── 2-another-task.md
│   └── ...
└── .gitignore               # Updated to exclude my-tasks/

Task File Format

Each task is stored as a markdown file with YAML frontmatter:

---
id: 1
title: 'Implement user authentication'
status: 'pending'
priority: 'high'
tags:
  - backend
  - security
created: '2024-01-15T10:30:00.000Z'
updated: '2024-01-15T10:30:00.000Z'
dueDate: '2024-01-31'
# Custom fields (added by external tools or workflows)
external_id: 'JIRA-456'
sprint: '2024-Q1-Sprint-2'
story_points: 8
---

# Implement user authentication

## Description

Create a secure authentication system using JWT tokens.

## Requirements

- [ ] Password hashing with bcrypt
- [ ] JWT token generation
- [ ] Login/logout endpoints
- [ ] Password reset functionality

## Notes

Research industry best practices for session management.

💡 Usage Examples

Daily Workflow

# Start your day by checking pending tasks
stm list --status=pending --pretty

# Add a new urgent task
stm add "Fix critical production bug" --tags=urgent,bugfix --priority=high

# Start working on a task and add implementation notes
stm update 5 status=in-progress --details "Started debugging the authentication flow"

# Update progress with detailed validation checks
stm update 5 --validation - << 'EOF'
✓ Reproduced the issue locally
✓ Identified root cause in JWT validation
⏳ Working on fix implementation
EOF

# Complete the task with final validation
npm test | stm update 5 status=done --validation -

# Review completed work
stm list --status=done --format=table

Project Management

# Add feature tasks with tags
stm add "Design user dashboard" --tags=frontend,design --priority=medium
stm add "Implement user API" --tags=backend,api --priority=high
stm add "Write unit tests" --tags=testing --priority=medium

# Start working on API implementation with detailed plan
stm update 2 status=in-progress --details "## Implementation Plan
- Design REST endpoints
- Set up authentication middleware
- Implement CRUD operations
- Add input validation"

# Update progress with specific validation criteria
stm update 2 --validation "## Acceptance Criteria
- [ ] All endpoints documented in OpenAPI
- [ ] Authentication tests pass
- [ ] Error handling implemented
- [ ] Performance benchmarks met"

# Add urgent tag when priorities change
stm update 2 tags+=urgent

# Complete with comprehensive validation results
stm update 2 status=done --validation "## Final Validation
✓ All endpoints implemented and tested
✓ API documentation updated
✓ Security review completed
✓ Performance tests: avg 45ms response time
✓ Integration tests: 100% passing"

# Track frontend work
stm list --tags=frontend --pretty

# Export project status
stm export --format=csv > project-status.csv

Advanced Update Patterns

# Automated testing workflow with piped results
npm run test:unit | stm update 15 --validation -
npm run test:integration | stm update 15 --validation -

# Code review workflow
stm update 23 --desc "Feature implementation complete" --validation "✓ Code review requested"

# CI/CD integration - update from build results
if npm run build; then
  stm update 18 status=done --validation "✓ Build successful: $(date)"
else
  stm update 18 --validation "❌ Build failed: $(date)"
fi

# Multi-step task progression with section updates
stm update 31 status=in-progress --desc "Starting phase 1: Requirements gathering"
stm update 31 --details "$(cat requirements.md)"
stm update 31 --validation "✓ Requirements approved by stakeholders"

# Batch updates with assignment syntax
stm update 42 status=done tags+=completed,released desc="Feature deployed to production"

# Editor-based updates for complex content
stm update 55  # Opens editor for detailed content editing

# Dependency management with array operations
stm update 60 deps+=45,46  # Add dependencies
stm update 60 deps-=32     # Remove dependency

# Documentation sync from external sources
curl -s https://api.example.com/spec | stm update 67 --details -
cat design-notes.md | stm update 67 --desc -

Team Coordination

# Export tasks for team review
stm export --status=pending --format=json > pending-tasks.json

# Find tasks by keyword
stm grep "authentication" --format=table

# Track progress by status
echo "Pending: $(stm list --status=pending --format=json | jq length)"
echo "In Progress: $(stm list --status=in-progress --format=json | jq length)"
echo "Done: $(stm list --status=done --format=json | jq length)"

Configuration Management

# Check current configuration
stm config --list

# Adjust settings for your workflow
stm config --set tasksDir=./project-tasks
stm config --set maxTaskSizeBytes=2097152  # 2MB for detailed tasks

# Use configuration in scripts
TASK_DIR=$(stm config --get tasksDir)
MAX_SIZE=$(stm config --get maxTaskSizeBytes)
echo "Tasks stored in: $TASK_DIR (max size: $MAX_SIZE bytes)"

# Backup configuration before changes
stm config --list > config-backup.json

# Verify changes took effect
stm config --get tasksDir
ls -la $(stm config --get tasksDir)

Custom Metadata Fields

STM allows you to add custom metadata fields to tasks, enabling seamless integration with external tools and workflows:

# Add custom fields for external tool integration
stm update 42 external_id="JIRA-1234" priority="P1"

# Track AutoAgent execution metadata
stm update 56 agent_id="agent-123" execution_time="45s" success=true

# Add project management metadata
stm update 78 sprint="2024-Q1-Sprint-3" story_points=5 assignee="john.doe"

# Complex metadata with JSON values
stm update 90 metadata='{"tool":"vscode","extensions":["prettier","eslint"]}'

# View tasks with custom fields (shown in JSON output)
stm show 42 --format=json
# Output includes all fields, both core and custom

# Export with custom fields preserved
stm export --format=json > tasks-with-metadata.json

Custom fields are:

  • Preserved: Maintained through all operations (create, update, show, export)
  • Flexible: Accept any valid string value
  • Tool-friendly: Enable external tools to store their own metadata
  • Non-validated: STM doesn't validate custom field values (tools manage their own data)

🔧 Development

Prerequisites

  • Node.js >= 18.0.0
  • npm or yarn

Setup

# Clone the repository
git clone https://github.com/your-username/simple-task-master.git
cd simple-task-master

# Install dependencies
npm install

# Build the project
npm run build

# Run tests
npm test

Available Scripts

  • npm run build - Compile TypeScript to JavaScript
  • npm run dev - Run in development mode with ts-node
  • npm test - Run all tests (excludes performance tests)
  • npm run test:all - Run ALL tests including performance
  • npm run test:unit - Run unit tests only
  • npm run test:integration - Run integration tests only
  • npm run test:e2e - Run end-to-end tests only
  • npm run test:performance - Run performance benchmarks (~3 min)
  • npm run test:coverage - Run tests with coverage report
  • npm run lint - Lint code with ESLint (includes formatting rules)
  • npm run lint:fix - Auto-fix linting and formatting issues
  • npm run typecheck - Type check with TypeScript

Testing

STM has comprehensive test coverage across three levels:

  1. Unit Tests: Test individual functions and classes
  2. Integration Tests: Test command interactions and file system operations
  3. E2E Tests: Test complete CLI workflows
# Run specific test suites
npm run test:unit
npm run test:integration
npm run test:e2e

# Run with coverage
npm run test:coverage

# Watch mode for development
npm run test:watch

Project Structure

src/
├── cli.ts                 # Main CLI entry point
├── commands/              # Command implementations
│   ├── add.ts
│   ├── export.ts
│   ├── grep.ts
│   ├── init.ts
│   ├── list.ts
│   ├── show.ts
│   └── update.ts
├── lib/                   # Core library code
│   ├── constants.ts       # Application constants
│   ├── errors.ts          # Error classes
│   ├── lock-manager.ts    # File locking
│   ├── output.ts          # Output formatting
│   ├── schema.ts          # Validation schemas
│   ├── task-manager.ts    # Task CRUD operations
│   ├── types.ts           # Type definitions
│   └── utils.ts           # Utility functions
└── types/                 # TypeScript type definitions
    └── index.ts

📊 Performance

STM is optimized for performance with the following characteristics:

  • Task Loading: < 50ms for 1000+ tasks
  • Search Operations: < 100ms across 10,000+ tasks
  • File Operations: Atomic writes with proper locking
  • Memory Usage: ~10MB baseline, scales linearly with task count
  • Concurrent Safety: File-level locking prevents corruption

Limitations

  • Maximum task file size: 1MB (configurable)
  • Recommended maximum tasks: 50,000 per repository
  • Lock timeout: 30 seconds (configurable)
  • Node.js requirement: >= 18.0.0

📚 API Behavior for Custom Fields

STM's API allows custom metadata fields in task frontmatter, enabling external tools to extend tasks with their own data:

Field Validation Behavior

Core Fields (strictly validated):

  • id, title, status, created, updated: Required with specific types
  • tags, dependencies: Optional arrays with validation
  • priority, dueDate: Optional with format validation

Custom Fields (flexibly handled):

  • Any field name: Allowed except those containing newlines or control characters
  • Any value type: Stored as-is without validation
  • Preservation: Maintained through all operations (create, update, list, show, export)
  • No STM validation: External tools manage their own field semantics

Integration Guidelines

When integrating with STM:

  1. Choose unique field names: Prefix with your tool name (e.g., jira_id, github_issue)
  2. Handle your own validation: STM won't validate custom field values
  3. Use consistent formats: Maintain your data format across operations
  4. Document your fields: Let users know what custom fields your tool adds

Example Integration

// External tool adding custom metadata
const task = {
  title: 'Implement feature',
  status: 'pending',
  // Custom fields for integration
  jira_id: 'PROJ-123',
  github_pr: 456,
  ci_status: 'passing',
  metrics: {
    complexity: 'high',
    estimated_hours: 8
  }
};

// STM preserves all custom fields
const updated = await taskManager.create(task);
console.log(updated.jira_id); // 'PROJ-123'
console.log(updated.metrics); // { complexity: 'high', estimated_hours: 8 }

🔒 Security

STM implements several security measures:

  • Input validation: All user inputs are validated and sanitized
  • File path validation: Prevents directory traversal attacks
  • Safe file operations: Uses atomic writes to prevent corruption
  • No remote connections: All data stays local to your machine
  • Minimal dependencies: Reduces attack surface

🤝 Contributing

We welcome contributions! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes and add tests
  4. Ensure all tests pass: npm test
  5. Lint your code: npm run lint
  6. Commit your changes: git commit -m 'feat: add amazing feature'
  7. Push to the branch: git push origin feature/amazing-feature
  8. Open a Pull Request

Commit Convention

This project uses Conventional Commits:

  • feat: New features
  • fix: Bug fixes
  • docs: Documentation changes
  • style: Code style changes
  • refactor: Code refactoring
  • test: Test changes
  • chore: Build process or auxiliary tool changes

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙋 Support