Add centralized path validation to prevent path traversal attacks. - PathValidator class with sync/async validation methods - Protects against '..' and '~' traversal patterns - Validates paths are within project root - Refactored all 7 file tools to use PathValidator - 51 new tests for PathValidator
22 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.13.0] - 2025-12-01 - Security
Added
-
PathValidator Utility (0.13.3)
- Centralized path validation for all file operations
- Prevents path traversal attacks (
..,~) - Validates paths are within project root
- Sync (
validateSync) and async (validate) validation methods - Quick check method (
isWithin) for simple validations - Resolution methods (
resolve,relativize,resolveOrThrow) - Detailed validation results with status and reason
- Options for file existence, directory/file type checks
-
Security Module
- New
infrastructure/securitymodule - Exports:
PathValidator,createPathValidator,validatePath - Type exports:
PathValidationResult,PathValidationStatus,PathValidatorOptions
- New
Changed
-
Refactored All File Tools to Use PathValidator
- GetLinesTool: Uses PathValidator for path validation
- GetFunctionTool: Uses PathValidator for path validation
- GetClassTool: Uses PathValidator for path validation
- GetStructureTool: Uses PathValidator for path validation
- EditLinesTool: Uses PathValidator for path validation
- CreateFileTool: Uses PathValidator for path validation
- DeleteFileTool: Uses PathValidator for path validation
-
Improved Error Messages
- More specific error messages from PathValidator
- "Path contains traversal patterns" for
..attempts - "Path is outside project root" for absolute paths outside project
- "Path is empty" for empty/whitespace paths
Technical Details
- Total tests: 1305 (51 new PathValidator tests)
- Test coverage: ~98% maintained
- No breaking changes to existing tool APIs
- Security validation is now consistent across all 7 file tools
[0.12.0] - 2025-12-01 - TUI Advanced
Added
-
DiffView Component (0.12.1)
- Inline diff display with green (added) and red (removed) highlighting
- Header with file path and line range:
┌─── path (lines X-Y) ───┐ - Line numbers with proper padding
- Stats footer showing additions and deletions count
-
ConfirmDialog Component (0.12.2)
- Confirmation dialog with [Y] Apply / [N] Cancel / [E] Edit options
- Optional diff preview integration
- Keyboard input handling (Y/N/E keys, Escape)
- Visual selection feedback
-
ErrorDialog Component (0.12.3)
- Error dialog with [R] Retry / [S] Skip / [A] Abort options
- Recoverable vs non-recoverable error handling
- Disabled buttons for non-recoverable errors
- Keyboard input with Escape support
-
Progress Component (0.12.4)
- Progress bar display:
[=====> ] 45% (120/267 files) - Color-coded progress (cyan < 50%, yellow < 100%, green = 100%)
- Configurable width
- Label support for context
- Progress bar display:
Changed
- Total tests: 1254 (unchanged - TUI components excluded from coverage)
- TUI layer now has 8 components + 2 hooks
- All v0.12.0 roadmap items complete
[0.11.0] - 2025-12-01 - TUI Basic
Added
-
TUI Types (0.11.0)
TuiStatus: Status type for TUI display (ready, thinking, tool_call, awaiting_confirmation, error)BranchInfo: Git branch information (name, isDetached)AppProps: Main app component propsStatusBarData: Status bar display data
-
App Shell (0.11.1)
- Main TUI App component with React/Ink
- Session initialization and state management
- Loading and error screens
- Hotkey integration (Ctrl+C, Ctrl+D, Ctrl+Z)
- Session time tracking
-
StatusBar Component (0.11.2)
- Displays:
[ipuaro] [ctx: 12%] [project] [branch] [time] status - Context usage with color warning at >80%
- Git branch with detached HEAD support
- Status indicator with colors (ready=green, thinking=yellow, error=red)
- Displays:
-
Chat Component (0.11.3)
- Message history display with role-based styling
- User messages (green), Assistant messages (cyan), System messages (gray)
- Tool call display with parameters
- Response stats: time, tokens, tool calls
- Thinking indicator during LLM processing
-
Input Component (0.11.4)
- Prompt with
>prefix - History navigation with ↑/↓ arrow keys
- Saved input restoration when navigating past history
- Disabled state during processing
- Custom placeholder support
- Prompt with
-
useSession Hook (0.11.5)
- Session state management with React hooks
- Message handling integration
- Status tracking (ready, thinking, tool_call, error)
- Undo support
- Clear history functionality
- Abort/interrupt support
-
useHotkeys Hook (0.11.6)
- Ctrl+C: Interrupt (1st), Exit (2nd within 1s)
- Ctrl+D: Exit with session save
- Ctrl+Z: Undo last change
Changed
- Total tests: 1254 (was 1174)
- Coverage: 97.75% lines, 92.22% branches
- TUI layer now has 4 components + 2 hooks
- TUI excluded from coverage thresholds (requires React testing setup)
[0.10.0] - 2025-12-01 - Session Management
Added
-
ISessionStorage (0.10.1)
- Session storage service interface
- Methods: saveSession, loadSession, deleteSession, listSessions
- Undo stack management: pushUndoEntry, popUndoEntry, getUndoStack
- Session lifecycle: getLatestSession, sessionExists, touchSession
-
RedisSessionStorage (0.10.2)
- Redis implementation of ISessionStorage
- Session data in Redis hashes (project, history, context, stats)
- Undo stack in Redis lists (max 10 entries)
- Sessions list for project-wide queries
- 22 unit tests
-
ContextManager (0.10.3)
- Manages context window token budget
- File context tracking with addToContext/removeFromContext
- Usage monitoring: getUsage, getAvailableTokens, getRemainingTokens
- Auto-compression at 80% threshold via LLM summarization
- Context state export for session persistence
- 23 unit tests
-
StartSession (0.10.4)
- Use case for session initialization
- Creates new session or loads latest for project
- Optional sessionId for specific session loading
- forceNew option to always create fresh session
- 10 unit tests
-
HandleMessage (0.10.5)
- Main orchestrator use case for message handling
- LLM interaction with tool calling support
- Edit confirmation flow with diff preview
- Error handling with retry/skip/abort choices
- Status tracking: ready, thinking, tool_call, awaiting_confirmation, error
- Event callbacks: onMessage, onToolCall, onToolResult, onConfirmation, onError
- 21 unit tests
-
UndoChange (0.10.6)
- Use case for reverting file changes
- Validates file hasn't changed since edit
- Restores original content from undo entry
- Updates storage after successful undo
- 12 unit tests
Changed
- Total tests: 1174 (was 1086)
- Coverage: 97.73% lines, 92.21% branches
- Application layer now has 4 use cases implemented
- All planned session management features complete
[0.9.0] - 2025-12-01 - Git & Run Tools
Added
-
GitStatusTool (0.9.1)
git_status(): Get current git repository status- Returns branch name, tracking branch, ahead/behind counts
- Lists staged, modified, untracked, and conflicted files
- Detects detached HEAD state
- 29 unit tests
-
GitDiffTool (0.9.2)
git_diff(path?, staged?): Get uncommitted changes- Returns file-by-file diff summary with insertions/deletions
- Full diff text output
- Optional path filter for specific files/directories
- Staged-only mode (
--cached) - Handles binary files
- 25 unit tests
-
GitCommitTool (0.9.3)
git_commit(message, files?): Create a git commit- Requires user confirmation before commit
- Optional file staging before commit
- Returns commit hash, summary, author info
- Validates staged files exist
- 26 unit tests
-
CommandSecurity
- Security module for shell command validation
- Blacklist: dangerous commands always blocked (rm -rf, sudo, git push --force, etc.)
- Whitelist: safe commands allowed without confirmation (npm, node, git status, etc.)
- Classification:
allowed,blocked,requires_confirmation - Git subcommand awareness (safe read operations vs write operations)
- Extensible via
addToBlacklist()andaddToWhitelist() - 65 unit tests
-
RunCommandTool (0.9.4)
run_command(command, timeout?): Execute shell commands- Security-first design with blacklist/whitelist checks
- Blocked commands rejected immediately
- Unknown commands require user confirmation
- Configurable timeout (default 30s, max 10min)
- Output truncation for large outputs
- Returns stdout, stderr, exit code, duration
- 40 unit tests
-
RunTestsTool (0.9.5)
run_tests(path?, filter?, watch?): Run project tests- Auto-detects test runner: vitest, jest, mocha, npm test
- Detects by config files and package.json dependencies
- Path filtering for specific test files/directories
- Name pattern filtering (
-t/--grep) - Watch mode support
- Returns pass/fail status, exit code, output
- 48 unit tests
Changed
- Total tests: 1086 (was 853)
- Coverage: 98.08% lines, 92.21% branches
- Git tools category now fully implemented (3/3 tools)
- Run tools category now fully implemented (2/2 tools)
- All 18 planned tools now implemented
[0.8.0] - 2025-12-01 - Analysis Tools
Added
-
GetDependenciesTool (0.8.1)
get_dependencies(path): Get files that a specific file imports- Returns internal dependencies resolved to file paths
- Includes metadata: exists, isHub, isEntryPoint, fileType
- Sorted by path for consistent output
- 23 unit tests
-
GetDependentsTool (0.8.2)
get_dependents(path): Get files that import a specific file- Shows hub status for the analyzed file
- Includes metadata: isHub, isEntryPoint, fileType, complexityScore
- Sorted by path for consistent output
- 24 unit tests
-
GetComplexityTool (0.8.3)
get_complexity(path?, limit?): Get complexity metrics for files- Returns LOC, nesting depth, cyclomatic complexity, and overall score
- Summary statistics: high/medium/low complexity counts
- Average score calculation
- Sorted by complexity score descending
- Default limit of 20 files
- 31 unit tests
-
GetTodosTool (0.8.4)
get_todos(path?, type?): Find TODO/FIXME/HACK/XXX/BUG/NOTE comments- Supports multiple comment styles:
//,/* */,# - Filter by type (case-insensitive)
- Counts by type
- Includes line context
- 42 unit tests
Changed
- Total tests: 853 (was 733)
- Coverage: 97.91% lines, 92.32% branches
- Analysis tools category now fully implemented (4/4 tools)
[0.7.0] - 2025-12-01 - Search Tools
Added
-
FindReferencesTool (0.7.1)
find_references(symbol, path?): Find all usages of a symbol across the codebase- Word boundary matching with support for special characters (e.g.,
$value) - Context lines around each reference (1 line before/after)
- Marks definition vs usage references
- Optional path filter for scoped searches
- Returns: path, line, column, context, isDefinition
- 37 unit tests
-
FindDefinitionTool (0.7.2)
find_definition(symbol): Find where a symbol is defined- Uses SymbolIndex for fast lookups
- Returns multiple definitions (for overloads/re-exports)
- Suggests similar symbols when not found (Levenshtein distance)
- Context lines around definition (2 lines before/after)
- Returns: path, line, type, context
- 32 unit tests
Changed
- Total tests: 733 (was 664)
- Coverage: 97.71% lines, 91.84% branches
- Search tools category now fully implemented (2/2 tools)
[0.6.0] - 2025-12-01 - Edit Tools
Added
-
EditLinesTool (0.6.1)
edit_lines(path, start, end, content): Replace lines in a file- Hash conflict detection (prevents editing externally modified files)
- Confirmation required with diff preview
- Automatic storage update after edit
- 35 unit tests
-
CreateFileTool (0.6.2)
create_file(path, content): Create new file with content- Automatic directory creation if needed
- Path validation (must be within project root)
- Prevents overwriting existing files
- Confirmation required before creation
- 26 unit tests
-
DeleteFileTool (0.6.3)
delete_file(path): Delete file from filesystem and storage- Removes file data, AST, and meta from Redis
- Confirmation required with file content preview
- 20 unit tests
Changed
- Total tests: 664 (was 540)
- Coverage: 97.71% lines, 91.89% branches
- Coverage thresholds: 95% lines/functions/statements, 90% branches
[0.5.0] - 2025-12-01 - Read Tools
Added
-
ToolRegistry (0.5.1)
IToolRegistryimplementation for managing tool lifecycle- Methods:
register(),unregister(),get(),getAll(),getByCategory(),has() execute(): Tool execution with validation and confirmation flowgetToolDefinitions(): Convert tools to LLM-compatible JSON Schema format- Helper methods:
getConfirmationTools(),getSafeTools(),getNames(),clear() - 34 unit tests
-
GetLinesTool (0.5.2)
get_lines(path, start?, end?): Read file lines with line numbers- Reads from Redis storage or filesystem fallback
- Line number formatting with proper padding
- Path validation (must be within project root)
- 25 unit tests
-
GetFunctionTool (0.5.3)
get_function(path, name): Get function source by name- Uses AST to find exact line range
- Returns metadata: isAsync, isExported, params, returnType
- Lists available functions if target not found
- 20 unit tests
-
GetClassTool (0.5.4)
get_class(path, name): Get class source by name- Uses AST to find exact line range
- Returns metadata: isAbstract, extends, implements, methods, properties
- Lists available classes if target not found
- 19 unit tests
-
GetStructureTool (0.5.5)
get_structure(path?, depth?): Get directory tree- ASCII tree output with 📁/📄 icons
- Filters: node_modules, .git, dist, coverage, etc.
- Directories sorted before files
- Stats: directory and file counts
- 23 unit tests
Changed
- Total tests: 540 (was 419)
- Coverage: 96%+
[0.4.0] - 2025-11-30 - LLM Integration
Added
-
OllamaClient (0.4.1)
- Full
ILLMClientimplementation for Ollama SDK - Chat completion with tool/function calling support
- Token counting via estimation (Ollama has no tokenizer API)
- Model management:
pullModel(),hasModel(),listModels() - Connection status check:
isAvailable() - Request abortion support:
abort() - Error handling with
IpuaroErrorfor connection and model errors - 21 unit tests
- Full
-
System Prompt & Context Builder (0.4.2)
SYSTEM_PROMPT: Comprehensive agent instructions with tool descriptionsbuildInitialContext(): Generates compact project overview from structure and ASTsbuildFileContext(): Detailed file context with imports, exports, functions, classestruncateContext(): Token-aware context truncation- Hub/entry point/complexity flags in file summaries
- 17 unit tests
-
Tool Definitions (0.4.3)
- 18 tool definitions across 6 categories:
- Read:
get_lines,get_function,get_class,get_structure - Edit:
edit_lines,create_file,delete_file - Search:
find_references,find_definition - Analysis:
get_dependencies,get_dependents,get_complexity,get_todos - Git:
git_status,git_diff,git_commit - Run:
run_command,run_tests
- Read:
- Category groupings:
READ_TOOLS,EDIT_TOOLS, etc. CONFIRMATION_TOOLSset for tools requiring user approval- Helper functions:
requiresConfirmation(),getToolDef(),getToolsByCategory() - 39 unit tests
- 18 tool definitions across 6 categories:
-
Response Parser (0.4.4)
- XML tool call parsing:
<tool_call name="...">...</tool_call> - Parameter extraction from XML elements
- Type coercion: boolean, number, null, JSON arrays/objects
extractThinking(): Extracts<thinking>...</thinking>blockshasToolCalls(): Quick check for tool call presencevalidateToolCallParams(): Parameter validation against required listformatToolCallsAsXml(): Tool calls to XML for prompt injection- 21 unit tests
- XML tool call parsing:
Changed
- Total tests: 419 (was 321)
- Coverage: 96.38%
[0.3.1] - 2025-11-30
Added
- VERSION export - Package version is now exported from index.ts, automatically read from package.json via
createRequire
Changed
- 🔄 Refactored ASTParser - Reduced complexity and nesting depth:
- Extracted
extractClassHeritage(),parseHeritageClause(),findTypeIdentifier(),collectImplements()helper methods - Max nesting depth reduced from 5 to 4
- Extracted
- 🔄 Refactored RedisStorage - Removed unnecessary type parameter from
parseJSON()method
Quality
- ✅ Zero lint warnings - All ESLint warnings resolved
- ✅ All 321 tests pass
[0.3.0] - 2025-11-30 - Indexer
Added
-
FileScanner (0.3.1)
- Recursive directory scanning with async generator
.gitignoresupport viaglobby(replacedignorepackage for ESM compatibility)- Filters: binary files, node_modules, dist, default ignore patterns
- Progress callback for UI integration
isTextFile()andreadFileContent()static utilities- 22 unit tests
-
ASTParser (0.3.2)
- Tree-sitter based parsing for TS, TSX, JS, JSX
- Extracts: imports, exports, functions, classes, interfaces, type aliases
- Import classification: internal, external, builtin (using
node:modulebuiltinModules) - Graceful error handling with partial AST on syntax errors
- 30 unit tests
-
MetaAnalyzer (0.3.3)
- Complexity metrics: LOC (excluding comments), nesting depth, cyclomatic complexity, overall score
- Dependency resolution: internal imports resolved to absolute file paths
- Dependents calculation: reverse dependency lookup across all project files
- File type classification: source, test, config, types, unknown
- Entry point detection: index files, main/app/cli/server patterns, files with no dependents
- Hub detection: files with >5 dependents
- Batch analysis via
analyzeAll()method - 54 unit tests
-
IndexBuilder (0.3.4)
- SymbolIndex: maps symbol names to locations for quick lookup (functions, classes, interfaces, types, variables)
- Qualified names for class methods:
ClassName.methodName - DepsGraph: bidirectional import mapping (
importsandimportedBy) - Import resolution: handles
.js→.ts, index.ts, directory imports findSymbol(): exact symbol lookupsearchSymbols(): regex-based symbol searchfindCircularDependencies(): detect import cyclesgetStats(): comprehensive index statistics (symbols by type, hubs, orphans)- 35 unit tests
-
Watchdog (0.3.5)
- File watching with chokidar (native events + polling fallback)
- Debounced change handling (configurable, default 500ms)
- Event types: add, change, unlink
- Extension filtering (default: SUPPORTED_EXTENSIONS)
- Ignore patterns (default: DEFAULT_IGNORE_PATTERNS)
- Multiple callback support
flushAll()for immediate processing- Silent error handling for stability
- 21 unit tests
-
Infrastructure Constants
tree-sitter-types.ts: NodeType and FieldName constants for tree-sitter- Eliminates magic strings in ASTParser
-
Dependencies
- Added
globbyfor ESM-native file globbing - Removed
ignorepackage (CJS incompatibility with nodenext)
- Added
Changed
- Refactored ASTParser to use constants instead of magic strings
- Total tests: 321
- Coverage: 96.43%
[0.2.0] - 2025-01-30
Added
-
Redis Storage (0.2.x milestone)
- RedisClient: connection wrapper with AOF persistence configuration
- RedisStorage: full IStorage implementation with Redis hashes
- Redis key schema: project files, AST, meta, indexes, config
- Session keys schema: data, undo stack, sessions list
generateProjectName()utility for consistent project naming
-
Infrastructure Layer
src/infrastructure/storage/module- Exports via
src/infrastructure/index.ts
-
Testing
- 68 new unit tests for Redis module
- 159 total tests
- 99% code coverage maintained
Changed
- Updated ESLint config:
@typescript-eslint/no-unnecessary-type-parametersset to warn
Notes
Redis Storage milestone complete. Next: 0.3.0 - Indexer (FileScanner, AST Parser, Watchdog)
[0.1.0] - 2025-01-29
Added
-
Project Setup
- package.json with all dependencies (ink, ioredis, tree-sitter, ollama, etc.)
- tsconfig.json for ESM + React JSX
- tsup.config.ts for bundling
- vitest.config.ts with 80% coverage threshold
- CLI entry point (bin/ipuaro.js)
-
Domain Layer
- Entities: Session, Project
- Value Objects: FileData, FileAST, FileMeta, ChatMessage, ToolCall, ToolResult, UndoEntry
- Service Interfaces: IStorage, ILLMClient, ITool, IIndexer
- Constants: supported extensions, ignore patterns, context limits
-
Application Layer
- IToolRegistry interface
- Placeholder structure for use cases and DTOs
-
Shared Module
- Config schema with Zod validation
- Config loader (default.json + .ipuaro.json)
- IpuaroError class with typed errors
- Utility functions: md5 hash, token estimation
- Result type for error handling
-
CLI
- Basic commands: start, init, index (placeholders)
- Commander.js integration
-
Testing
- 91 unit tests
- 100% code coverage
Notes
This is the foundation release. The following features are planned for upcoming versions:
- 0.2.0: Redis Storage
- 0.3.0: Indexer
- 0.4.0: LLM Integration
- 0.5.0+: Tools implementation
- 0.10.0+: TUI and session management