claude-mpm 3.3.0__py3-none-any.whl → 3.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. claude_mpm/agents/templates/data_engineer.json +1 -1
  2. claude_mpm/agents/templates/documentation.json +1 -1
  3. claude_mpm/agents/templates/engineer.json +1 -1
  4. claude_mpm/agents/templates/ops.json +1 -1
  5. claude_mpm/agents/templates/pm.json +1 -1
  6. claude_mpm/agents/templates/qa.json +1 -1
  7. claude_mpm/agents/templates/research.json +1 -1
  8. claude_mpm/agents/templates/security.json +1 -1
  9. claude_mpm/agents/templates/test_integration.json +112 -0
  10. claude_mpm/agents/templates/version_control.json +1 -1
  11. claude_mpm/cli/commands/memory.py +749 -26
  12. claude_mpm/cli/commands/run.py +115 -14
  13. claude_mpm/cli/parser.py +89 -1
  14. claude_mpm/constants.py +6 -0
  15. claude_mpm/core/claude_runner.py +74 -11
  16. claude_mpm/core/config.py +1 -1
  17. claude_mpm/core/session_manager.py +46 -0
  18. claude_mpm/core/simple_runner.py +74 -11
  19. claude_mpm/hooks/builtin/mpm_command_hook.py +5 -5
  20. claude_mpm/hooks/claude_hooks/hook_handler.py +213 -30
  21. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +9 -2
  22. claude_mpm/hooks/memory_integration_hook.py +51 -5
  23. claude_mpm/services/__init__.py +23 -5
  24. claude_mpm/services/agent_memory_manager.py +800 -71
  25. claude_mpm/services/memory_builder.py +823 -0
  26. claude_mpm/services/memory_optimizer.py +619 -0
  27. claude_mpm/services/memory_router.py +445 -0
  28. claude_mpm/services/project_analyzer.py +771 -0
  29. claude_mpm/services/socketio_server.py +649 -45
  30. claude_mpm/services/version_control/git_operations.py +26 -0
  31. claude_mpm-3.4.0.dist-info/METADATA +183 -0
  32. {claude_mpm-3.3.0.dist-info → claude_mpm-3.4.0.dist-info}/RECORD +36 -52
  33. claude_mpm/agents/agent-template.yaml +0 -83
  34. claude_mpm/agents/templates/test-integration-agent.md +0 -34
  35. claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json +0 -6
  36. claude_mpm/cli/README.md +0 -109
  37. claude_mpm/cli_module/refactoring_guide.md +0 -253
  38. claude_mpm/core/agent_registry.py.bak +0 -312
  39. claude_mpm/core/base_service.py.bak +0 -406
  40. claude_mpm/core/websocket_handler.py +0 -233
  41. claude_mpm/hooks/README.md +0 -97
  42. claude_mpm/orchestration/SUBPROCESS_DESIGN.md +0 -66
  43. claude_mpm/schemas/README_SECURITY.md +0 -92
  44. claude_mpm/schemas/agent_schema.json +0 -395
  45. claude_mpm/schemas/agent_schema_documentation.md +0 -181
  46. claude_mpm/schemas/agent_schema_security_notes.md +0 -165
  47. claude_mpm/schemas/examples/standard_workflow.json +0 -505
  48. claude_mpm/schemas/ticket_workflow_documentation.md +0 -482
  49. claude_mpm/schemas/ticket_workflow_schema.json +0 -590
  50. claude_mpm/services/framework_claude_md_generator/README.md +0 -92
  51. claude_mpm/services/parent_directory_manager/README.md +0 -83
  52. claude_mpm/services/version_control/VERSION +0 -1
  53. claude_mpm/services/websocket_server.py +0 -376
  54. claude_mpm-3.3.0.dist-info/METADATA +0 -432
  55. {claude_mpm-3.3.0.dist-info → claude_mpm-3.4.0.dist-info}/WHEEL +0 -0
  56. {claude_mpm-3.3.0.dist-info → claude_mpm-3.4.0.dist-info}/entry_points.txt +0 -0
  57. {claude_mpm-3.3.0.dist-info → claude_mpm-3.4.0.dist-info}/licenses/LICENSE +0 -0
  58. {claude_mpm-3.3.0.dist-info → claude_mpm-3.4.0.dist-info}/top_level.txt +0 -0
@@ -1,590 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "version": "1.0.0",
4
- "title": "Claude MPM Ticket Workflow Schema",
5
- "description": "Schema definition for ticket workflow management in Claude MPM. This schema enforces the structure and validation rules for ticket status workflows, resolution types, and state transitions.",
6
- "type": "object",
7
- "required": [
8
- "schema_version",
9
- "workflow_id",
10
- "workflow_version",
11
- "metadata",
12
- "status_states",
13
- "resolution_types",
14
- "transitions",
15
- "status_resolution_mapping"
16
- ],
17
- "properties": {
18
- "schema_version": {
19
- "type": "string",
20
- "pattern": "^\\d+\\.\\d+\\.\\d+$",
21
- "description": "Schema version for the ticket workflow format. This ensures compatibility between the workflow definition and the schema validator.",
22
- "examples": ["1.0.0", "1.1.0"]
23
- },
24
- "workflow_id": {
25
- "type": "string",
26
- "pattern": "^[a-z][a-z0-9_]*$",
27
- "description": "Unique workflow identifier used for workflow discovery and loading. This ID must be unique across all workflows in the system.",
28
- "examples": ["standard_workflow", "support_workflow", "bug_tracking_workflow"]
29
- },
30
- "workflow_version": {
31
- "type": "string",
32
- "pattern": "^\\d+\\.\\d+\\.\\d+$",
33
- "description": "Semantic version of the workflow definition itself (not the schema). Increment major for breaking changes, minor for new features, patch for bug fixes.",
34
- "examples": ["1.0.0", "2.1.3"]
35
- },
36
- "metadata": {
37
- "type": "object",
38
- "required": [
39
- "name",
40
- "description",
41
- "workflow_type"
42
- ],
43
- "properties": {
44
- "name": {
45
- "type": "string",
46
- "minLength": 3,
47
- "maxLength": 50,
48
- "description": "Human-readable workflow name displayed in UI and logs."
49
- },
50
- "description": {
51
- "type": "string",
52
- "minLength": 10,
53
- "maxLength": 200,
54
- "description": "Brief description of workflow purpose and use cases."
55
- },
56
- "workflow_type": {
57
- "type": "string",
58
- "enum": ["standard", "support", "bug_tracking", "feature_request", "task_management", "custom"],
59
- "description": "Type of workflow that determines its primary use case and default behaviors."
60
- },
61
- "author": {
62
- "type": "string",
63
- "description": "Workflow author or maintainer"
64
- },
65
- "created_at": {
66
- "type": "string",
67
- "format": "date-time",
68
- "description": "Creation timestamp"
69
- },
70
- "updated_at": {
71
- "type": "string",
72
- "format": "date-time",
73
- "description": "Last update timestamp"
74
- },
75
- "tags": {
76
- "type": "array",
77
- "items": {
78
- "type": "string",
79
- "pattern": "^[a-z][a-z0-9-]*$"
80
- },
81
- "uniqueItems": true,
82
- "description": "Tags for workflow categorization and discovery"
83
- }
84
- }
85
- },
86
- "status_states": {
87
- "type": "object",
88
- "description": "Definition of all possible status states in the workflow. Status tracks the current position in the workflow lifecycle.",
89
- "required": ["states"],
90
- "properties": {
91
- "states": {
92
- "type": "array",
93
- "minItems": 3,
94
- "items": {
95
- "type": "object",
96
- "required": ["id", "name", "description", "category"],
97
- "properties": {
98
- "id": {
99
- "type": "string",
100
- "pattern": "^[a-z][a-z0-9_]*$",
101
- "description": "Unique identifier for the status state"
102
- },
103
- "name": {
104
- "type": "string",
105
- "description": "Display name for the status"
106
- },
107
- "description": {
108
- "type": "string",
109
- "description": "Detailed description of what this status means"
110
- },
111
- "category": {
112
- "type": "string",
113
- "enum": ["initial", "active", "waiting", "terminal"],
114
- "description": "Category of the status for grouping and logic"
115
- },
116
- "is_default": {
117
- "type": "boolean",
118
- "default": false,
119
- "description": "Whether this is the default status for new tickets"
120
- },
121
- "color": {
122
- "type": "string",
123
- "pattern": "^#[0-9A-Fa-f]{6}$",
124
- "description": "Hex color code for UI display"
125
- },
126
- "icon": {
127
- "type": "string",
128
- "description": "Icon identifier for UI display"
129
- },
130
- "sla_hours": {
131
- "type": "integer",
132
- "minimum": 0,
133
- "description": "SLA hours for this status (optional)"
134
- }
135
- }
136
- }
137
- },
138
- "default_status": {
139
- "type": "string",
140
- "description": "ID of the default status for new tickets"
141
- }
142
- }
143
- },
144
- "resolution_types": {
145
- "type": "object",
146
- "description": "Definition of all possible resolution types. Resolution tracks the outcome reasoning of a ticket.",
147
- "required": ["types"],
148
- "properties": {
149
- "types": {
150
- "type": "array",
151
- "minItems": 1,
152
- "items": {
153
- "type": "object",
154
- "required": ["id", "name", "description", "category"],
155
- "properties": {
156
- "id": {
157
- "type": "string",
158
- "pattern": "^[a-z][a-z0-9_]*$",
159
- "description": "Unique identifier for the resolution type"
160
- },
161
- "name": {
162
- "type": "string",
163
- "description": "Display name for the resolution"
164
- },
165
- "description": {
166
- "type": "string",
167
- "description": "Detailed description of what this resolution means"
168
- },
169
- "category": {
170
- "type": "string",
171
- "enum": ["successful", "unsuccessful", "invalid", "deferred"],
172
- "description": "Category of the resolution for reporting and metrics"
173
- },
174
- "requires_comment": {
175
- "type": "boolean",
176
- "default": false,
177
- "description": "Whether a comment is required when using this resolution"
178
- },
179
- "color": {
180
- "type": "string",
181
- "pattern": "^#[0-9A-Fa-f]{6}$",
182
- "description": "Hex color code for UI display"
183
- },
184
- "icon": {
185
- "type": "string",
186
- "description": "Icon identifier for UI display"
187
- }
188
- }
189
- }
190
- }
191
- }
192
- },
193
- "transitions": {
194
- "type": "object",
195
- "description": "Definition of valid state transitions in the workflow",
196
- "required": ["rules"],
197
- "properties": {
198
- "rules": {
199
- "type": "array",
200
- "items": {
201
- "type": "object",
202
- "required": ["from_status", "to_status", "name"],
203
- "properties": {
204
- "from_status": {
205
- "type": "string",
206
- "description": "Source status ID (use '*' for any status)"
207
- },
208
- "to_status": {
209
- "type": "string",
210
- "description": "Target status ID"
211
- },
212
- "name": {
213
- "type": "string",
214
- "description": "Name of the transition action"
215
- },
216
- "description": {
217
- "type": "string",
218
- "description": "Description of the transition"
219
- },
220
- "required_fields": {
221
- "type": "array",
222
- "items": {
223
- "type": "string"
224
- },
225
- "description": "Fields that must be set for this transition"
226
- },
227
- "permissions": {
228
- "type": "array",
229
- "items": {
230
- "type": "string"
231
- },
232
- "description": "Required permissions for this transition"
233
- },
234
- "auto_assign": {
235
- "type": "boolean",
236
- "default": false,
237
- "description": "Whether to auto-assign the ticket during this transition"
238
- },
239
- "triggers": {
240
- "type": "array",
241
- "items": {
242
- "type": "object",
243
- "properties": {
244
- "type": {
245
- "type": "string",
246
- "enum": ["webhook", "notification", "automation"]
247
- },
248
- "config": {
249
- "type": "object"
250
- }
251
- }
252
- },
253
- "description": "Actions triggered by this transition"
254
- }
255
- }
256
- }
257
- },
258
- "allow_self_transitions": {
259
- "type": "boolean",
260
- "default": false,
261
- "description": "Whether tickets can transition to the same status"
262
- }
263
- }
264
- },
265
- "status_resolution_mapping": {
266
- "type": "object",
267
- "description": "Mapping of which resolutions are valid for which statuses",
268
- "required": ["mappings"],
269
- "properties": {
270
- "mappings": {
271
- "type": "array",
272
- "items": {
273
- "type": "object",
274
- "required": ["status_id", "allowed_resolutions"],
275
- "properties": {
276
- "status_id": {
277
- "type": "string",
278
- "description": "Status ID"
279
- },
280
- "allowed_resolutions": {
281
- "type": "array",
282
- "items": {
283
- "type": "string"
284
- },
285
- "description": "List of resolution IDs allowed for this status"
286
- },
287
- "requires_resolution": {
288
- "type": "boolean",
289
- "default": false,
290
- "description": "Whether a resolution is required for this status"
291
- },
292
- "default_resolution": {
293
- "type": "string",
294
- "description": "Default resolution ID for this status"
295
- }
296
- }
297
- }
298
- }
299
- }
300
- },
301
- "business_rules": {
302
- "type": "object",
303
- "description": "Business rules and constraints for the workflow",
304
- "properties": {
305
- "auto_close": {
306
- "type": "object",
307
- "properties": {
308
- "enabled": {
309
- "type": "boolean",
310
- "default": false
311
- },
312
- "days_after_resolved": {
313
- "type": "integer",
314
- "minimum": 1,
315
- "description": "Days after resolution before auto-closing"
316
- },
317
- "excluded_resolutions": {
318
- "type": "array",
319
- "items": {
320
- "type": "string"
321
- },
322
- "description": "Resolution IDs that prevent auto-close"
323
- }
324
- }
325
- },
326
- "reopen_rules": {
327
- "type": "object",
328
- "properties": {
329
- "allow_reopen": {
330
- "type": "boolean",
331
- "default": true
332
- },
333
- "from_statuses": {
334
- "type": "array",
335
- "items": {
336
- "type": "string"
337
- },
338
- "description": "Status IDs from which tickets can be reopened"
339
- },
340
- "max_reopen_count": {
341
- "type": "integer",
342
- "minimum": 0,
343
- "description": "Maximum number of times a ticket can be reopened"
344
- },
345
- "reopen_window_days": {
346
- "type": "integer",
347
- "minimum": 0,
348
- "description": "Days after closing during which reopening is allowed"
349
- }
350
- }
351
- },
352
- "escalation_rules": {
353
- "type": "array",
354
- "items": {
355
- "type": "object",
356
- "required": ["condition", "action"],
357
- "properties": {
358
- "name": {
359
- "type": "string"
360
- },
361
- "condition": {
362
- "type": "object",
363
- "properties": {
364
- "status": {
365
- "type": "string"
366
- },
367
- "hours_in_status": {
368
- "type": "integer"
369
- },
370
- "priority": {
371
- "type": "string"
372
- }
373
- }
374
- },
375
- "action": {
376
- "type": "object",
377
- "properties": {
378
- "change_status": {
379
- "type": "string"
380
- },
381
- "change_priority": {
382
- "type": "string"
383
- },
384
- "notify": {
385
- "type": "array",
386
- "items": {
387
- "type": "string"
388
- }
389
- }
390
- }
391
- }
392
- }
393
- }
394
- }
395
- }
396
- },
397
- "ui_configuration": {
398
- "type": "object",
399
- "description": "UI-specific configuration for the workflow",
400
- "properties": {
401
- "status_display_order": {
402
- "type": "array",
403
- "items": {
404
- "type": "string"
405
- },
406
- "description": "Order in which statuses should be displayed"
407
- },
408
- "resolution_display_order": {
409
- "type": "array",
410
- "items": {
411
- "type": "string"
412
- },
413
- "description": "Order in which resolutions should be displayed"
414
- },
415
- "quick_transitions": {
416
- "type": "array",
417
- "items": {
418
- "type": "object",
419
- "properties": {
420
- "from_status": {
421
- "type": "string"
422
- },
423
- "to_status": {
424
- "type": "string"
425
- },
426
- "button_label": {
427
- "type": "string"
428
- },
429
- "button_style": {
430
- "type": "string",
431
- "enum": ["primary", "secondary", "success", "danger", "warning"]
432
- }
433
- }
434
- },
435
- "description": "Quick action buttons for common transitions"
436
- }
437
- }
438
- },
439
- "metrics": {
440
- "type": "object",
441
- "description": "Metrics and reporting configuration",
442
- "properties": {
443
- "cycle_time_statuses": {
444
- "type": "object",
445
- "properties": {
446
- "start": {
447
- "type": "array",
448
- "items": {
449
- "type": "string"
450
- },
451
- "description": "Status IDs that mark the start of cycle time"
452
- },
453
- "end": {
454
- "type": "array",
455
- "items": {
456
- "type": "string"
457
- },
458
- "description": "Status IDs that mark the end of cycle time"
459
- }
460
- }
461
- },
462
- "resolution_metrics": {
463
- "type": "array",
464
- "items": {
465
- "type": "object",
466
- "properties": {
467
- "name": {
468
- "type": "string"
469
- },
470
- "resolution_ids": {
471
- "type": "array",
472
- "items": {
473
- "type": "string"
474
- }
475
- },
476
- "metric_type": {
477
- "type": "string",
478
- "enum": ["success_rate", "failure_rate", "defect_rate", "satisfaction_rate"]
479
- }
480
- }
481
- }
482
- }
483
- }
484
- }
485
- },
486
- "additionalProperties": false,
487
- "definitions": {
488
- "standard_statuses": {
489
- "description": "Common status states used across different workflow types",
490
- "open": {
491
- "name": "Open/New",
492
- "description": "Ticket has been created but not yet assigned or started",
493
- "category": "initial"
494
- },
495
- "in_progress": {
496
- "name": "In Progress/Assigned",
497
- "description": "Ticket is actively being worked on",
498
- "category": "active"
499
- },
500
- "pending": {
501
- "name": "Pending/Waiting",
502
- "description": "Ticket is waiting for external input or dependencies",
503
- "category": "waiting"
504
- },
505
- "resolved": {
506
- "name": "Resolved",
507
- "description": "Work is complete and solution has been implemented",
508
- "category": "terminal"
509
- },
510
- "closed": {
511
- "name": "Closed",
512
- "description": "Ticket is closed and no further action is required",
513
- "category": "terminal"
514
- },
515
- "reopened": {
516
- "name": "Reopened",
517
- "description": "Previously closed ticket has been reopened",
518
- "category": "active"
519
- },
520
- "on_hold": {
521
- "name": "On Hold",
522
- "description": "Work is temporarily suspended",
523
- "category": "waiting"
524
- },
525
- "escalated": {
526
- "name": "Escalated",
527
- "description": "Ticket has been escalated to higher priority or management",
528
- "category": "active"
529
- },
530
- "canceled": {
531
- "name": "Canceled",
532
- "description": "Ticket has been canceled before completion",
533
- "category": "terminal"
534
- }
535
- },
536
- "standard_resolutions": {
537
- "description": "Common resolution types used across different workflow types",
538
- "fixed": {
539
- "name": "Fixed/Resolved",
540
- "description": "Issue was successfully fixed or request was fulfilled",
541
- "category": "successful"
542
- },
543
- "wont_fix": {
544
- "name": "Won't Fix",
545
- "description": "Decision made not to address the issue",
546
- "category": "unsuccessful"
547
- },
548
- "duplicate": {
549
- "name": "Duplicate",
550
- "description": "Issue is a duplicate of another ticket",
551
- "category": "invalid"
552
- },
553
- "cannot_reproduce": {
554
- "name": "Cannot Reproduce",
555
- "description": "Issue cannot be reproduced or verified",
556
- "category": "invalid"
557
- },
558
- "works_as_designed": {
559
- "name": "Works as Designed",
560
- "description": "Behavior is intentional and not a bug",
561
- "category": "invalid"
562
- },
563
- "incomplete": {
564
- "name": "Incomplete",
565
- "description": "Insufficient information to proceed",
566
- "category": "unsuccessful"
567
- },
568
- "user_error": {
569
- "name": "User Error",
570
- "description": "Issue was due to user error or misunderstanding",
571
- "category": "invalid"
572
- },
573
- "configuration": {
574
- "name": "Configuration",
575
- "description": "Issue was resolved through configuration changes",
576
- "category": "successful"
577
- },
578
- "workaround": {
579
- "name": "Workaround",
580
- "description": "A workaround has been provided",
581
- "category": "successful"
582
- },
583
- "documentation": {
584
- "name": "Documentation",
585
- "description": "Issue was resolved by updating or providing documentation",
586
- "category": "successful"
587
- }
588
- }
589
- }
590
- }
@@ -1,92 +0,0 @@
1
- # Framework CLAUDE.md Generator
2
-
3
- This directory contains the refactored framework CLAUDE.md generator service, originally a single 1,267-line file.
4
-
5
- ## Structure
6
-
7
- ### Core Modules
8
-
9
- - **`__init__.py`** (~250 lines) - Main facade class that coordinates all functionality
10
- - **`version_manager.py`** (~100 lines) - Handles version parsing, incrementing, and comparison
11
- - **`content_assembler.py`** (~120 lines) - Assembles sections and applies template variables
12
- - **`content_validator.py`** (~80 lines) - Validates generated content structure and completeness
13
- - **`deployment_manager.py`** (~80 lines) - Handles deployment to parent directories
14
- - **`section_manager.py`** (~60 lines) - Manages section registration, ordering, and updates
15
-
16
- ### Section Generators
17
-
18
- The `section_generators/` subdirectory contains individual generators for each section:
19
-
20
- - **`__init__.py`** - Base classes and registry
21
- - **`header.py`** - Header with version metadata
22
- - **`role_designation.py`** - AI Assistant role designation
23
- - **`agents.py`** (~570 lines) - Comprehensive agents documentation (largest section)
24
- - **`todo_task_tools.py`** - Todo and Task Tools integration
25
- - **`claude_pm_init.py`** - Claude-PM initialization procedures
26
- - **`orchestration_principles.py`** - Core orchestration principles
27
- - **`subprocess_validation.py`** - Subprocess validation protocol
28
- - **`delegation_constraints.py`** - Critical delegation constraints
29
- - **`environment_config.py`** - Environment configuration
30
- - **`troubleshooting.py`** - Troubleshooting guide
31
- - **`core_responsibilities.py`** - Core responsibilities list
32
- - **`footer.py`** - Footer with metadata
33
-
34
- ## Usage
35
-
36
- The API remains unchanged from the original implementation:
37
-
38
- ```python
39
- from claude_pm.services.framework_claude_md_generator import FrameworkClaudeMdGenerator
40
-
41
- # Create generator instance
42
- generator = FrameworkClaudeMdGenerator()
43
-
44
- # Generate content
45
- content = generator.generate(
46
- current_content=existing_content, # Optional: for version auto-increment
47
- template_variables={'PLATFORM': 'darwin', 'PYTHON_CMD': 'python3'}
48
- )
49
-
50
- # Deploy to parent directory
51
- success, message = generator.deploy_to_parent(Path('/parent/dir'))
52
-
53
- # Update a section
54
- generator.update_section('agents', 'Custom agents content')
55
-
56
- # Add custom section
57
- generator.add_custom_section('custom', 'Custom content', after='agents')
58
- ```
59
-
60
- ## Design Benefits
61
-
62
- 1. **Modularity**: Each concern is separated into its own module
63
- 2. **Maintainability**: Smaller, focused modules are easier to understand and modify
64
- 3. **Testability**: Individual components can be tested in isolation
65
- 4. **Extensibility**: New section generators can be added easily
66
- 5. **Performance**: Section generators are loaded on demand
67
- 6. **Backward Compatibility**: Original API preserved through facade pattern
68
-
69
- ## Section Generator Pattern
70
-
71
- To add a new section generator:
72
-
73
- 1. Create a new file in `section_generators/`
74
- 2. Inherit from `BaseSectionGenerator`
75
- 3. Implement the `generate()` method
76
- 4. Register in `section_generators/__init__.py`
77
-
78
- Example:
79
- ```python
80
- from . import BaseSectionGenerator
81
-
82
- class CustomSectionGenerator(BaseSectionGenerator):
83
- def generate(self, data: Dict[str, Any]) -> str:
84
- return "## Custom Section\n\nContent here..."
85
- ```
86
-
87
- ## Refactoring Summary
88
-
89
- - **Original**: 1,267 lines in a single file
90
- - **Refactored**: ~250 lines in main module + well-organized submodules
91
- - **Total line reduction**: Main module reduced by 80%
92
- - **Improved organization**: 13 focused modules instead of 1 large file