claude-mpm 5.4.65__py3-none-any.whl → 5.4.96__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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (174) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
  3. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +107 -1928
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +82 -686
  6. claude_mpm/cli/__init__.py +5 -1
  7. claude_mpm/cli/commands/agents.py +2 -4
  8. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  9. claude_mpm/cli/commands/autotodos.py +526 -0
  10. claude_mpm/cli/commands/configure.py +620 -21
  11. claude_mpm/cli/commands/monitor.py +2 -2
  12. claude_mpm/cli/commands/mpm_init/core.py +2 -2
  13. claude_mpm/cli/commands/skills.py +166 -14
  14. claude_mpm/cli/executor.py +89 -0
  15. claude_mpm/cli/interactive/__init__.py +10 -0
  16. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  17. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  18. claude_mpm/cli/interactive/skill_selector.py +481 -0
  19. claude_mpm/cli/parsers/base_parser.py +59 -1
  20. claude_mpm/cli/startup.py +184 -358
  21. claude_mpm/cli/startup_display.py +72 -5
  22. claude_mpm/cli/startup_logging.py +2 -2
  23. claude_mpm/commands/mpm-session-resume.md +1 -1
  24. claude_mpm/constants.py +1 -0
  25. claude_mpm/core/claude_runner.py +2 -2
  26. claude_mpm/core/hook_manager.py +51 -3
  27. claude_mpm/core/interactive_session.py +7 -7
  28. claude_mpm/core/output_style_manager.py +21 -13
  29. claude_mpm/core/unified_config.py +50 -8
  30. claude_mpm/core/unified_paths.py +30 -13
  31. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  32. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  33. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
  34. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
  35. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
  36. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
  37. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
  38. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
  39. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
  40. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
  41. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
  42. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
  43. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
  44. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
  45. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
  46. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  47. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  48. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
  49. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
  50. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
  51. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
  52. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
  53. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
  54. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
  55. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
  56. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  57. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
  58. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
  59. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
  60. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
  61. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
  62. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
  63. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
  64. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
  65. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
  66. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
  67. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
  68. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
  69. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
  70. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
  71. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
  72. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
  73. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
  74. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
  75. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  76. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
  77. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
  78. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
  79. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  80. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
  81. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
  82. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
  83. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
  84. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  85. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
  86. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
  87. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  88. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  89. claude_mpm/dashboard/static/svelte-build/index.html +9 -9
  90. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  91. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  92. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  93. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  94. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  95. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  96. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +486 -0
  97. claude_mpm/hooks/claude_hooks/event_handlers.py +216 -11
  98. claude_mpm/hooks/claude_hooks/hook_handler.py +28 -4
  99. claude_mpm/hooks/claude_hooks/response_tracking.py +3 -1
  100. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  101. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  102. claude_mpm/hooks/claude_hooks/services/connection_manager.py +20 -0
  103. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +30 -6
  104. claude_mpm/hooks/session_resume_hook.py +85 -1
  105. claude_mpm/init.py +1 -1
  106. claude_mpm/services/agents/cache_git_manager.py +1 -1
  107. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  108. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
  109. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  110. claude_mpm/services/agents/startup_sync.py +5 -2
  111. claude_mpm/services/cli/__init__.py +3 -0
  112. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  113. claude_mpm/services/cli/session_resume_helper.py +10 -2
  114. claude_mpm/services/delegation_detector.py +175 -0
  115. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  116. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  117. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  118. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  119. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  120. claude_mpm/services/diagnostics/models.py +14 -1
  121. claude_mpm/services/event_log.py +317 -0
  122. claude_mpm/services/infrastructure/__init__.py +4 -0
  123. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  124. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  125. claude_mpm/services/monitor/daemon_manager.py +15 -4
  126. claude_mpm/services/monitor/management/lifecycle.py +8 -2
  127. claude_mpm/services/monitor/server.py +106 -16
  128. claude_mpm/services/pm_skills_deployer.py +177 -83
  129. claude_mpm/services/skills/git_skill_source_manager.py +5 -1
  130. claude_mpm/services/skills/selective_skill_deployer.py +114 -26
  131. claude_mpm/services/socketio/handlers/hook.py +14 -7
  132. claude_mpm/services/socketio/server/main.py +12 -4
  133. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  134. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  135. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  136. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  137. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  138. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  139. claude_mpm/skills/skill_manager.py +4 -4
  140. claude_mpm/utils/agent_dependency_loader.py +4 -2
  141. claude_mpm/utils/robust_installer.py +10 -6
  142. claude_mpm-5.4.96.dist-info/METADATA +377 -0
  143. {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/RECORD +153 -142
  144. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
  145. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
  146. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
  147. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
  148. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
  149. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
  150. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
  151. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
  152. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
  153. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-312.pyc +0 -0
  154. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc +0 -0
  155. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc +0 -0
  156. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc +0 -0
  157. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc +0 -0
  158. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-312.pyc +0 -0
  159. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-312.pyc +0 -0
  160. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-312.pyc +0 -0
  161. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-312.pyc +0 -0
  162. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc +0 -0
  163. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc +0 -0
  164. claude_mpm-5.4.65.dist-info/METADATA +0 -999
  165. /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
  166. /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
  167. /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
  168. /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
  169. /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
  170. {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/WHEEL +0 -0
  171. {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/entry_points.txt +0 -0
  172. {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/licenses/LICENSE +0 -0
  173. {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  174. {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/top_level.txt +0 -0
@@ -91,7 +91,11 @@ def main(argv: Optional[list] = None):
91
91
  )
92
92
 
93
93
  try:
94
- run_background_services()
94
+ # Check for --force-sync flag or environment variable
95
+ force_sync = getattr(args, "force_sync", False) or os.environ.get(
96
+ "CLAUDE_MPM_FORCE_SYNC", "0"
97
+ ) in ("1", "true", "True", "yes")
98
+ run_background_services(force_sync=force_sync)
95
99
  launch_progress.finish(message="Ready")
96
100
 
97
101
  # Inform user about Claude Code initialization delay (3-5 seconds)
@@ -1379,7 +1379,7 @@ class AgentsCommand(AgentCommand):
1379
1379
  return CommandResult.error_result("agent_id is required")
1380
1380
 
1381
1381
  import os
1382
- import subprocess
1382
+ import subprocess # nosec B404
1383
1383
 
1384
1384
  from ...services.agents.local_template_manager import (
1385
1385
  LocalAgentTemplateManager,
@@ -1415,7 +1415,7 @@ class AgentsCommand(AgentCommand):
1415
1415
 
1416
1416
  # Use system editor
1417
1417
  editor = getattr(args, "editor", None) or os.environ.get("EDITOR", "nano")
1418
- subprocess.run([editor, str(template_file)], check=True)
1418
+ subprocess.run([editor, str(template_file)], check=True) # nosec B603
1419
1419
  return CommandResult.success_result(
1420
1420
  f"Agent '{agent_id}' edited successfully"
1421
1421
  )
@@ -1519,8 +1519,6 @@ class AgentsCommand(AgentCommand):
1519
1519
  console.print("For a better experience with integrated configuration:")
1520
1520
  console.print(" • Agent management")
1521
1521
  console.print(" • Skills management")
1522
- console.print(" • Template editing")
1523
- console.print(" • Behavior configuration")
1524
1522
  console.print(" • Startup settings\n")
1525
1523
 
1526
1524
  console.print("Please use: [bold green]claude-mpm config[/bold green]\n")
@@ -0,0 +1,197 @@
1
+ """
2
+ Agent/Skill Reconciliation CLI Command
3
+
4
+ Shows the reconciliation view between configured and deployed agents/skills,
5
+ and performs reconciliation (deploy missing, remove unneeded).
6
+
7
+ Usage:
8
+ claude-mpm agents reconcile [--dry-run] [--show-only]
9
+ claude-mpm skills reconcile [--dry-run] [--show-only]
10
+ """
11
+
12
+ from pathlib import Path
13
+
14
+ from rich.console import Console
15
+ from rich.table import Table
16
+
17
+ from ...core.unified_config import UnifiedConfig
18
+ from ...services.agents.deployment.deployment_reconciler import (
19
+ DeploymentReconciler,
20
+ ReconciliationState,
21
+ )
22
+ from ..shared import BaseCommand, CommandResult
23
+
24
+
25
+ class AgentsReconcileCommand(BaseCommand):
26
+ """CLI command for agent reconciliation."""
27
+
28
+ def __init__(self):
29
+ super().__init__("agents-reconcile")
30
+ self.console = Console()
31
+
32
+ def run(self, args) -> CommandResult:
33
+ """Execute reconciliation."""
34
+ # Load config
35
+ config = UnifiedConfig()
36
+ reconciler = DeploymentReconciler(config)
37
+
38
+ # Get project path
39
+ project_path = Path(getattr(args, "project_path", "."))
40
+
41
+ # Show current state
42
+ if getattr(args, "show_only", False) or getattr(args, "dry_run", False):
43
+ return self._show_reconciliation_view(reconciler, project_path)
44
+
45
+ # Perform reconciliation
46
+ return self._reconcile_agents(reconciler, project_path)
47
+
48
+ def _show_reconciliation_view(
49
+ self, reconciler: DeploymentReconciler, project_path: Path
50
+ ) -> CommandResult:
51
+ """Show reconciliation view without making changes."""
52
+ view = reconciler.get_reconciliation_view(project_path)
53
+ agent_state = view["agents"]
54
+ skill_state = view["skills"]
55
+
56
+ # Display agents table
57
+ self.console.print(
58
+ "\n[bold blue]═══ Agent Reconciliation View ═══[/bold blue]\n"
59
+ )
60
+ agent_table = self._build_reconciliation_table(agent_state, "Agent")
61
+ self.console.print(agent_table)
62
+
63
+ # Display skills table
64
+ self.console.print(
65
+ "\n[bold blue]═══ Skill Reconciliation View ═══[/bold blue]\n"
66
+ )
67
+ skill_table = self._build_reconciliation_table(skill_state, "Skill")
68
+ self.console.print(skill_table)
69
+
70
+ # Show summary
71
+ self._show_summary(agent_state, skill_state)
72
+
73
+ return CommandResult.success_result("Reconciliation view displayed")
74
+
75
+ def _build_reconciliation_table(
76
+ self, state: ReconciliationState, item_type: str
77
+ ) -> Table:
78
+ """Build Rich table for reconciliation state."""
79
+ table = Table(title=f"{item_type} Deployment Status")
80
+
81
+ table.add_column(f"{item_type}", style="cyan", no_wrap=True)
82
+ table.add_column("Configured", style="green")
83
+ table.add_column("Deployed", style="yellow")
84
+ table.add_column("Action", style="magenta")
85
+
86
+ # All items to consider
87
+ all_items = state.configured | state.deployed | state.cached
88
+
89
+ for item_id in sorted(all_items):
90
+ configured = "✓" if item_id in state.configured else "✗"
91
+ deployed = "✓" if item_id in state.deployed else "✗"
92
+
93
+ # Determine action
94
+ if item_id in state.to_deploy:
95
+ if item_id in state.cached:
96
+ action = "Will deploy"
97
+ else:
98
+ action = "[red]Missing in cache![/red]"
99
+ elif item_id in state.to_remove:
100
+ action = "Will remove"
101
+ elif item_id in state.unchanged:
102
+ action = "-"
103
+ elif item_id in state.cached and item_id not in state.configured:
104
+ action = "[dim]Available (not configured)[/dim]"
105
+ else:
106
+ action = "-"
107
+
108
+ table.add_row(item_id, configured, deployed, action)
109
+
110
+ return table
111
+
112
+ def _show_summary(
113
+ self, agent_state: ReconciliationState, skill_state: ReconciliationState
114
+ ) -> None:
115
+ """Show reconciliation summary."""
116
+ self.console.print("\n[bold]Summary:[/bold]")
117
+
118
+ # Agents
119
+ self.console.print("\nAgents:")
120
+ self.console.print(f" Configured: {len(agent_state.configured)}")
121
+ self.console.print(f" Deployed: {len(agent_state.deployed)}")
122
+ self.console.print(f" To deploy: {len(agent_state.to_deploy)}")
123
+ self.console.print(f" To remove: {len(agent_state.to_remove)}")
124
+ self.console.print(f" Unchanged: {len(agent_state.unchanged)}")
125
+
126
+ # Skills
127
+ self.console.print("\nSkills:")
128
+ self.console.print(f" Configured: {len(skill_state.configured)}")
129
+ self.console.print(f" Deployed: {len(skill_state.deployed)}")
130
+ self.console.print(f" To deploy: {len(skill_state.to_deploy)}")
131
+ self.console.print(f" To remove: {len(skill_state.to_remove)}")
132
+ self.console.print(f" Unchanged: {len(skill_state.unchanged)}")
133
+
134
+ # Show next steps
135
+ if agent_state.to_deploy or skill_state.to_deploy:
136
+ self.console.print(
137
+ "\n[yellow]Run without --show-only to perform deployment[/yellow]"
138
+ )
139
+
140
+ def _reconcile_agents(
141
+ self, reconciler: DeploymentReconciler, project_path: Path
142
+ ) -> CommandResult:
143
+ """Perform agent and skill reconciliation."""
144
+ # Show current state first
145
+ self._show_reconciliation_view(reconciler, project_path)
146
+
147
+ self.console.print("\n[bold blue]Performing reconciliation...[/bold blue]\n")
148
+
149
+ # Reconcile agents
150
+ self.console.print("[cyan]Reconciling agents...[/cyan]")
151
+ agent_result = reconciler.reconcile_agents(project_path)
152
+
153
+ if agent_result.deployed:
154
+ self.console.print(
155
+ f" [green]✓ Deployed: {', '.join(agent_result.deployed)}[/green]"
156
+ )
157
+ if agent_result.removed:
158
+ self.console.print(
159
+ f" [yellow]✓ Removed: {', '.join(agent_result.removed)}[/yellow]"
160
+ )
161
+ if agent_result.errors:
162
+ for error in agent_result.errors:
163
+ self.console.print(f" [red]✗ {error}[/red]")
164
+
165
+ # Reconcile skills
166
+ self.console.print("\n[cyan]Reconciling skills...[/cyan]")
167
+ skill_result = reconciler.reconcile_skills(project_path)
168
+
169
+ if skill_result.deployed:
170
+ self.console.print(
171
+ f" [green]✓ Deployed: {', '.join(skill_result.deployed)}[/green]"
172
+ )
173
+ if skill_result.removed:
174
+ self.console.print(
175
+ f" [yellow]✓ Removed: {', '.join(skill_result.removed)}[/yellow]"
176
+ )
177
+ if skill_result.errors:
178
+ for error in skill_result.errors:
179
+ self.console.print(f" [red]✗ {error}[/red]")
180
+
181
+ # Final summary
182
+ total_errors = len(agent_result.errors) + len(skill_result.errors)
183
+ if total_errors == 0:
184
+ self.console.print("\n[bold green]✓ Reconciliation complete![/bold green]")
185
+ return CommandResult.success_result("Reconciliation successful")
186
+ self.console.print(
187
+ f"\n[bold yellow]⚠ Reconciliation complete with {total_errors} errors[/bold yellow]"
188
+ )
189
+ return CommandResult.error_result(f"Reconciliation had {total_errors} errors")
190
+
191
+
192
+ class SkillsReconcileCommand(AgentsReconcileCommand):
193
+ """CLI command for skill reconciliation (alias to agents reconcile)."""
194
+
195
+ def __init__(self):
196
+ BaseCommand.__init__(self, "skills-reconcile")
197
+ self.console = Console()