266 lines
9.9 KiB
Markdown
266 lines
9.9 KiB
Markdown
# Agent Guide for HeurAMS
|
|
|
|
This document contains essential information for AI agents working in the HeurAMS (Heuristic Assisted Memory Scheduler) codebase.
|
|
|
|
## Project Overview
|
|
|
|
HeurAMS is a Python-based memory scheduling application with a TUI interface built using Textual. It implements a spaced repetition system with configurable algorithms, puzzles, and data persistence.
|
|
|
|
**Key Technologies**:
|
|
- Python 3 (setuptools)
|
|
- Textual (TUI framework)
|
|
- TOML for configuration
|
|
- JSON and TOML for data persistence
|
|
- Bidirectional mapping via `bidict`
|
|
|
|
**Project Structure**:
|
|
```
|
|
src/heurams/
|
|
├── __init__.py # Package entry point
|
|
├── context.py # Global context, paths, config context manager
|
|
├── services/ # Core services (config, logger, timer, audio, TTS)
|
|
├── kernel/ # Core business logic
|
|
│ ├── algorithms/ # Spaced repetition algorithms (FSRS, SM2)
|
|
│ ├── particles/ # Data models (Atom, Electron, Nucleon, Orbital)
|
|
│ ├── puzzles/ # Puzzle types (MCQ, cloze, recognition)
|
|
│ └── reactor/ # Scheduling and processing logic
|
|
├── providers/ # External service providers
|
|
│ ├── audio/ # Audio playback implementations
|
|
│ ├── tts/ # Text-to-speech implementations
|
|
│ └── llm/ # LLM integrations
|
|
├── interface/ # Textual TUI interface
|
|
│ ├── widgets/ # UI widget components
|
|
│ ├── screens/ # Application screens
|
|
│ └── __main__.py # Application entry point
|
|
└── default/ # Default configuration and data templates
|
|
```
|
|
|
|
## Essential Commands
|
|
|
|
### Development Setup
|
|
```bash
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Install package in development mode
|
|
pip install -e .
|
|
|
|
# Build package (produces dist/)
|
|
python -m build
|
|
```
|
|
|
|
### Running the Application
|
|
```bash
|
|
# Run the TUI application
|
|
python -m heurams.interface
|
|
|
|
# Alternative: if installed via pip
|
|
heurams # (if console scripts are configured)
|
|
```
|
|
|
|
### Testing
|
|
```bash
|
|
# Run tests (if test suite exists)
|
|
pytest
|
|
|
|
# Run with coverage
|
|
pytest --cov=heurams
|
|
```
|
|
|
|
**Note**: The test directory appears to have been removed. Previous test files were located in `tests/` (deleted per git status). If adding new tests, follow pytest conventions and place them in a `tests/` directory at the project root.
|
|
|
|
### Linting and Formatting
|
|
No specific linting or formatting configuration observed. Use standard Python conventions.
|
|
|
|
## Code Organization
|
|
|
|
### Key Modules
|
|
|
|
1. **context.py** (`src/heurams/context.py`):
|
|
- Defines `rootdir`, `workdir`, and `config_var` (ContextVar) for configuration
|
|
- Provides `ConfigContext` context manager for temporary configuration switching
|
|
- Configuration is loaded from `config/config.toml` relative to workdir, falling back to default config
|
|
|
|
2. **Services** (`src/heurams/services/`):
|
|
- `config.py`: `ConfigFile` class for TOML configuration management
|
|
- `logger.py`: Comprehensive logging setup with rotation and namespacing
|
|
- `timer.py`: Time services with configurable overrides for testing
|
|
- `audio_service.py`: Audio playback abstraction
|
|
- `tts_service.py`: Text-to-speech service abstraction
|
|
|
|
3. **Kernel** (`src/heurams/kernel/`):
|
|
- **Particles**: Data models representing memory items:
|
|
- `Atom`: Composite of Nucleon (content), Electron (algorithm data), Orbital (strategy)
|
|
- `Nucleon`: Content data (TOML)
|
|
- `Electron`: Algorithm data (JSON)
|
|
- `Orbital`: Strategy configuration (TOML)
|
|
- **Algorithms**: Spaced repetition algorithm implementations (FSRS, SM2)
|
|
- **Puzzles**: Interactive puzzle types for review sessions
|
|
- **Reactor**: Scheduling and state management
|
|
|
|
4. **Providers** (`src/heurams/providers/`):
|
|
- Abstract base classes and implementations for external services
|
|
- Audio playback (`playsound_audio.py`, `termux_audio.py`)
|
|
- TTS (`edge_tts.py`)
|
|
- LLM (`openai.py`)
|
|
|
|
5. **Interface** (`src/heurams/interface/`):
|
|
- Textual-based TUI with multiple screens
|
|
- Widgets for different puzzle types
|
|
- CSS styling in `css/` directory
|
|
|
|
## Naming Conventions and Style Patterns
|
|
|
|
### Code Style
|
|
- **Indentation**: 4 spaces (no tabs observed)
|
|
- **Line length**: No explicit limit, typical Python conventions
|
|
- **Imports**: Standard library first, then third-party, then local modules
|
|
- **Type hints**: Used extensively throughout codebase
|
|
- **Docstrings**: Chinese and English mixed, some functions have descriptive docstrings
|
|
|
|
### Naming
|
|
- **Classes**: `CamelCase` (e.g., `ConfigFile`, `BaseAlgorithm`, `HeurAMSApp`)
|
|
- **Functions/Methods**: `snake_case` (e.g., `get_daystamp`, `setup_logging`)
|
|
- **Variables**: `snake_case` (e.g., `config_var`, `atom_registry`)
|
|
- **Constants**: `UPPER_SNAKE_CASE` (e.g., `DEFAULT_LOG_LEVEL`)
|
|
|
|
### Patterns Observed
|
|
- Use `typing` module for type annotations (`TypedDict`, `Union`, `Optional`, etc.)
|
|
- Context variables via `contextvars` for configuration management
|
|
- Registry pattern using `bidict` for global object tracking (e.g., `atom_registry`)
|
|
- Service abstraction with provider pattern (audio, TTS, LLM)
|
|
- Configuration-driven behavior with fallback defaults
|
|
|
|
## Testing Approach
|
|
|
|
**Current State**: Test directory removed, but `.pytest_cache` indicates pytest was used.
|
|
|
|
**If adding tests**:
|
|
- Place tests in `tests/` directory at project root
|
|
- Follow pytest conventions
|
|
- Use `pytest.fixture` for shared test resources
|
|
- Mock external dependencies (audio, TTS, LLM providers)
|
|
- Test configuration overrides via `ConfigContext`
|
|
|
|
**Testable Components**:
|
|
- Algorithm implementations (FSRS, SM2)
|
|
- Puzzle logic validation
|
|
- Configuration loading and saving
|
|
- Atom persistence and evaluation
|
|
|
|
## Important Gotchas
|
|
|
|
### Configuration Loading
|
|
- Configuration is loaded from `config/config.toml` relative to the **current working directory**
|
|
- If not found, falls back to `src/heurams/default/config/config.toml`
|
|
- The `config_var` ContextVar is used throughout the codebase to access configuration
|
|
- Use `ConfigContext` for temporary configuration changes in tests or specific operations
|
|
|
|
### Path Handling
|
|
- `rootdir`: Package directory (`src/heurams/`)
|
|
- `workdir`: Current working directory (set at runtime)
|
|
- Data paths (`nucleon_dir`, `electron_dir`, etc.) are relative to `workdir` by default
|
|
- The application may change working directory in development mode (see `__main__.py` lines 61-63)
|
|
|
|
### Eval Security
|
|
- The `Atom.do_eval()` method evaluates strings prefixed with `"eval:"` in data structures
|
|
- This is a security consideration - user-provided content could execute arbitrary code
|
|
- Evaluation is limited to a sandboxed environment but caution is advised
|
|
|
|
### Logging
|
|
- Logging is configured automatically via `logger.py` setup
|
|
- Logs go to `/tmp/heurams.log` by default (configurable)
|
|
- Logger names are prefixed with `"heurams."` automatically
|
|
- Third-party library log levels are set to WARNING to reduce noise
|
|
|
|
### Time Overrides
|
|
- `daystamp_override` and `timestamp_override` in config allow time manipulation for testing
|
|
- When set to values other than `-1`, they override `get_daystamp()` and `get_timestamp()`
|
|
- Useful for reproducible testing of scheduling algorithms
|
|
|
|
## Configuration
|
|
|
|
### Default Configuration (`src/heurams/default/config/config.toml`)
|
|
```toml
|
|
# Debug settings
|
|
persist_to_file = 1
|
|
daystamp_override = -1
|
|
timestamp_override = -1
|
|
quick_pass = 0
|
|
|
|
# Default number of new memory items
|
|
tasked_number = 8
|
|
|
|
# Timezone offset for daystamp calculation (seconds)
|
|
timezone_offset = +28800 # China Standard Time (UTC+8)
|
|
|
|
# Puzzle defaults
|
|
[puzzles.mcq]
|
|
max_riddles_num = 2
|
|
|
|
[puzzles.cloze]
|
|
min_denominator = 3
|
|
|
|
# Data paths (relative to workdir or absolute)
|
|
[paths]
|
|
nucleon_dir = "./data/nucleon"
|
|
electron_dir = "./data/electron"
|
|
orbital_dir = "./data/orbital"
|
|
cache_dir = "./data/cache"
|
|
```
|
|
|
|
### User Configuration
|
|
Place `config.toml` in `config/` directory relative to where the application is run. The structure should match the default configuration.
|
|
|
|
## Running the Application
|
|
|
|
### Development Mode
|
|
When running from within the project directory, the application may change working directory to ensure data paths resolve correctly (see `__main__.py`).
|
|
|
|
### Production/Installed Mode
|
|
When installed via pip, the working directory is wherever the command is executed. Ensure a `config/` directory with `config.toml` exists, or rely on defaults.
|
|
|
|
### Entry Points
|
|
- Primary: `python -m heurams.interface`
|
|
- The `__main__.py` performs environment checks, ensures directories exist, then launches the Textual app
|
|
|
|
## Development Setup
|
|
|
|
### Dependencies
|
|
- Listed in `requirements.txt`: `bidict`, `playsound`, `textual`, `toml`
|
|
- Additional dependencies may be needed for specific providers (e.g., `edge-tts`)
|
|
|
|
### Adding New Features
|
|
|
|
**New Puzzle Type**:
|
|
1. Add class in `src/heurams/kernel/puzzles/`
|
|
2. Inherit from `BasePuzzle`
|
|
3. Add corresponding widget in `src/heurams/interface/widgets/`
|
|
4. Integrate into appropriate screens
|
|
|
|
**New Algorithm**:
|
|
1. Add class in `src/heurams/kernel/algorithms/`
|
|
2. Inherit from `BaseAlgorithm`
|
|
3. Implement `revisor()`, `is_due()`, `rate()`, `nextdate()` methods
|
|
4. Update algorithm selection logic if needed
|
|
|
|
**New Provider**:
|
|
1. Add implementation in relevant provider directory (`audio/`, `tts/`, `llm/`)
|
|
2. Inherit from base class in same directory
|
|
3. Register in provider registry (see `__init__.py` in provider directories)
|
|
|
|
### Data Models
|
|
- **Nucleon**: Content data (TOML), contains metadata and puzzle content
|
|
- **Electron**: Algorithm state (JSON), tracks review history and scheduling
|
|
- **Orbital**: Strategy configuration (TOML), defines review parameters
|
|
- **Atom**: Composite of all three, managed via `atom_registry`
|
|
|
|
### Persistence
|
|
- Data is saved to paths specified in configuration
|
|
- Formats: TOML for Nucleon/Orbital, JSON for Electron
|
|
- Automatic directory creation on save
|
|
- The `Atom.persist()` method handles saving individual components
|
|
|
|
---
|
|
|
|
*Last Updated: Based on codebase analysis on 2025-12-15* |