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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +107 -1928
- claude_mpm/agents/PM_INSTRUCTIONS.md +82 -686
- claude_mpm/cli/__init__.py +5 -1
- claude_mpm/cli/commands/agents.py +2 -4
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/autotodos.py +526 -0
- claude_mpm/cli/commands/configure.py +620 -21
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +2 -2
- claude_mpm/cli/commands/skills.py +166 -14
- claude_mpm/cli/executor.py +89 -0
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +30 -50
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/base_parser.py +59 -1
- claude_mpm/cli/startup.py +184 -358
- claude_mpm/cli/startup_display.py +72 -5
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/commands/mpm-session-resume.md +1 -1
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +2 -2
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +7 -7
- claude_mpm/core/output_style_manager.py +21 -13
- claude_mpm/core/unified_config.py +50 -8
- claude_mpm/core/unified_paths.py +30 -13
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
- claude_mpm/dashboard/static/svelte-build/index.html +9 -9
- claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
- claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +486 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +216 -11
- claude_mpm/hooks/claude_hooks/hook_handler.py +28 -4
- claude_mpm/hooks/claude_hooks/response_tracking.py +3 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +20 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +30 -6
- claude_mpm/hooks/session_resume_hook.py +85 -1
- claude_mpm/init.py +1 -1
- claude_mpm/services/agents/cache_git_manager.py +1 -1
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/startup_sync.py +5 -2
- claude_mpm/services/cli/__init__.py +3 -0
- claude_mpm/services/cli/incremental_pause_manager.py +561 -0
- claude_mpm/services/cli/session_resume_helper.py +10 -2
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
- claude_mpm/services/diagnostics/models.py +14 -1
- claude_mpm/services/event_log.py +317 -0
- claude_mpm/services/infrastructure/__init__.py +4 -0
- claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
- claude_mpm/services/monitor/daemon_manager.py +15 -4
- claude_mpm/services/monitor/management/lifecycle.py +8 -2
- claude_mpm/services/monitor/server.py +106 -16
- claude_mpm/services/pm_skills_deployer.py +177 -83
- claude_mpm/services/skills/git_skill_source_manager.py +5 -1
- claude_mpm/services/skills/selective_skill_deployer.py +114 -26
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
- claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
- claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
- claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
- claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/skill_manager.py +4 -4
- claude_mpm/utils/agent_dependency_loader.py +4 -2
- claude_mpm/utils/robust_installer.py +10 -6
- claude_mpm-5.4.96.dist-info/METADATA +377 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/RECORD +153 -142
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-312.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-312.pyc +0 -0
- claude_mpm-5.4.65.dist-info/METADATA +0 -999
- /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.65.dist-info → claude_mpm-5.4.96.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Startup Reconciliation Hook
|
|
3
|
+
|
|
4
|
+
This module provides a hook for performing agent/skill reconciliation
|
|
5
|
+
during application startup, ensuring deployed state matches configuration.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
from claude_mpm.services.agents.deployment.startup_reconciliation import (
|
|
9
|
+
perform_startup_reconciliation
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
# In your startup code
|
|
13
|
+
perform_startup_reconciliation()
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Optional
|
|
18
|
+
|
|
19
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
20
|
+
from claude_mpm.core.unified_config import UnifiedConfig
|
|
21
|
+
|
|
22
|
+
from .deployment_reconciler import DeploymentReconciler, DeploymentResult
|
|
23
|
+
|
|
24
|
+
logger = get_logger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def perform_startup_reconciliation(
|
|
28
|
+
project_path: Optional[Path] = None,
|
|
29
|
+
config: Optional[UnifiedConfig] = None,
|
|
30
|
+
silent: bool = False,
|
|
31
|
+
) -> tuple[DeploymentResult, DeploymentResult]:
|
|
32
|
+
"""
|
|
33
|
+
Perform agent and skill reconciliation during startup.
|
|
34
|
+
|
|
35
|
+
This ensures the deployed state (.claude/agents, .claude/skills) matches
|
|
36
|
+
the configuration (agents.enabled, skills.enabled lists).
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
project_path: Project directory (default: current directory)
|
|
40
|
+
config: Configuration instance (auto-loads if None)
|
|
41
|
+
silent: Suppress info logging (only errors)
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Tuple of (agent_result, skill_result)
|
|
45
|
+
"""
|
|
46
|
+
project_path = project_path or Path.cwd()
|
|
47
|
+
|
|
48
|
+
# Load config if not provided
|
|
49
|
+
if config is None:
|
|
50
|
+
config = UnifiedConfig()
|
|
51
|
+
|
|
52
|
+
# Initialize reconciler
|
|
53
|
+
reconciler = DeploymentReconciler(config)
|
|
54
|
+
|
|
55
|
+
if not silent:
|
|
56
|
+
logger.info("Performing startup reconciliation...")
|
|
57
|
+
|
|
58
|
+
# Reconcile agents
|
|
59
|
+
agent_result = reconciler.reconcile_agents(project_path)
|
|
60
|
+
|
|
61
|
+
if agent_result.deployed and not silent:
|
|
62
|
+
logger.info(f"Deployed agents: {', '.join(agent_result.deployed)}")
|
|
63
|
+
if agent_result.removed and not silent:
|
|
64
|
+
logger.info(f"Removed agents: {', '.join(agent_result.removed)}")
|
|
65
|
+
if agent_result.errors:
|
|
66
|
+
for error in agent_result.errors:
|
|
67
|
+
logger.error(f"Agent reconciliation error: {error}")
|
|
68
|
+
|
|
69
|
+
# Reconcile skills
|
|
70
|
+
skill_result = reconciler.reconcile_skills(project_path)
|
|
71
|
+
|
|
72
|
+
if skill_result.deployed and not silent:
|
|
73
|
+
logger.info(f"Deployed skills: {', '.join(skill_result.deployed)}")
|
|
74
|
+
if skill_result.removed and not silent:
|
|
75
|
+
logger.info(f"Removed skills: {', '.join(skill_result.removed)}")
|
|
76
|
+
if skill_result.errors:
|
|
77
|
+
for error in skill_result.errors:
|
|
78
|
+
logger.error(f"Skill reconciliation error: {error}")
|
|
79
|
+
|
|
80
|
+
if not silent:
|
|
81
|
+
total_errors = len(agent_result.errors) + len(skill_result.errors)
|
|
82
|
+
if total_errors == 0:
|
|
83
|
+
logger.info("Startup reconciliation complete")
|
|
84
|
+
else:
|
|
85
|
+
logger.warning(
|
|
86
|
+
f"Startup reconciliation complete with {total_errors} errors"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return agent_result, skill_result
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def check_reconciliation_needed(
|
|
93
|
+
project_path: Optional[Path] = None, config: Optional[UnifiedConfig] = None
|
|
94
|
+
) -> bool:
|
|
95
|
+
"""
|
|
96
|
+
Check if reconciliation is needed (without performing it).
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
project_path: Project directory
|
|
100
|
+
config: Configuration instance
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
True if reconciliation would make changes
|
|
104
|
+
"""
|
|
105
|
+
project_path = project_path or Path.cwd()
|
|
106
|
+
|
|
107
|
+
if config is None:
|
|
108
|
+
config = UnifiedConfig()
|
|
109
|
+
|
|
110
|
+
reconciler = DeploymentReconciler(config)
|
|
111
|
+
view = reconciler.get_reconciliation_view(project_path)
|
|
112
|
+
|
|
113
|
+
agent_state = view["agents"]
|
|
114
|
+
skill_state = view["skills"]
|
|
115
|
+
|
|
116
|
+
# Check if any changes needed
|
|
117
|
+
return (
|
|
118
|
+
len(agent_state.to_deploy) > 0
|
|
119
|
+
or len(agent_state.to_remove) > 0
|
|
120
|
+
or len(skill_state.to_deploy) > 0
|
|
121
|
+
or len(skill_state.to_remove) > 0
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
# Example integration in startup code:
|
|
126
|
+
#
|
|
127
|
+
# from claude_mpm.services.agents.deployment.startup_reconciliation import (
|
|
128
|
+
# perform_startup_reconciliation,
|
|
129
|
+
# check_reconciliation_needed
|
|
130
|
+
# )
|
|
131
|
+
#
|
|
132
|
+
# def startup():
|
|
133
|
+
# # Check if reconciliation needed
|
|
134
|
+
# if check_reconciliation_needed():
|
|
135
|
+
# logger.info("Reconciliation needed, performing...")
|
|
136
|
+
# perform_startup_reconciliation()
|
|
137
|
+
# else:
|
|
138
|
+
# logger.debug("No reconciliation needed")
|
|
@@ -32,7 +32,9 @@ from claude_mpm.services.agents.sources.git_source_sync_service import (
|
|
|
32
32
|
logger = logging.getLogger(__name__)
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
def sync_agents_on_startup(
|
|
35
|
+
def sync_agents_on_startup(
|
|
36
|
+
config: Optional[Dict[str, Any]] = None, force_refresh: bool = False
|
|
37
|
+
) -> Dict[str, Any]:
|
|
36
38
|
"""Synchronize agents from remote sources on Claude MPM startup.
|
|
37
39
|
|
|
38
40
|
Design Decision: Single-source support for Stage 1
|
|
@@ -44,6 +46,7 @@ def sync_agents_on_startup(config: Optional[Dict[str, Any]] = None) -> Dict[str,
|
|
|
44
46
|
|
|
45
47
|
Args:
|
|
46
48
|
config: Optional configuration dictionary. If None, loads from Config singleton.
|
|
49
|
+
force_refresh: Force download even if cache is fresh (bypasses ETag).
|
|
47
50
|
|
|
48
51
|
Returns:
|
|
49
52
|
Dictionary with sync results:
|
|
@@ -156,7 +159,7 @@ def sync_agents_on_startup(config: Optional[Dict[str, Any]] = None) -> Dict[str,
|
|
|
156
159
|
)
|
|
157
160
|
|
|
158
161
|
# Perform sync
|
|
159
|
-
sync_result = sync_service.sync_agents(force_refresh=
|
|
162
|
+
sync_result = sync_service.sync_agents(force_refresh=force_refresh)
|
|
160
163
|
|
|
161
164
|
# Aggregate results
|
|
162
165
|
result["sources_synced"] += 1
|
|
@@ -5,6 +5,7 @@ Services specifically for CLI command support and utilities.
|
|
|
5
5
|
|
|
6
6
|
from .agent_dependency_service import AgentDependencyService, IAgentDependencyService
|
|
7
7
|
from .agent_validation_service import AgentValidationService, IAgentValidationService
|
|
8
|
+
from .incremental_pause_manager import IncrementalPauseManager, PauseAction
|
|
8
9
|
from .startup_checker import IStartupChecker, StartupCheckerService, StartupWarning
|
|
9
10
|
|
|
10
11
|
__all__ = [
|
|
@@ -13,6 +14,8 @@ __all__ = [
|
|
|
13
14
|
"IAgentDependencyService",
|
|
14
15
|
"IAgentValidationService",
|
|
15
16
|
"IStartupChecker",
|
|
17
|
+
"IncrementalPauseManager",
|
|
18
|
+
"PauseAction",
|
|
16
19
|
"StartupCheckerService",
|
|
17
20
|
"StartupWarning",
|
|
18
21
|
]
|