claude-mpm 4.13.2__py3-none-any.whl → 4.18.2__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 (250) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +48 -17
  4. claude_mpm/agents/OUTPUT_STYLE.md +329 -11
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +227 -8
  6. claude_mpm/agents/agent_loader.py +17 -5
  7. claude_mpm/agents/frontmatter_validator.py +284 -253
  8. claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
  9. claude_mpm/agents/templates/api_qa.json +7 -1
  10. claude_mpm/agents/templates/clerk-ops.json +8 -1
  11. claude_mpm/agents/templates/code_analyzer.json +4 -1
  12. claude_mpm/agents/templates/dart_engineer.json +11 -1
  13. claude_mpm/agents/templates/data_engineer.json +11 -1
  14. claude_mpm/agents/templates/documentation.json +6 -1
  15. claude_mpm/agents/templates/engineer.json +18 -1
  16. claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
  17. claude_mpm/agents/templates/golang_engineer.json +11 -1
  18. claude_mpm/agents/templates/java_engineer.json +12 -2
  19. claude_mpm/agents/templates/local_ops_agent.json +1217 -6
  20. claude_mpm/agents/templates/nextjs_engineer.json +11 -1
  21. claude_mpm/agents/templates/ops.json +8 -1
  22. claude_mpm/agents/templates/php-engineer.json +11 -1
  23. claude_mpm/agents/templates/project_organizer.json +10 -3
  24. claude_mpm/agents/templates/prompt-engineer.json +5 -1
  25. claude_mpm/agents/templates/python_engineer.json +11 -1
  26. claude_mpm/agents/templates/qa.json +7 -1
  27. claude_mpm/agents/templates/react_engineer.json +11 -1
  28. claude_mpm/agents/templates/refactoring_engineer.json +8 -1
  29. claude_mpm/agents/templates/research.json +4 -1
  30. claude_mpm/agents/templates/ruby-engineer.json +11 -1
  31. claude_mpm/agents/templates/rust_engineer.json +11 -1
  32. claude_mpm/agents/templates/security.json +6 -1
  33. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  34. claude_mpm/agents/templates/ticketing.json +6 -1
  35. claude_mpm/agents/templates/typescript_engineer.json +11 -1
  36. claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
  37. claude_mpm/agents/templates/version_control.json +8 -1
  38. claude_mpm/agents/templates/web_qa.json +7 -1
  39. claude_mpm/agents/templates/web_ui.json +11 -1
  40. claude_mpm/cli/__init__.py +34 -706
  41. claude_mpm/cli/commands/agent_manager.py +25 -12
  42. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  43. claude_mpm/cli/commands/agents.py +204 -148
  44. claude_mpm/cli/commands/aggregate.py +7 -3
  45. claude_mpm/cli/commands/analyze.py +9 -4
  46. claude_mpm/cli/commands/analyze_code.py +7 -2
  47. claude_mpm/cli/commands/auto_configure.py +7 -9
  48. claude_mpm/cli/commands/config.py +47 -13
  49. claude_mpm/cli/commands/configure.py +294 -1788
  50. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  51. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  52. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  53. claude_mpm/cli/commands/configure_models.py +18 -0
  54. claude_mpm/cli/commands/configure_navigation.py +167 -0
  55. claude_mpm/cli/commands/configure_paths.py +104 -0
  56. claude_mpm/cli/commands/configure_persistence.py +254 -0
  57. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  58. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  59. claude_mpm/cli/commands/configure_validators.py +73 -0
  60. claude_mpm/cli/commands/local_deploy.py +537 -0
  61. claude_mpm/cli/commands/memory.py +54 -20
  62. claude_mpm/cli/commands/mpm_init.py +39 -25
  63. claude_mpm/cli/commands/mpm_init_handler.py +8 -3
  64. claude_mpm/cli/executor.py +202 -0
  65. claude_mpm/cli/helpers.py +105 -0
  66. claude_mpm/cli/interactive/__init__.py +3 -0
  67. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  68. claude_mpm/cli/parsers/__init__.py +7 -1
  69. claude_mpm/cli/parsers/base_parser.py +98 -3
  70. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  71. claude_mpm/cli/shared/output_formatters.py +28 -19
  72. claude_mpm/cli/startup.py +481 -0
  73. claude_mpm/cli/utils.py +52 -1
  74. claude_mpm/commands/mpm-help.md +3 -0
  75. claude_mpm/commands/mpm-version.md +113 -0
  76. claude_mpm/commands/mpm.md +1 -0
  77. claude_mpm/config/agent_config.py +2 -2
  78. claude_mpm/config/model_config.py +428 -0
  79. claude_mpm/core/base_service.py +13 -12
  80. claude_mpm/core/enums.py +452 -0
  81. claude_mpm/core/factories.py +1 -1
  82. claude_mpm/core/instruction_reinforcement_hook.py +2 -1
  83. claude_mpm/core/interactive_session.py +9 -3
  84. claude_mpm/core/logging_config.py +6 -2
  85. claude_mpm/core/oneshot_session.py +8 -4
  86. claude_mpm/core/optimized_agent_loader.py +3 -3
  87. claude_mpm/core/output_style_manager.py +12 -192
  88. claude_mpm/core/service_registry.py +5 -1
  89. claude_mpm/core/types.py +2 -9
  90. claude_mpm/core/typing_utils.py +7 -6
  91. claude_mpm/dashboard/static/js/dashboard.js +0 -14
  92. claude_mpm/dashboard/templates/index.html +3 -41
  93. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  94. claude_mpm/hooks/instruction_reinforcement.py +7 -2
  95. claude_mpm/models/resume_log.py +340 -0
  96. claude_mpm/services/agents/auto_config_manager.py +10 -11
  97. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  98. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  99. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  100. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  101. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  102. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  103. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
  104. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  105. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  106. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
  107. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  108. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  109. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  110. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  111. claude_mpm/services/agents/local_template_manager.py +1 -1
  112. claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
  113. claude_mpm/services/agents/registry/modification_tracker.py +5 -2
  114. claude_mpm/services/command_handler_service.py +11 -5
  115. claude_mpm/services/core/interfaces/__init__.py +74 -2
  116. claude_mpm/services/core/interfaces/health.py +172 -0
  117. claude_mpm/services/core/interfaces/model.py +281 -0
  118. claude_mpm/services/core/interfaces/process.py +372 -0
  119. claude_mpm/services/core/interfaces/restart.py +307 -0
  120. claude_mpm/services/core/interfaces/stability.py +260 -0
  121. claude_mpm/services/core/models/__init__.py +33 -0
  122. claude_mpm/services/core/models/agent_config.py +12 -28
  123. claude_mpm/services/core/models/health.py +162 -0
  124. claude_mpm/services/core/models/process.py +235 -0
  125. claude_mpm/services/core/models/restart.py +302 -0
  126. claude_mpm/services/core/models/stability.py +264 -0
  127. claude_mpm/services/core/path_resolver.py +23 -7
  128. claude_mpm/services/diagnostics/__init__.py +2 -2
  129. claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
  130. claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
  131. claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
  132. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
  133. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  134. claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
  135. claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
  136. claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
  137. claude_mpm/services/diagnostics/checks/mcp_services_check.py +36 -31
  138. claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
  139. claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
  140. claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
  141. claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
  142. claude_mpm/services/diagnostics/models.py +19 -24
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  145. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  146. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  147. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  148. claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
  149. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  150. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  151. claude_mpm/services/local_ops/__init__.py +163 -0
  152. claude_mpm/services/local_ops/crash_detector.py +257 -0
  153. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  154. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  155. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  156. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  157. claude_mpm/services/local_ops/health_manager.py +430 -0
  158. claude_mpm/services/local_ops/log_monitor.py +396 -0
  159. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  160. claude_mpm/services/local_ops/process_manager.py +595 -0
  161. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  162. claude_mpm/services/local_ops/restart_manager.py +401 -0
  163. claude_mpm/services/local_ops/restart_policy.py +387 -0
  164. claude_mpm/services/local_ops/state_manager.py +372 -0
  165. claude_mpm/services/local_ops/unified_manager.py +600 -0
  166. claude_mpm/services/mcp_config_manager.py +9 -4
  167. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  168. claude_mpm/services/mcp_gateway/core/base.py +18 -31
  169. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +71 -24
  170. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
  171. claude_mpm/services/memory_hook_service.py +4 -1
  172. claude_mpm/services/model/__init__.py +147 -0
  173. claude_mpm/services/model/base_provider.py +365 -0
  174. claude_mpm/services/model/claude_provider.py +412 -0
  175. claude_mpm/services/model/model_router.py +453 -0
  176. claude_mpm/services/model/ollama_provider.py +415 -0
  177. claude_mpm/services/monitor/daemon_manager.py +3 -2
  178. claude_mpm/services/monitor/handlers/dashboard.py +2 -1
  179. claude_mpm/services/monitor/handlers/hooks.py +2 -1
  180. claude_mpm/services/monitor/management/lifecycle.py +3 -2
  181. claude_mpm/services/monitor/server.py +2 -1
  182. claude_mpm/services/session_management_service.py +3 -2
  183. claude_mpm/services/session_manager.py +205 -1
  184. claude_mpm/services/shared/async_service_base.py +16 -27
  185. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  186. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  187. claude_mpm/services/socketio/handlers/hook.py +13 -2
  188. claude_mpm/services/socketio/handlers/registry.py +4 -2
  189. claude_mpm/services/socketio/server/main.py +10 -8
  190. claude_mpm/services/subprocess_launcher_service.py +14 -5
  191. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
  192. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
  193. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
  194. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
  195. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
  196. claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
  197. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
  198. claude_mpm/services/unified/deployment_strategies/local.py +6 -5
  199. claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
  200. claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
  201. claude_mpm/services/unified/interfaces.py +3 -1
  202. claude_mpm/services/unified/unified_analyzer.py +14 -10
  203. claude_mpm/services/unified/unified_config.py +2 -1
  204. claude_mpm/services/unified/unified_deployment.py +9 -4
  205. claude_mpm/services/version_service.py +104 -1
  206. claude_mpm/skills/__init__.py +21 -0
  207. claude_mpm/skills/bundled/__init__.py +6 -0
  208. claude_mpm/skills/bundled/api-documentation.md +393 -0
  209. claude_mpm/skills/bundled/async-testing.md +571 -0
  210. claude_mpm/skills/bundled/code-review.md +143 -0
  211. claude_mpm/skills/bundled/database-migration.md +199 -0
  212. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  213. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  214. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  215. claude_mpm/skills/bundled/git-workflow.md +414 -0
  216. claude_mpm/skills/bundled/imagemagick.md +204 -0
  217. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  218. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  219. claude_mpm/skills/bundled/pdf.md +141 -0
  220. claude_mpm/skills/bundled/performance-profiling.md +567 -0
  221. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  222. claude_mpm/skills/bundled/security-scanning.md +327 -0
  223. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  224. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  225. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  226. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  227. claude_mpm/skills/bundled/xlsx.md +157 -0
  228. claude_mpm/skills/registry.py +286 -0
  229. claude_mpm/skills/skill_manager.py +310 -0
  230. claude_mpm/tools/code_tree_analyzer.py +177 -141
  231. claude_mpm/tools/code_tree_events.py +4 -2
  232. claude_mpm/utils/agent_dependency_loader.py +2 -2
  233. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/METADATA +117 -8
  234. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/RECORD +238 -174
  235. claude_mpm/dashboard/static/css/code-tree.css +0 -1639
  236. claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
  237. claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
  238. claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
  239. claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
  240. claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
  241. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
  242. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  243. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
  244. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  245. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  246. claude_mpm/services/project/analyzer_refactored.py +0 -450
  247. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/WHEEL +0 -0
  248. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/entry_points.txt +0 -0
  249. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/licenses/LICENSE +0 -0
  250. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/top_level.txt +0 -0
@@ -23,6 +23,7 @@ from typing import Any, Dict, List, Optional, Tuple
23
23
 
24
24
  import yaml
25
25
 
26
+ from claude_mpm.core.enums import ModelTier
26
27
  from claude_mpm.core.logging_utils import get_logger
27
28
 
28
29
  logger = get_logger(__name__)
@@ -54,33 +55,8 @@ class FrontmatterValidator:
54
55
  - Logging of all corrections made
55
56
  """
56
57
 
57
- # Model name mappings for normalization
58
- MODEL_MAPPINGS = {
59
- # Sonnet variations
60
- "claude-3-5-sonnet-20241022": "sonnet",
61
- "claude-3-5-sonnet-20240620": "sonnet",
62
- "claude-sonnet-4-20250514": "sonnet",
63
- "claude-4-sonnet-20250514": "sonnet",
64
- "claude-3-sonnet-20240229": "sonnet",
65
- "20241022": "sonnet", # Common shorthand - maps to current Sonnet
66
- "20240620": "sonnet", # Previous Sonnet version
67
- "3.5-sonnet": "sonnet",
68
- "sonnet-3.5": "sonnet",
69
- "sonnet-4": "sonnet",
70
- # Opus variations
71
- "claude-3-opus-20240229": "opus",
72
- "claude-opus-4-20250514": "opus",
73
- "claude-4-opus-20250514": "opus",
74
- "3-opus": "opus",
75
- "opus-3": "opus",
76
- "opus-4": "opus",
77
- # Haiku variations
78
- "claude-3-haiku-20240307": "haiku",
79
- "claude-3-5-haiku-20241022": "haiku",
80
- "3-haiku": "haiku",
81
- "haiku-3": "haiku",
82
- "haiku-3.5": "haiku",
83
- }
58
+ # NOTE: Model normalization now handled by ModelTier.normalize()
59
+ # This enum-based approach replaced 26 lines of manual mappings
84
60
 
85
61
  # Tool name corrections (case normalization)
86
62
  TOOL_CORRECTIONS = {
@@ -179,13 +155,44 @@ class FrontmatterValidator:
179
155
  Returns:
180
156
  ValidationResult with validation status and corrected frontmatter
181
157
  """
182
- errors = []
183
- warnings = []
184
- corrections = []
158
+ errors: List[str] = []
159
+ warnings: List[str] = []
160
+ corrections: List[str] = []
185
161
  corrected = frontmatter.copy()
186
- field_corrections = {} # Track only the fields that actually need correction
162
+ field_corrections: Dict[str, Any] = {}
163
+
164
+ # Check required fields
165
+ self._validate_required_fields(corrected, errors)
166
+
167
+ # Validate and correct individual fields
168
+ self._validate_name_field(corrected, field_corrections, errors, corrections)
169
+ self._validate_model_field(corrected, field_corrections, errors, corrections)
170
+ self._validate_tools_field(corrected, field_corrections, warnings, corrections)
171
+ self._validate_version_fields(corrected, field_corrections, errors, corrections)
172
+ self._validate_description_field(corrected, errors, warnings)
173
+ self._validate_category_field(corrected, warnings)
174
+ self._validate_resource_tier_field(corrected, warnings)
175
+ self._validate_color_field(corrected, errors)
176
+ self._validate_author_field(corrected, errors, warnings)
177
+ self._validate_tags_field(corrected, errors, warnings)
178
+ self._validate_numeric_fields(corrected, errors, warnings)
179
+
180
+ # Determine if valid
181
+ is_valid = len(errors) == 0
182
+
183
+ return ValidationResult(
184
+ is_valid=is_valid,
185
+ errors=errors,
186
+ warnings=warnings,
187
+ corrections=corrections,
188
+ corrected_frontmatter=corrected if corrections else None,
189
+ field_corrections=field_corrections if field_corrections else None,
190
+ )
187
191
 
188
- # Required fields check (from schema)
192
+ def _validate_required_fields(
193
+ self, corrected: Dict[str, Any], errors: List[str]
194
+ ) -> None:
195
+ """Check that all required fields are present."""
189
196
  required_fields = (
190
197
  self.schema.get("required", ["name", "description", "version", "model"])
191
198
  if self.schema
@@ -195,227 +202,271 @@ class FrontmatterValidator:
195
202
  if field not in corrected:
196
203
  errors.append(f"Missing required field: {field}")
197
204
 
198
- # Validate and correct name field
199
- if "name" in corrected:
200
- name = corrected["name"]
201
- if not isinstance(name, str):
202
- errors.append(
203
- f"Field 'name' must be a string, got {type(name).__name__}"
204
- )
205
- elif not re.match(r"^[a-z][a-z0-9_]*$", name):
206
- # Try to fix the name
207
- fixed_name = name.lower().replace("-", "_").replace(" ", "_")
208
- fixed_name = re.sub(r"[^a-z0-9_]", "", fixed_name)
209
- if fixed_name and fixed_name[0].isalpha():
210
- corrected["name"] = fixed_name
211
- field_corrections["name"] = fixed_name
212
- corrections.append(
213
- f"Corrected name from '{name}' to '{fixed_name}'"
214
- )
215
- else:
216
- errors.append(f"Invalid name format: {name}")
217
-
218
- # Validate and correct model field
219
- if "model" in corrected:
220
- model = corrected["model"]
221
-
222
- # Convert to string if it's a number (YAML might parse dates as integers)
223
- if isinstance(model, (int, float)):
224
- model = str(model)
225
- corrected["model"] = model
226
- field_corrections["model"] = model
227
- corrections.append(f"Converted model from number to string: {model}")
228
-
229
- if not isinstance(model, str):
230
- errors.append(
231
- f"Field 'model' must be a string, got {type(model).__name__}"
232
- )
205
+ def _validate_name_field(
206
+ self,
207
+ corrected: Dict[str, Any],
208
+ field_corrections: Dict[str, Any],
209
+ errors: List[str],
210
+ corrections: List[str],
211
+ ) -> None:
212
+ """Validate and correct the name field."""
213
+ if "name" not in corrected:
214
+ return
215
+
216
+ name = corrected["name"]
217
+ if not isinstance(name, str):
218
+ errors.append(f"Field 'name' must be a string, got {type(name).__name__}")
219
+ return
220
+
221
+ if not re.match(r"^[a-z][a-z0-9_]*$", name):
222
+ # Try to fix the name
223
+ fixed_name = name.lower().replace("-", "_").replace(" ", "_")
224
+ fixed_name = re.sub(r"[^a-z0-9_]", "", fixed_name)
225
+ if fixed_name and fixed_name[0].isalpha():
226
+ corrected["name"] = fixed_name
227
+ field_corrections["name"] = fixed_name
228
+ corrections.append(f"Corrected name from '{name}' to '{fixed_name}'")
233
229
  else:
234
- normalized_model = self._normalize_model(model)
235
- if normalized_model != model:
236
- corrected["model"] = normalized_model
237
- field_corrections["model"] = normalized_model
238
- corrections.append(
239
- f"Normalized model from '{model}' to '{normalized_model}'"
240
- )
241
-
242
- if normalized_model not in self.VALID_MODELS:
243
- errors.append(
244
- f"Invalid model: {model} (normalized to {normalized_model})"
245
- )
246
-
247
- # Validate and correct tools field
248
- if "tools" in corrected:
249
- tools = corrected["tools"]
250
- corrected_tools, tool_corrections = self._correct_tools(tools)
251
- if tool_corrections:
252
- corrected["tools"] = corrected_tools
253
- field_corrections["tools"] = corrected_tools
254
- corrections.extend(tool_corrections)
255
-
256
- # Validate tool names
257
- invalid_tools = []
258
- for tool in corrected_tools:
259
- if tool not in self.VALID_TOOLS:
260
- # Try to correct the tool name
261
- corrected_tool = self.TOOL_CORRECTIONS.get(tool.lower())
262
- if corrected_tool:
263
- idx = corrected_tools.index(tool)
264
- corrected_tools[idx] = corrected_tool
265
- corrected["tools"] = corrected_tools
266
- field_corrections["tools"] = corrected_tools
267
- corrections.append(
268
- f"Corrected tool '{tool}' to '{corrected_tool}'"
269
- )
270
- else:
271
- invalid_tools.append(tool)
272
-
273
- if invalid_tools:
274
- warnings.append(f"Unknown tools: {', '.join(invalid_tools)}")
230
+ errors.append(f"Invalid name format: {name}")
231
+
232
+ def _validate_model_field(
233
+ self,
234
+ corrected: Dict[str, Any],
235
+ field_corrections: Dict[str, Any],
236
+ errors: List[str],
237
+ corrections: List[str],
238
+ ) -> None:
239
+ """Validate and correct the model field."""
240
+ if "model" not in corrected:
241
+ return
242
+
243
+ model = corrected["model"]
244
+
245
+ # Convert to string if it's a number (YAML might parse dates as integers)
246
+ if isinstance(model, (int, float)):
247
+ model = str(model)
248
+ corrected["model"] = model
249
+ field_corrections["model"] = model
250
+ corrections.append(f"Converted model from number to string: {model}")
251
+
252
+ if not isinstance(model, str):
253
+ errors.append(f"Field 'model' must be a string, got {type(model).__name__}")
254
+ return
255
+
256
+ normalized_model = self._normalize_model(model)
257
+ if normalized_model != model:
258
+ corrected["model"] = normalized_model
259
+ field_corrections["model"] = normalized_model
260
+ corrections.append(
261
+ f"Normalized model from '{model}' to '{normalized_model}'"
262
+ )
275
263
 
276
- # Validate version fields
264
+ if normalized_model not in self.VALID_MODELS:
265
+ errors.append(f"Invalid model: {model} (normalized to {normalized_model})")
266
+
267
+ def _validate_tools_field(
268
+ self,
269
+ corrected: Dict[str, Any],
270
+ field_corrections: Dict[str, Any],
271
+ warnings: List[str],
272
+ corrections: List[str],
273
+ ) -> None:
274
+ """Validate and correct the tools field."""
275
+ if "tools" not in corrected:
276
+ return
277
+
278
+ tools = corrected["tools"]
279
+ corrected_tools, tool_corrections = self._correct_tools(tools)
280
+ if tool_corrections:
281
+ corrected["tools"] = corrected_tools
282
+ field_corrections["tools"] = corrected_tools
283
+ corrections.extend(tool_corrections)
284
+
285
+ # Validate tool names
286
+ invalid_tools = []
287
+ for tool in corrected_tools:
288
+ if tool not in self.VALID_TOOLS:
289
+ # Try to correct the tool name
290
+ corrected_tool = self.TOOL_CORRECTIONS.get(tool.lower())
291
+ if corrected_tool:
292
+ idx = corrected_tools.index(tool)
293
+ corrected_tools[idx] = corrected_tool
294
+ corrected["tools"] = corrected_tools
295
+ field_corrections["tools"] = corrected_tools
296
+ corrections.append(f"Corrected tool '{tool}' to '{corrected_tool}'")
297
+ else:
298
+ invalid_tools.append(tool)
299
+
300
+ if invalid_tools:
301
+ warnings.append(f"Unknown tools: {', '.join(invalid_tools)}")
302
+
303
+ def _validate_version_fields(
304
+ self,
305
+ corrected: Dict[str, Any],
306
+ field_corrections: Dict[str, Any],
307
+ errors: List[str],
308
+ corrections: List[str],
309
+ ) -> None:
310
+ """Validate and correct version fields."""
277
311
  version_fields = ["version", "base_version"]
278
312
  for field in version_fields:
279
- if field in corrected:
280
- version = corrected[field]
281
- if not isinstance(version, str):
282
- errors.append(
283
- f"Field '{field}' must be a string, got {type(version).__name__}"
284
- )
285
- elif not re.match(r"^\d+\.\d+\.\d+$", version):
286
- # Try to fix common version issues
287
- if re.match(r"^\d+\.\d+$", version):
288
- fixed_version = f"{version}.0"
289
- corrected[field] = fixed_version
290
- field_corrections[field] = fixed_version
291
- corrections.append(
292
- f"Fixed {field} from '{version}' to '{fixed_version}'"
293
- )
294
- elif re.match(r"^v?\d+\.\d+\.\d+$", version):
295
- fixed_version = version.lstrip("v")
296
- corrected[field] = fixed_version
297
- field_corrections[field] = fixed_version
298
- corrections.append(
299
- f"Fixed {field} from '{version}' to '{fixed_version}'"
300
- )
301
- else:
302
- errors.append(f"Invalid {field} format: {version}")
313
+ if field not in corrected:
314
+ continue
303
315
 
304
- # Validate description
305
- if "description" in corrected:
306
- desc = corrected["description"]
307
- if not isinstance(desc, str):
316
+ version = corrected[field]
317
+ if not isinstance(version, str):
308
318
  errors.append(
309
- f"Field 'description' must be a string, got {type(desc).__name__}"
310
- )
311
- elif len(desc) < 10:
312
- warnings.append(
313
- f"Description too short ({len(desc)} chars, minimum 10)"
314
- )
315
- elif len(desc) > 200:
316
- warnings.append(
317
- f"Description too long ({len(desc)} chars, maximum 200)"
319
+ f"Field '{field}' must be a string, got {type(version).__name__}"
318
320
  )
321
+ continue
319
322
 
320
- # Validate optional fields
321
- if "category" in corrected:
322
- valid_categories = [
323
- "engineering",
324
- "research",
325
- "quality",
326
- "operations",
327
- "specialized",
328
- ]
329
- if corrected["category"] not in valid_categories:
330
- warnings.append(f"Invalid category: {corrected['category']}")
331
-
332
- if "resource_tier" in corrected:
333
- valid_tiers = ["basic", "standard", "intensive", "lightweight"]
334
- if corrected["resource_tier"] not in valid_tiers:
335
- warnings.append(f"Invalid resource_tier: {corrected['resource_tier']}")
336
-
337
- # Validate color field
338
- if "color" in corrected:
339
- color = corrected["color"]
340
- if not isinstance(color, str):
341
- errors.append(
342
- f"Field 'color' must be a string, got {type(color).__name__}"
343
- )
344
- # Color validation could be expanded to check for valid color names/hex codes
323
+ if re.match(r"^\d+\.\d+\.\d+$", version):
324
+ continue # Valid format
345
325
 
346
- # Validate author field
347
- if "author" in corrected:
348
- author = corrected["author"]
349
- if not isinstance(author, str):
350
- errors.append(
351
- f"Field 'author' must be a string, got {type(author).__name__}"
326
+ # Try to fix common version issues
327
+ if re.match(r"^\d+\.\d+$", version):
328
+ fixed_version = f"{version}.0"
329
+ corrected[field] = fixed_version
330
+ field_corrections[field] = fixed_version
331
+ corrections.append(
332
+ f"Fixed {field} from '{version}' to '{fixed_version}'"
352
333
  )
353
- elif len(author) > 100:
354
- warnings.append(
355
- f"Author field too long ({len(author)} chars, maximum 100)"
334
+ elif re.match(r"^v?\d+\.\d+\.\d+$", version):
335
+ fixed_version = version.lstrip("v")
336
+ corrected[field] = fixed_version
337
+ field_corrections[field] = fixed_version
338
+ corrections.append(
339
+ f"Fixed {field} from '{version}' to '{fixed_version}'"
356
340
  )
357
-
358
- # Validate tags field (supports both list and comma-separated string)
359
- if "tags" in corrected:
360
- tags = corrected["tags"]
361
- if isinstance(tags, str):
362
- # Convert comma-separated string to list for validation
363
- tag_list = [tag.strip() for tag in tags.split(",") if tag.strip()]
364
- elif isinstance(tags, list):
365
- tag_list = tags
366
341
  else:
367
- errors.append(
368
- f"Field 'tags' must be a list or comma-separated string, got {type(tags).__name__}"
342
+ errors.append(f"Invalid {field} format: {version}")
343
+
344
+ def _validate_description_field(
345
+ self, corrected: Dict[str, Any], errors: List[str], warnings: List[str]
346
+ ) -> None:
347
+ """Validate the description field."""
348
+ if "description" not in corrected:
349
+ return
350
+
351
+ desc = corrected["description"]
352
+ if not isinstance(desc, str):
353
+ errors.append(
354
+ f"Field 'description' must be a string, got {type(desc).__name__}"
355
+ )
356
+ elif len(desc) < 10:
357
+ warnings.append(f"Description too short ({len(desc)} chars, minimum 10)")
358
+ elif len(desc) > 200:
359
+ warnings.append(f"Description too long ({len(desc)} chars, maximum 200)")
360
+
361
+ def _validate_category_field(
362
+ self, corrected: Dict[str, Any], warnings: List[str]
363
+ ) -> None:
364
+ """Validate the category field."""
365
+ if "category" not in corrected:
366
+ return
367
+
368
+ valid_categories = [
369
+ "engineering",
370
+ "research",
371
+ "quality",
372
+ "operations",
373
+ "specialized",
374
+ ]
375
+ if corrected["category"] not in valid_categories:
376
+ warnings.append(f"Invalid category: {corrected['category']}")
377
+
378
+ def _validate_resource_tier_field(
379
+ self, corrected: Dict[str, Any], warnings: List[str]
380
+ ) -> None:
381
+ """Validate the resource_tier field."""
382
+ if "resource_tier" not in corrected:
383
+ return
384
+
385
+ valid_tiers = ["basic", "standard", "intensive", "lightweight"]
386
+ if corrected["resource_tier"] not in valid_tiers:
387
+ warnings.append(f"Invalid resource_tier: {corrected['resource_tier']}")
388
+
389
+ def _validate_color_field(
390
+ self, corrected: Dict[str, Any], errors: List[str]
391
+ ) -> None:
392
+ """Validate the color field."""
393
+ if "color" not in corrected:
394
+ return
395
+
396
+ color = corrected["color"]
397
+ if not isinstance(color, str):
398
+ errors.append(f"Field 'color' must be a string, got {type(color).__name__}")
399
+
400
+ def _validate_author_field(
401
+ self, corrected: Dict[str, Any], errors: List[str], warnings: List[str]
402
+ ) -> None:
403
+ """Validate the author field."""
404
+ if "author" not in corrected:
405
+ return
406
+
407
+ author = corrected["author"]
408
+ if not isinstance(author, str):
409
+ errors.append(
410
+ f"Field 'author' must be a string, got {type(author).__name__}"
411
+ )
412
+ elif len(author) > 100:
413
+ warnings.append(f"Author field too long ({len(author)} chars, maximum 100)")
414
+
415
+ def _validate_tags_field(
416
+ self, corrected: Dict[str, Any], errors: List[str], warnings: List[str]
417
+ ) -> None:
418
+ """Validate the tags field."""
419
+ if "tags" not in corrected:
420
+ return
421
+
422
+ tags = corrected["tags"]
423
+ if isinstance(tags, str):
424
+ # Convert comma-separated string to list for validation
425
+ tag_list = [tag.strip() for tag in tags.split(",") if tag.strip()]
426
+ elif isinstance(tags, list):
427
+ tag_list = tags
428
+ else:
429
+ errors.append(
430
+ f"Field 'tags' must be a list or comma-separated string, got {type(tags).__name__}"
431
+ )
432
+ return
433
+
434
+ for tag in tag_list:
435
+ if not isinstance(tag, str):
436
+ errors.append(f"All tags must be strings, found {type(tag).__name__}")
437
+ elif not re.match(r"^[a-z][a-z0-9-]*$", tag):
438
+ warnings.append(
439
+ f"Tag '{tag}' doesn't match recommended pattern (lowercase, alphanumeric with hyphens)"
369
440
  )
370
- tag_list = []
371
-
372
- for tag in tag_list:
373
- if not isinstance(tag, str):
374
- errors.append(
375
- f"All tags must be strings, found {type(tag).__name__}"
376
- )
377
- elif not re.match(r"^[a-z][a-z0-9-]*$", tag):
378
- warnings.append(
379
- f"Tag '{tag}' doesn't match recommended pattern (lowercase, alphanumeric with hyphens)"
380
- )
381
-
382
- # Validate numeric fields
441
+
442
+ def _validate_numeric_fields(
443
+ self, corrected: Dict[str, Any], errors: List[str], warnings: List[str]
444
+ ) -> None:
445
+ """Validate numeric fields (max_tokens, temperature)."""
383
446
  for field_name, (min_val, max_val) in [
384
447
  ("max_tokens", (1000, 200000)),
385
448
  ("temperature", (0, 1)),
386
449
  ]:
387
- if field_name in corrected:
388
- value = corrected[field_name]
389
- if field_name == "temperature" and not isinstance(value, (int, float)):
390
- errors.append(
391
- f"Field '{field_name}' must be a number, got {type(value).__name__}"
392
- )
393
- elif field_name == "max_tokens" and not isinstance(value, int):
394
- errors.append(
395
- f"Field '{field_name}' must be an integer, got {type(value).__name__}"
396
- )
397
- elif isinstance(value, (int, float)) and not (
398
- min_val <= value <= max_val
399
- ):
400
- warnings.append(
401
- f"Field '{field_name}' value {value} outside recommended range [{min_val}, {max_val}]"
402
- )
450
+ if field_name not in corrected:
451
+ continue
403
452
 
404
- # Determine if valid
405
- is_valid = len(errors) == 0
406
-
407
- return ValidationResult(
408
- is_valid=is_valid,
409
- errors=errors,
410
- warnings=warnings,
411
- corrections=corrections,
412
- corrected_frontmatter=corrected if corrections else None,
413
- field_corrections=field_corrections if field_corrections else None,
414
- )
453
+ value = corrected[field_name]
454
+ if field_name == "temperature" and not isinstance(value, (int, float)):
455
+ errors.append(
456
+ f"Field '{field_name}' must be a number, got {type(value).__name__}"
457
+ )
458
+ elif field_name == "max_tokens" and not isinstance(value, int):
459
+ errors.append(
460
+ f"Field '{field_name}' must be an integer, got {type(value).__name__}"
461
+ )
462
+ elif isinstance(value, (int, float)) and not (min_val <= value <= max_val):
463
+ warnings.append(
464
+ f"Field '{field_name}' value {value} outside recommended range [{min_val}, {max_val}]"
465
+ )
415
466
 
416
467
  def _normalize_model(self, model: str) -> str:
417
468
  """
418
- Normalize model name to standard tier (opus, sonnet, haiku).
469
+ Normalize model name to standard tier using ModelTier enum.
419
470
 
420
471
  Args:
421
472
  model: Original model name
@@ -423,27 +474,7 @@ class FrontmatterValidator:
423
474
  Returns:
424
475
  Normalized model tier name
425
476
  """
426
- # Direct mapping check
427
- if model in self.MODEL_MAPPINGS:
428
- return self.MODEL_MAPPINGS[model]
429
-
430
- # Already normalized
431
- if model in self.VALID_MODELS:
432
- return model
433
-
434
- # Try case-insensitive match
435
- model_lower = model.lower()
436
- if model_lower in self.VALID_MODELS:
437
- return model_lower
438
-
439
- # Check if model contains tier name
440
- for tier in self.VALID_MODELS:
441
- if tier in model_lower:
442
- return tier
443
-
444
- # Default to sonnet if unrecognized
445
- logger.warning(f"Unrecognized model '{model}', defaulting to 'sonnet'")
446
- return "sonnet"
477
+ return ModelTier.normalize(model).value
447
478
 
448
479
  def _correct_tools(self, tools: Any) -> Tuple[List[str], List[str]]:
449
480
  """
@@ -72,7 +72,7 @@
72
72
  ]
73
73
  }
74
74
  },
75
- "instructions": "# Agentic Coder Optimizer\n\n**Inherits from**: BASE_AGENT_TEMPLATE.md\n**Focus**: Project optimization for agentic coders and Claude Code\n\n## Core Mission\n\nOptimize projects for Claude Code and other agentic coders by establishing clear, single-path project standards. Implement the \"ONE way to do ANYTHING\" principle with comprehensive documentation and discoverable workflows.\n\n## Core Responsibilities\n\n### 1. Project Documentation Structure\n- **CLAUDE.md**: Brief description + links to key documentation\n- **Documentation Hierarchy**:\n - README.md (project overview and entry point)\n - CLAUDE.md (agentic coder instructions)\n - CODE.md (coding standards)\n - DEVELOPER.md (developer guide)\n - USER.md (user guide)\n - OPS.md (operations guide)\n - DEPLOY.md (deployment procedures)\n - STRUCTURE.md (project structure)\n- **Link Validation**: Ensure all docs are properly linked and discoverable\n\n### 2. Build and Deployment Optimization\n- **Standardize Scripts**: Review and unify build/make/deploy scripts\n- **Single Path Establishment**:\n - Building the project: `make build` or single command\n - Running locally: `make dev` or `make start`\n - Deploying to production: `make deploy`\n - Publishing packages: `make publish`\n- **Clear Documentation**: Each process documented with examples\n\n### 3. Code Quality Tooling\n- **Unified Quality Commands**:\n - Linting with auto-fix: `make lint-fix`\n - Type checking: `make typecheck`\n - Code formatting: `make format`\n - All quality checks: `make quality`\n- **Pre-commit Integration**: Set up automated quality gates\n\n### 4. Version Management\n- **Semantic Versioning**: Implement proper semver\n- **Automated Build Numbers**: Set up build number tracking\n- **Version Workflow**: Clear process for version bumps\n- **Documentation**: Version management procedures\n\n### 5. Testing Framework\n- **Clear Structure**:\n - Unit tests: `make test-unit`\n - Integration tests: `make test-integration`\n - End-to-end tests: `make test-e2e`\n - All tests: `make test`\n- **Coverage Goals**: Establish and document targets\n- **Testing Requirements**: Clear guidelines and examples\n\n### 6. Developer Experience\n- **5-Minute Setup**: Ensure rapid onboarding\n- **Getting Started Guide**: Works immediately\n- **Contribution Guidelines**: Clear and actionable\n- **Development Environment**: Standardized tooling\n\n### 7. API Documentation Strategy\n\n#### OpenAPI/Swagger Decision Framework\n\n**Use OpenAPI/Swagger When:**\n- Multiple consumer teams need formal API contracts\n- SDK generation is required across multiple languages\n- Compliance requirements demand formal API specification\n- API gateway integration requires OpenAPI specs\n- Large, complex APIs benefit from formal structure\n\n**Consider Alternatives When:**\n- Full-stack TypeScript enables end-to-end type safety\n- Internal APIs with limited consumers\n- Rapid prototyping where specification overhead slows development\n- GraphQL better matches your data access patterns\n- Documentation experience is more important than technical specification\n\n**Hybrid Approach When:**\n- Public APIs need both technical specs and great developer experience\n- Migration scenarios from existing Swagger implementations\n- Team preferences vary across different API consumers\n\n**Current Best Practice:**\nThe most effective approach combines specification with enhanced developer experience:\n- **Generate, don't write**: Use code-first tools that auto-generate specs\n- **Layer documentation**: OpenAPI for contracts, enhanced platforms for developer experience\n- **Validate continuously**: Ensure specs stay synchronized with implementation\n- **Consider context**: Match tooling to team size, API complexity, and consumer needs\n\nOpenAPI/Swagger isn't inherently the \"best\" solution\u2014it's one tool in a mature ecosystem. The optimal choice depends on your specific context, team preferences, and architectural constraints\n\n## Key Principles\n\n- **One Way Rule**: Exactly ONE method for each task\n- **Discoverability**: Everything findable from README.md and CLAUDE.md\n- **Tool Agnostic**: Work with any toolchain while enforcing best practices\n- **Clear Documentation**: Every process documented with examples\n- **Automation First**: Prefer automated over manual processes\n- **Agentic-Friendly**: Optimized for AI agent understanding\n\n## Optimization Protocol\n\n### Phase 1: Project Analysis\n```bash\n# Analyze current state\nfind . -name \"README*\" -o -name \"CLAUDE*\" -o -name \"*.md\" | head -20\nls -la Makefile package.json pyproject.toml setup.py 2>/dev/null\ngrep -r \"script\" package.json pyproject.toml 2>/dev/null | head -10\n```\n\n### Phase 2: Documentation Audit\n```bash\n# Check documentation structure\nfind . -maxdepth 2 -name \"*.md\" | sort\ngrep -l \"getting.started\\|quick.start\\|setup\" *.md docs/*.md 2>/dev/null\ngrep -l \"build\\|deploy\\|install\" *.md docs/*.md 2>/dev/null\n```\n\n### Phase 3: Tooling Assessment\n```bash\n# Check existing tooling\nls -la .pre-commit-config.yaml .github/workflows/ Makefile 2>/dev/null\ngrep -r \"lint\\|format\\|test\" Makefile package.json 2>/dev/null | head -15\nfind . -name \"*test*\" -type d | head -10\n```\n\n### Phase 4: Implementation Plan\n1. **Gap Identification**: Document missing components\n2. **Priority Matrix**: Critical path vs. nice-to-have\n3. **Implementation Order**: Dependencies and prerequisites\n4. **Validation Plan**: How to verify each improvement\n\n## Optimization Categories\n\n### Documentation Optimization\n- **Structure Standardization**: Consistent hierarchy\n- **Link Validation**: All references work\n- **Content Quality**: Clear, actionable instructions\n- **Navigation**: Easy discovery of information\n\n### Workflow Optimization\n- **Command Unification**: Single commands for common tasks\n- **Script Consolidation**: Reduce complexity\n- **Automation Setup**: Reduce manual steps\n- **Error Prevention**: Guard rails and validation\n\n### Quality Integration\n- **Linting Setup**: Automated code quality\n- **Testing Framework**: Comprehensive coverage\n- **CI/CD Integration**: Automated quality gates\n- **Pre-commit Hooks**: Prevent quality issues\n\n## Success Metrics\n\n- **Understanding Time**: New developer/agent productive in <10 minutes\n- **Task Clarity**: Zero ambiguity in task execution\n- **Documentation Sync**: Docs match implementation 100%\n- **Command Consistency**: Single command per task type\n- **Onboarding Success**: New contributors productive immediately\n\n## Memory Categories\n\n**Project Patterns**: Common structures and conventions\n**Tool Configurations**: Makefile, package.json, build scripts\n**Documentation Standards**: Successful hierarchy patterns\n**Quality Setups**: Working lint/test/format configurations\n**Workflow Optimizations**: Proven command patterns\n\n## Optimization Standards\n\n- **Simplicity**: Prefer simple over complex solutions\n- **Consistency**: Same pattern across similar projects\n- **Documentation**: Every optimization must be documented\n- **Testing**: All workflows must be testable\n- **Maintainability**: Solutions must be sustainable\n\n## Example Transformations\n\n**Before**: \"Run npm test or yarn test or make test or pytest\"\n**After**: \"Run: `make test`\"\n\n**Before**: Scattered docs in multiple locations\n**After**: Organized hierarchy with clear navigation from README.md\n\n**Before**: Multiple build methods with different flags\n**After**: Single `make build` command with consistent behavior\n\n**Before**: Unclear formatting rules and multiple tools\n**After**: Single `make format` command that handles everything\n\n## Workflow Integration\n\n### Project Health Checks\nRun periodic assessments to identify optimization opportunities:\n```bash\n# Documentation completeness\n# Command standardization\n# Quality gate effectiveness\n# Developer experience metrics\n```\n\n### Continuous Optimization\n- Monitor for workflow drift\n- Update documentation as project evolves\n- Refine automation based on usage patterns\n- Gather feedback from developers and agents\n\n## Handoff Protocols\n\n**To Engineer**: Implementation of optimized tooling\n**To Documentation**: Content creation and updates\n**To QA**: Validation of optimization effectiveness\n**To Project Organizer**: Structural improvements\n\nAlways provide clear, actionable handoff instructions with specific files and requirements.",
75
+ "instructions": "# Agentic Coder Optimizer\n\n**Inherits from**: BASE_AGENT_TEMPLATE.md\n**Focus**: Project optimization for agentic coders and Claude Code\n\n## Core Mission\n\nOptimize projects for Claude Code and other agentic coders by establishing clear, single-path project standards. Implement the \"ONE way to do ANYTHING\" principle with comprehensive documentation and discoverable workflows.\n\n## Core Responsibilities\n\n### 1. Project Documentation Structure\n- **CLAUDE.md**: Brief description + links to key documentation\n- **Documentation Hierarchy**:\n - README.md (project overview and entry point)\n - CLAUDE.md (agentic coder instructions)\n - CODE.md (coding standards)\n - DEVELOPER.md (developer guide)\n - USER.md (user guide)\n - OPS.md (operations guide)\n - DEPLOY.md (deployment procedures)\n - STRUCTURE.md (project structure)\n- **Link Validation**: Ensure all docs are properly linked and discoverable\n\n### 2. Build and Deployment Optimization\n- **Standardize Scripts**: Review and unify build/make/deploy scripts\n- **Single Path Establishment**:\n - Building the project: `make build` or single command\n - Running locally: `make dev` or `make start`\n - Deploying to production: `make deploy`\n - Publishing packages: `make publish`\n- **Clear Documentation**: Each process documented with examples\n\n### 3. Code Quality Tooling\n- **Unified Quality Commands**:\n - Linting with auto-fix: `make lint-fix`\n - Type checking: `make typecheck`\n - Code formatting: `make format`\n - All quality checks: `make quality`\n- **Pre-commit Integration**: Set up automated quality gates\n\n### 4. Version Management\n- **Semantic Versioning**: Implement proper semver\n- **Automated Build Numbers**: Set up build number tracking\n- **Version Workflow**: Clear process for version bumps\n- **Documentation**: Version management procedures\n\n### 5. Testing Framework\n- **Clear Structure**:\n - Unit tests: `make test-unit`\n - Integration tests: `make test-integration`\n - End-to-end tests: `make test-e2e`\n - All tests: `make test`\n- **Coverage Goals**: Establish and document targets\n- **Testing Requirements**: Clear guidelines and examples\n\n### 6. Developer Experience\n- **5-Minute Setup**: Ensure rapid onboarding\n- **Getting Started Guide**: Works immediately\n- **Contribution Guidelines**: Clear and actionable\n- **Development Environment**: Standardized tooling\n\n### 7. API Documentation Strategy\n\n#### OpenAPI/Swagger Decision Framework\n\n**Use OpenAPI/Swagger When:**\n- Multiple consumer teams need formal API contracts\n- SDK generation is required across multiple languages\n- Compliance requirements demand formal API specification\n- API gateway integration requires OpenAPI specs\n- Large, complex APIs benefit from formal structure\n\n**Consider Alternatives When:**\n- Full-stack TypeScript enables end-to-end type safety\n- Internal APIs with limited consumers\n- Rapid prototyping where specification overhead slows development\n- GraphQL better matches your data access patterns\n- Documentation experience is more important than technical specification\n\n**Hybrid Approach When:**\n- Public APIs need both technical specs and great developer experience\n- Migration scenarios from existing Swagger implementations\n- Team preferences vary across different API consumers\n\n**Current Best Practice:**\nThe most effective approach combines specification with enhanced developer experience:\n- **Generate, don't write**: Use code-first tools that auto-generate specs\n- **Layer documentation**: OpenAPI for contracts, enhanced platforms for developer experience\n- **Validate continuously**: Ensure specs stay synchronized with implementation\n- **Consider context**: Match tooling to team size, API complexity, and consumer needs\n\nOpenAPI/Swagger isn't inherently the \"best\" solution\u2014it's one tool in a mature ecosystem. The optimal choice depends on your specific context, team preferences, and architectural constraints\n\n## Key Principles\n\n- **One Way Rule**: Exactly ONE method for each task\n- **Discoverability**: Everything findable from README.md and CLAUDE.md\n- **Tool Agnostic**: Work with any toolchain while enforcing best practices\n- **Clear Documentation**: Every process documented with examples\n- **Automation First**: Prefer automated over manual processes\n- **Agentic-Friendly**: Optimized for AI agent understanding\n\n## Optimization Protocol\n\n### Phase 1: Project Analysis\n```bash\n# Analyze current state\nfind . -name \"README*\" -o -name \"CLAUDE*\" -o -name \"*.md\" | head -20\nls -la Makefile package.json pyproject.toml setup.py 2>/dev/null\ngrep -r \"script\" package.json pyproject.toml 2>/dev/null | head -10\n```\n\n### Phase 2: Documentation Audit\n```bash\n# Check documentation structure\nfind . -maxdepth 2 -name \"*.md\" | sort\ngrep -l \"getting.started\\|quick.start\\|setup\" *.md docs/*.md 2>/dev/null\ngrep -l \"build\\|deploy\\|install\" *.md docs/*.md 2>/dev/null\n```\n\n### Phase 3: Tooling Assessment\n```bash\n# Check existing tooling\nls -la .pre-commit-config.yaml .github/workflows/ Makefile 2>/dev/null\ngrep -r \"lint\\|format\\|test\" Makefile package.json 2>/dev/null | head -15\nfind . -name \"*test*\" -type d | head -10\n```\n\n### Phase 4: Implementation Plan\n1. **Gap Identification**: Document missing components\n2. **Priority Matrix**: Critical path vs. nice-to-have\n3. **Implementation Order**: Dependencies and prerequisites\n4. **Validation Plan**: How to verify each improvement\n\n## Optimization Categories\n\n### Documentation Optimization\n- **Structure Standardization**: Consistent hierarchy\n- **Link Validation**: All references work\n- **Content Quality**: Clear, actionable instructions\n- **Navigation**: Easy discovery of information\n\n### Workflow Optimization\n- **Command Unification**: Single commands for common tasks\n- **Script Consolidation**: Reduce complexity\n- **Automation Setup**: Reduce manual steps\n- **Error Prevention**: Guard rails and validation\n\n### Quality Integration\n- **Linting Setup**: Automated code quality\n- **Testing Framework**: Comprehensive coverage\n- **CI/CD Integration**: Automated quality gates\n- **Pre-commit Hooks**: Prevent quality issues\n\n## Success Metrics\n\n- **Understanding Time**: New developer/agent productive in <10 minutes\n- **Task Clarity**: Zero ambiguity in task execution\n- **Documentation Sync**: Docs match implementation 100%\n- **Command Consistency**: Single command per task type\n- **Onboarding Success**: New contributors productive immediately\n\n## Memory File Format\n\n**CRITICAL**: Memories MUST be stored as markdown files, NOT JSON.\n\n**Correct format**:\n- File: `.claude-mpm/memories/agentic-coder-optimizer_memories.md`\n- Format: Markdown (.md)\n- Structure: Flat list with markdown headers\n\n**Example**:\n```markdown\n# Agent Memory: agentic-coder-optimizer\n\n## Project Patterns\n- Pattern learned from project X\n- Convention observed in project Y\n\n## Tool Configurations \n- Makefile pattern that worked well\n- Package.json script structure\n```\n\n**DO NOT create**:\n- \u274c `.claude-mpm/memories/project-architecture.json`\n- \u274c `.claude-mpm/memories/implementation-guidelines.json` \n- \u274c Any JSON-formatted memory files\n\n**ALWAYS use**: `.claude-mpm/memories/agentic-coder-optimizer_memories.md`\n\n## Memory Categories\n\n**Project Patterns**: Common structures and conventions\n**Tool Configurations**: Makefile, package.json, build scripts\n**Documentation Standards**: Successful hierarchy patterns\n**Quality Setups**: Working lint/test/format configurations\n**Workflow Optimizations**: Proven command patterns\n\n## Optimization Standards\n\n- **Simplicity**: Prefer simple over complex solutions\n- **Consistency**: Same pattern across similar projects\n- **Documentation**: Every optimization must be documented\n- **Testing**: All workflows must be testable\n- **Maintainability**: Solutions must be sustainable\n\n## Example Transformations\n\n**Before**: \"Run npm test or yarn test or make test or pytest\"\n**After**: \"Run: `make test`\"\n\n**Before**: Scattered docs in multiple locations\n**After**: Organized hierarchy with clear navigation from README.md\n\n**Before**: Multiple build methods with different flags\n**After**: Single `make build` command with consistent behavior\n\n**Before**: Unclear formatting rules and multiple tools\n**After**: Single `make format` command that handles everything\n\n## Workflow Integration\n\n### Project Health Checks\nRun periodic assessments to identify optimization opportunities:\n```bash\n# Documentation completeness\n# Command standardization\n# Quality gate effectiveness\n# Developer experience metrics\n```\n\n### Continuous Optimization\n- Monitor for workflow drift\n- Update documentation as project evolves\n- Refine automation based on usage patterns\n- Gather feedback from developers and agents\n\n## Handoff Protocols\n\n**To Engineer**: Implementation of optimized tooling\n**To Documentation**: Content creation and updates\n**To QA**: Validation of optimization effectiveness\n**To Project Organizer**: Structural improvements\n\nAlways provide clear, actionable handoff instructions with specific files and requirements.",
76
76
  "knowledge": {
77
77
  "domain_expertise": [
78
78
  "Project structure optimization",
@@ -237,5 +237,12 @@
237
237
  "git"
238
238
  ],
239
239
  "optional": false
240
- }
240
+ },
241
+ "skills": [
242
+ "docker-containerization",
243
+ "database-migration",
244
+ "security-scanning",
245
+ "git-workflow",
246
+ "systematic-debugging"
247
+ ]
241
248
  }