claude-mpm 0.3.0__tar.gz → 1.0.0__tar.gz
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.
- {claude_mpm-0.3.0 → claude_mpm-1.0.0}/CHANGELOG.md +39 -0
 - {claude_mpm-0.3.0/src/claude_mpm.egg-info → claude_mpm-1.0.0}/PKG-INFO +1 -1
 - claude_mpm-1.0.0/VERSION +1 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/examples/todo_prefix_hook_example.py +6 -6
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/package.json +1 -1
 - claude_mpm-1.0.0/scripts/debug_hook_behavior.py +62 -0
 - claude_mpm-1.0.0/scripts/debug_hook_behavior2.py +66 -0
 - claude_mpm-1.0.0/scripts/test_agent_name_consistency.py +282 -0
 - claude_mpm-1.0.0/scripts/test_agent_name_formats.py +82 -0
 - claude_mpm-1.0.0/scripts/test_todo_task_integration.py +160 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/INSTRUCTIONS.md +23 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/agent_name_normalizer.py +49 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/simple_runner.py +7 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +8 -7
 - claude_mpm-1.0.0/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +115 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0/src/claude_mpm.egg-info}/PKG-INFO +1 -1
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm.egg-info/SOURCES.txt +5 -5
 - claude_mpm-0.3.0/IMPLEMENTATION_SUMMARY.md +0 -101
 - claude_mpm-0.3.0/TEST_CLEANUP_SUMMARY.md +0 -56
 - claude_mpm-0.3.0/TEST_RESULTS_SUMMARY.md +0 -98
 - claude_mpm-0.3.0/VERSION +0 -1
 - claude_mpm-0.3.0/agent_modification_tracker_backup.tar.gz +0 -0
 - claude_mpm-0.3.0/isolated-test/CLAUDE.md +0 -1
 - claude_mpm-0.3.0/src/claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +0 -89
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.ai-trackdown/config.yaml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.ai-trackdown/project.yaml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.aitrackdown/project.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.aitrackdown-config.yaml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/.claude.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/.claude.json.backup +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/data_engineer.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/documentation.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/engineer.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/ops.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/qa.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/research.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/security.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/agents/version_control.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753448752189-02zmkd.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753448752717-t1o960.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753448753258-cz40yi.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753448753816-5cj75h.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753449561020-uh844i.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753449676191-16dqe8.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753449766642-8sffyp.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753449795813-bj9blv.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753449953467-ru9ods.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753449966919-eb4aoq.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753450012330-ad1k3g.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753450254970-pvrwgd.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753450398246-etdteg.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753450789791-z5ptuf.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753450861209-w6so3e.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753451302996-01ahjc.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753451384857-mvpmcf.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753451508182-v942iw.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753451525128-q52z98.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753452958143-rd4nut.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753453029843-tyfjfo.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753460195020-02l99b.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753460396315-znuas3.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753460428488-tcy6i5.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753460542243-l181zr.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753461397341-fdy0v7.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753469116715-v6dpx9.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753477538332-i5g2cr.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753477560204-7vo17t.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753477883629-hsjia3.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753477961808-oiyqie.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478292112-5g3i0g.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478337101-xe1uid.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478342176-env102.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478361973-nr1cwq.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478372714-lamo9k.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478388184-yxkay7.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753478392376-eygj04.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/shell-snapshots/snapshot-zsh-1753482158558-cr2h0o.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/0aaf869f-0009-4249-b955-1c3942ff239f-agent-0aaf869f-0009-4249-b955-1c3942ff239f.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/0c24ded8-9422-489d-8d18-f83cc0737181-agent-0c24ded8-9422-489d-8d18-f83cc0737181.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/0d9501e6-77b0-4e8f-b132-bae208ed740a-agent-0d9501e6-77b0-4e8f-b132-bae208ed740a.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-048a118d-f0ea-4dce-90d3-d851514aa36a.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-0600940d-65ff-4678-ac90-9e0d42a3e138.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-1b8badbc-b05e-459e-b16c-a974f28673be.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-231626b2-0ce7-44fb-82e4-a9e72fdcecc4.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-2799acc0-b5e3-4086-940e-62bd2a5bbd7d.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-42b0c458-9d5f-4745-826e-7c618d3a7026.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-a324c872-b962-4438-b794-7966f5d7a7a9.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-ce91e7fd-64af-4f57-b691-1487c2db8d0b.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-dd250db2-edbb-43fc-a143-3eeafc0cd7fa.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1060b0c4-2bf3-414f-bd75-d6f8dcad9eb5-agent-f0cbf9cd-0136-4bca-b0e0-c66aa58d3aeb.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/109c42c9-0afd-4a5b-a1b3-e515e31b6a2f-agent-109c42c9-0afd-4a5b-a1b3-e515e31b6a2f.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1163a193-8464-4195-8281-6b875b5d987d-agent-1163a193-8464-4195-8281-6b875b5d987d.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/128d2198-5b02-422c-9531-f3396cbf0ce0-agent-128d2198-5b02-422c-9531-f3396cbf0ce0.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/16c51506-6afa-43aa-b199-da0c853f99a9-agent-16c51506-6afa-43aa-b199-da0c853f99a9.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1736bdd7-71f4-49a0-934d-18e3aa5e0b43-agent-1736bdd7-71f4-49a0-934d-18e3aa5e0b43.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1869eedc-69fc-4e81-a8ac-f57bd8e3946b-agent-1869eedc-69fc-4e81-a8ac-f57bd8e3946b.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/1a97dfda-12e5-4f13-8c8a-731373694a1c-agent-1a97dfda-12e5-4f13-8c8a-731373694a1c.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/283ac74b-5516-43f8-9548-24ded2b643b1-agent-283ac74b-5516-43f8-9548-24ded2b643b1.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/2ba08561-559e-4f64-9522-8d6c340e47da-agent-2ba08561-559e-4f64-9522-8d6c340e47da.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/31da8ed9-e1a5-40c8-91c8-8e9b51ca24a9-agent-31da8ed9-e1a5-40c8-91c8-8e9b51ca24a9.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/35194d51-6b8f-4ef5-b771-b0aa03f49a88-agent-35194d51-6b8f-4ef5-b771-b0aa03f49a88.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/3d1c0368-e607-4f47-b02d-7c0922cc0f25-agent-3d1c0368-e607-4f47-b02d-7c0922cc0f25.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/3d46c625-6377-4296-b9b3-22bc19341092-agent-3d46c625-6377-4296-b9b3-22bc19341092.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/40072791-2f2f-4743-b763-ec19321ccb0b-agent-40072791-2f2f-4743-b763-ec19321ccb0b.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/4157ab6d-5025-4862-82eb-5818c43c5a8c-agent-4157ab6d-5025-4862-82eb-5818c43c5a8c.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/458938f3-a317-46f3-8359-86f05ccacc7d-agent-458938f3-a317-46f3-8359-86f05ccacc7d.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/4dcf1510-e396-47bb-ac32-f62811ae9774-agent-4dcf1510-e396-47bb-ac32-f62811ae9774.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/4eb9a1c4-92b0-44ee-9322-6ba0442efd42-agent-4eb9a1c4-92b0-44ee-9322-6ba0442efd42.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/4f57fa86-e804-4c8e-a0ff-196835df5bc9-agent-4f57fa86-e804-4c8e-a0ff-196835df5bc9.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/518e2724-687e-4ae3-bde9-582c8718695a-agent-518e2724-687e-4ae3-bde9-582c8718695a.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/51abf2eb-4e5a-4731-bd23-76cffe656a40-agent-51abf2eb-4e5a-4731-bd23-76cffe656a40.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/53c4beda-27f3-4247-ada4-f904320995ad-agent-53c4beda-27f3-4247-ada4-f904320995ad.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/56581e8b-07b1-4174-bf81-c280a3dee6b4-agent-56581e8b-07b1-4174-bf81-c280a3dee6b4.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/58848224-56e6-49f6-a4e5-c08f8f70c426-agent-58848224-56e6-49f6-a4e5-c08f8f70c426.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/58cf2d09-fd22-4a2e-8c74-c247ece6c802-agent-58cf2d09-fd22-4a2e-8c74-c247ece6c802.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/5bcc2e07-617c-4659-b82f-6b630ea891ff-agent-5bcc2e07-617c-4659-b82f-6b630ea891ff.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/5bf326e7-b61a-4d82-b483-94d5d7085755-agent-5bf326e7-b61a-4d82-b483-94d5d7085755.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/5dee78ec-d9ed-4484-b101-5490217fe423-agent-5dee78ec-d9ed-4484-b101-5490217fe423.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/5f6c7624-6a25-4ed9-be09-03fa3a70c4d8-agent-5f6c7624-6a25-4ed9-be09-03fa3a70c4d8.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/606431c0-6b47-4fb8-b386-132918a3aa0b-agent-606431c0-6b47-4fb8-b386-132918a3aa0b.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/6078e96f-e9a4-435f-8d2f-cf70346ebafe-agent-6078e96f-e9a4-435f-8d2f-cf70346ebafe.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/69e5a32b-bf2c-4264-93cd-6ac84b44ca9f-agent-69e5a32b-bf2c-4264-93cd-6ac84b44ca9f.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/6b729248-47b8-4657-ad7f-7f09fff21151-agent-6b729248-47b8-4657-ad7f-7f09fff21151.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/6d6970e8-f95f-468b-a8b8-3eacca8f1220-agent-6d6970e8-f95f-468b-a8b8-3eacca8f1220.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/6ec6cfa4-f2fd-4515-9c95-3ea74fbc571b-agent-6ec6cfa4-f2fd-4515-9c95-3ea74fbc571b.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/713e1bda-caa2-4cb9-a5a2-b7c6fec5776f-agent-713e1bda-caa2-4cb9-a5a2-b7c6fec5776f.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/71e6da9f-0dcd-4abd-ae8f-a5af695d9624-agent-71e6da9f-0dcd-4abd-ae8f-a5af695d9624.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/7653f086-93df-4423-98ce-640305e10823-agent-7653f086-93df-4423-98ce-640305e10823.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/76656734-acd3-411c-b333-f274dabae19c-agent-76656734-acd3-411c-b333-f274dabae19c.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/78150f02-9204-437c-9e12-9e800f3f73b9-agent-78150f02-9204-437c-9e12-9e800f3f73b9.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/7dda0a32-2834-4a47-9734-9ae9ca5b1a31-agent-7dda0a32-2834-4a47-9734-9ae9ca5b1a31.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/84b4d3c7-5506-4e4e-87dd-9cc48b8bc2ec-agent-84b4d3c7-5506-4e4e-87dd-9cc48b8bc2ec.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/86ce0d12-f82e-49b2-b553-2cd8a7e188a3-agent-86ce0d12-f82e-49b2-b553-2cd8a7e188a3.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/87626114-6cb1-43ef-978a-bb35f612e4eb-agent-87626114-6cb1-43ef-978a-bb35f612e4eb.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/880d3ea5-649e-449e-88bc-664a291ec338-agent-880d3ea5-649e-449e-88bc-664a291ec338.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/8962e6d9-0fc0-4578-bb08-a5dfbc2dbe5e-agent-8962e6d9-0fc0-4578-bb08-a5dfbc2dbe5e.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/8f998b9e-5f18-4ade-bd69-74c95a210f6a-agent-8f998b9e-5f18-4ade-bd69-74c95a210f6a.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/929364bd-aa69-4831-850e-37f8ab63803d-agent-929364bd-aa69-4831-850e-37f8ab63803d.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/95479b6c-cfbf-4bb7-9e00-b95a0b385775-agent-95479b6c-cfbf-4bb7-9e00-b95a0b385775.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/9628cc3a-355a-48f0-ab54-c28ac2e05dfe-agent-9628cc3a-355a-48f0-ab54-c28ac2e05dfe.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/a9136d1b-6e01-4879-972f-5fcdde5e08d7-agent-a9136d1b-6e01-4879-972f-5fcdde5e08d7.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/b10ff15f-3c8c-46d7-93b4-a0d4d5ec4003-agent-b10ff15f-3c8c-46d7-93b4-a0d4d5ec4003.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/b1206d13-f0ec-4f53-a746-a845732fefd7-agent-b1206d13-f0ec-4f53-a746-a845732fefd7.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/b61be2e4-7de3-4e1b-b636-2232190ffc5c-agent-b61be2e4-7de3-4e1b-b636-2232190ffc5c.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/b80ad406-64d1-4a6c-b781-15496265fae0-agent-b80ad406-64d1-4a6c-b781-15496265fae0.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/babc6eac-d7d6-498a-8176-e09e00423a12-agent-babc6eac-d7d6-498a-8176-e09e00423a12.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/bf4b7700-9630-466e-afb0-8904fbddac42-agent-bf4b7700-9630-466e-afb0-8904fbddac42.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/c2189d0d-9c2b-400a-bf7c-3989ef6cd37d-agent-c2189d0d-9c2b-400a-bf7c-3989ef6cd37d.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/c35ee595-142f-454b-bb36-dc434d4a80a6-agent-c35ee595-142f-454b-bb36-dc434d4a80a6.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/c629949d-4641-45ff-81d3-d7c8f353da81-agent-c629949d-4641-45ff-81d3-d7c8f353da81.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/c8cecbec-a3bb-4507-98a4-c590a4e919b2-agent-c8cecbec-a3bb-4507-98a4-c590a4e919b2.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/cce78c00-7309-4bc4-802c-3bad75be09cc-agent-cce78c00-7309-4bc4-802c-3bad75be09cc.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/d55a3a18-0143-4401-ba56-ea630982c105-agent-d55a3a18-0143-4401-ba56-ea630982c105.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/d881887b-49bc-4fda-acda-c866681c8f13-agent-d881887b-49bc-4fda-acda-c866681c8f13.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/db3e76fb-7b9d-4f1c-8822-cce448fdf9e6-agent-db3e76fb-7b9d-4f1c-8822-cce448fdf9e6.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/dc7344a6-cd2e-4f20-a945-deb2e39f4fbc-agent-dc7344a6-cd2e-4f20-a945-deb2e39f4fbc.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/eb12ed58-94e3-490a-b8c8-b2912fa77fbe-agent-eb12ed58-94e3-490a-b8c8-b2912fa77fbe.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/ef4c285d-d79b-4c6e-a458-49cb26bf3c0a-agent-ef4c285d-d79b-4c6e-a458-49cb26bf3c0a.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/f295b25f-51d8-4fff-b71d-aa18d7028466-agent-f295b25f-51d8-4fff-b71d-aa18d7028466.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/f2a683d3-4d16-4c94-bf52-03efaf45f7f1-agent-f2a683d3-4d16-4c94-bf52-03efaf45f7f1.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/f536b1f5-879c-4236-9718-599337ffc815-agent-f536b1f5-879c-4236-9718-599337ffc815.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/fabcbe8a-6751-454b-a240-e9393391e2e9-agent-fabcbe8a-6751-454b-a240-e9393391e2e9.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude/todos/fe57db22-5ef9-4522-9423-5c20dd665ef6-agent-fe57db22-5ef9-4522-9423-5c20dd665ef6.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/.claude.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/.claude.json.backup +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/.gitignore +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/agents/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/agents/poc-engineer.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/agents/poc-qa.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/agents/poc-researcher.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/agents/test-agent.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/agents/test-agent.yaml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/config/project.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/projects/-Users-masa-Projects-claude-mpm/1f2d5a1d-a2fd-4c26-a1b2-3822f3a5fbf5.jsonl +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/projects/-Users-masa-Projects-claude-mpm/9217ce88-3ece-41db-adc8-9fc8532c6314.jsonl +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/shell-snapshots/snapshot-zsh-1753447830017-dejufl.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/shell-snapshots/snapshot-zsh-1753447830478-zr6tpi.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/stats/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/statsig/statsig.cached.evaluations.85901da9f9 +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/statsig/statsig.last_modified_time.evaluations +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/statsig/statsig.session_id.2656274335 +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/statsig/statsig.stable_id.2656274335 +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/todos/1f2d5a1d-a2fd-4c26-a1b2-3822f3a5fbf5-agent-1f2d5a1d-a2fd-4c26-a1b2-3822f3a5fbf5.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-mpm/todos/9217ce88-3ece-41db-adc8-9fc8532c6314-agent-9217ce88-3ece-41db-adc8-9fc8532c6314.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.claude-pm/config/project.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.githooks/pre-commit +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.gitignore +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.npmignore +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/.trackdown.yaml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/CLAUDE.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/INSTALL.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/MANIFEST.in +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/Makefile +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/README.npm.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/bin/claude-mpm +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/bin/claude-mpm-hooks +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/bin/ticket +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/claude-mpm +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/examples/dependency_injection_demo.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/examples/json_rpc_hooks_demo.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/examples/todo_prefix_hook_integration.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/framework/agent-roles/base_agent.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/install.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/install_dev.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/npm-bin/claude-mpm.js +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/pyproject.toml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/requirements-dev.txt +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/requirements.txt +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/add_agent_versioning.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/analyze_framework_loaders.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/claude-mpm +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/cleanup_logs.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/consolidate_services.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/convert_agents_to_yaml.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/debug_subprocess.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/demo/subprocess_before_after.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/demo/subprocess_improvements_demo.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/fix_all_fallback_imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/fix_all_imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/fix_fallback_imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/launch_with_agents.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/manage_version.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/migrate_logging_imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/migrate_to_json_rpc_hooks.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/postinstall.js +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/publish.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/remove_remaining_ticketing.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/remove_ticketing_references.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/run_all_tests.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/run_e2e_tests.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/run_mpm.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/standardize_imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/test_basic_functionality.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/test_hello_world.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/test_simple_runner_logging.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/test_subagent_demo.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/test_system_health.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/test_todo_hook.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/run_tests.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/run_tests_updated.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_agent_integration.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_claude_direct.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_hello_world.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_interactive.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_logging.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_orchestration.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_pexpect.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_pexpect_install.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/tests/test_subprocess.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/ticket +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/scripts/verify_imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/setup.cfg +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/setup.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/__main__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/_version.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/agent_loader.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/agent_loader_integration.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/agents_metadata.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/base_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/base_agent_loader.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/schema/agent_schema.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/system_agent_config.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/data_engineer_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/documentation_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/engineer_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/ops_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/qa_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/research_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/security_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/update-optimized-specialized-agents.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/templates/version_control_agent.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_main.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_module/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_module/args.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_module/commands.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_module/migration_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_module/refactoring_guide.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_old/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/cli_old/ticket_cli.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/config/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/config/hook_config.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/constants.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/agent_registry.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/agent_registry.py.bak +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/agent_session_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/base_service.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/base_service.py.bak +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/config.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/config_aliases.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/container.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/factories.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/framework_loader.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/injectable_service.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/interfaces.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/logger.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/minimal_framework_loader.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/mixins.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/service_registry.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/session_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/core/tool_access_control.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/base_hook.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/logging_hook_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/submit_hook_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/builtin/workflow_start_hook.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/hook_client.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/hook_runner.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/json_rpc_executor.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/json_rpc_hook_client.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/hooks/tool_call_interceptor.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/init.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/SUBPROCESS_DESIGN.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/direct_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/factory.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/hook_integration_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/pty_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/simple_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/scripts/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/scripts/ticket.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/agent_deployment.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/agent_lifecycle_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/agent_management_service.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/agent_modification_tracker.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/agent_profile_loader.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/agent_registry.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/base_agent_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_agent_loader.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/content_assembler.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/content_validator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/deployment_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/header.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/section_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator/version_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/framework_claude_md_generator.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/hook_service.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/hook_service_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/json_rpc_hook_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/README.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/backup_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/config_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/framework_protector.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/operations.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/state_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/template_deployer.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/validation_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/parent_directory_manager/version_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/shared_prompt_cache.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/ticket_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/ticket_manager_di.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/ticketing_service_original.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/version_control/VERSION +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/version_control/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/version_control/branch_strategy.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/version_control/conflict_resolution.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/version_control/git_operations.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/services/version_control/semantic_versioning.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/ui/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/ui/rich_terminal_ui.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/ui/terminal_ui.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/utils/__init__.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/utils/config_manager.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/utils/import_migration_example.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/utils/imports.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/utils/path_operations.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm/utils/paths.py +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm.egg-info/dependency_links.txt +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm.egg-info/entry_points.txt +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm.egg-info/requires.txt +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/src/claude_mpm.egg-info/top_level.txt +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/ticket +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/epics/EP-0001.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/epics/EP-0002-subagent-pivot.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/epics/EP-0003.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/CONVERSION_MAPPING.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0001.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0002.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0003.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0004.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0005.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0006.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0007.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0008.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0009.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/issues/ISS-0010.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0001.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0002.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0003.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0004.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0005.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0006.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0008.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0009.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0011.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0016.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0017.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0018.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0019.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0020.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0021.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0022.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0023.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0024.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0025.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0026.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0027.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0028.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0029.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0030.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0031.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0032.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0033.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0034.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0035.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0036.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0037.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0038.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0039.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0040.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0041.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0042.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0043.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0044.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0045.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/tickets/tasks/TSK-0046.md +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/uninstall.sh +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/data_engineer.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/documentation.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/engineer.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/ops.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/qa.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/research.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/security.yml +0 -0
 - {claude_mpm-0.3.0 → claude_mpm-1.0.0}/~/.claude/agents/version_control.yml +0 -0
 
| 
         @@ -5,6 +5,44 @@ All notable changes to claude-mpm will be documented in this file. 
     | 
|
| 
       5 
5 
     | 
    
         
             
            The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
         
     | 
| 
       6 
6 
     | 
    
         
             
            and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
      
 8 
     | 
    
         
            +
            ## [1.0.0] - 2025-07-26
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            ### BREAKING CHANGES
         
     | 
| 
      
 11 
     | 
    
         
            +
            - **Simplified architecture**: Replaced the entire orchestrator system with a simple runner
         
     | 
| 
      
 12 
     | 
    
         
            +
              - Removed 16 orchestrator implementations and consolidated to `simple_runner.py`
         
     | 
| 
      
 13 
     | 
    
         
            +
              - Deleted todo hijacking and subprocess runner features
         
     | 
| 
      
 14 
     | 
    
         
            +
              - Removed agent modification tracker service
         
     | 
| 
      
 15 
     | 
    
         
            +
              - Archived old orchestrators to `orchestration/archive/`
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 18 
     | 
    
         
            +
            - **TodoWrite Agent Prefix Hook system**: Automatic delegation of todo items to specialized agents
         
     | 
| 
      
 19 
     | 
    
         
            +
              - `todo_agent_prefix_hook.py` for automatic todo list delegation
         
     | 
| 
      
 20 
     | 
    
         
            +
              - `tool_call_interceptor.py` for intercepting TodoWrite tool calls
         
     | 
| 
      
 21 
     | 
    
         
            +
              - Comprehensive documentation and example implementations
         
     | 
| 
      
 22 
     | 
    
         
            +
              - Test script for validating todo hook functionality
         
     | 
| 
      
 23 
     | 
    
         
            +
            - **Enhanced CLI with argument preprocessing**: Better command-line interaction
         
     | 
| 
      
 24 
     | 
    
         
            +
              - Support for `@agent` syntax for direct agent specification
         
     | 
| 
      
 25 
     | 
    
         
            +
              - Pass-through arguments to Claude with proper escaping
         
     | 
| 
      
 26 
     | 
    
         
            +
              - Improved logging and error handling in CLI operations
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 29 
     | 
    
         
            +
            - **Updated agent instructions**: Clearer guidelines for agent development
         
     | 
| 
      
 30 
     | 
    
         
            +
            - **Simplified ticket manager**: Removed unnecessary complexity in ticket management
         
     | 
| 
      
 31 
     | 
    
         
            +
            - **Streamlined test suite**: Removed 15 obsolete test files related to old orchestration patterns
         
     | 
| 
      
 32 
     | 
    
         
            +
            - **Updated remaining tests**: Modified to work with simplified architecture
         
     | 
| 
      
 33 
     | 
    
         
            +
            - **Improved framework loader**: Better clarity and maintainability
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            ### Removed
         
     | 
| 
      
 36 
     | 
    
         
            +
            - Complex orchestrator system (moved to archive)
         
     | 
| 
      
 37 
     | 
    
         
            +
            - Todo hijacking features
         
     | 
| 
      
 38 
     | 
    
         
            +
            - Subprocess runner features
         
     | 
| 
      
 39 
     | 
    
         
            +
            - Agent modification tracker service
         
     | 
| 
      
 40 
     | 
    
         
            +
            - Obsolete tests for deprecated features
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            ### Fixed
         
     | 
| 
      
 43 
     | 
    
         
            +
            - Test suite compatibility with new architecture
         
     | 
| 
      
 44 
     | 
    
         
            +
            - Import paths and module references
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
       8 
46 
     | 
    
         
             
            ## [0.5.0] - 2024-01-25
         
     | 
| 
       9 
47 
     | 
    
         | 
| 
       10 
48 
     | 
    
         
             
            ### Added
         
     | 
| 
         @@ -59,6 +97,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 
     | 
|
| 
       59 
97 
     | 
    
         
             
            - Framework loader
         
     | 
| 
       60 
98 
     | 
    
         
             
            - Basic CLI structure
         
     | 
| 
       61 
99 
     | 
    
         | 
| 
      
 100 
     | 
    
         
            +
            [1.0.0]: https://github.com/bobmatnyc/claude-mpm/compare/v0.5.0...v1.0.0
         
     | 
| 
       62 
101 
     | 
    
         
             
            [0.5.0]: https://github.com/bobmatnyc/claude-mpm/compare/v0.3.0...v0.5.0
         
     | 
| 
       63 
102 
     | 
    
         
             
            [0.3.0]: https://github.com/bobmatnyc/claude-mpm/compare/v0.2.0...v0.3.0
         
     | 
| 
       64 
103 
     | 
    
         
             
            [0.2.0]: https://github.com/bobmatnyc/claude-mpm/compare/v0.1.0...v0.2.0
         
     | 
    
        claude_mpm-1.0.0/VERSION
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            1.0.1.dev0+g8dd1a55.d20250726
         
     | 
| 
         @@ -33,7 +33,7 @@ def demo_auto_prefix_enforcement(): 
     | 
|
| 
       33 
33 
     | 
    
         
             
                            {'content': 'implement user authentication', 'status': 'pending', 'priority': 'high', 'id': '1'},
         
     | 
| 
       34 
34 
     | 
    
         
             
                            {'content': 'write unit tests for auth module', 'status': 'pending', 'priority': 'medium', 'id': '2'},
         
     | 
| 
       35 
35 
     | 
    
         
             
                            {'content': 'research best practices for JWT', 'status': 'pending', 'priority': 'low', 'id': '3'},
         
     | 
| 
       36 
     | 
    
         
            -
                            {'content': 'Engineer 
     | 
| 
      
 36 
     | 
    
         
            +
                            {'content': '[Engineer] fix login bug', 'status': 'pending', 'priority': 'high', 'id': '4'},  # Already has prefix
         
     | 
| 
       37 
37 
     | 
    
         
             
                        ]
         
     | 
| 
       38 
38 
     | 
    
         
             
                    }
         
     | 
| 
       39 
39 
     | 
    
         
             
                ]
         
     | 
| 
         @@ -74,9 +74,9 @@ def demo_validation_only(): 
     | 
|
| 
       74 
74 
     | 
    
         
             
                        'name': 'Valid todos with proper prefixes',
         
     | 
| 
       75 
75 
     | 
    
         
             
                        'params': {
         
     | 
| 
       76 
76 
     | 
    
         
             
                            'todos': [
         
     | 
| 
       77 
     | 
    
         
            -
                                {'content': 'Engineer 
     | 
| 
       78 
     | 
    
         
            -
                                {'content': 'QA 
     | 
| 
       79 
     | 
    
         
            -
                                {'content': ' 
     | 
| 
      
 77 
     | 
    
         
            +
                                {'content': '[Engineer] implement user authentication', 'status': 'pending', 'priority': 'high', 'id': '1'},
         
     | 
| 
      
 78 
     | 
    
         
            +
                                {'content': '[QA] write unit tests for auth module', 'status': 'pending', 'priority': 'medium', 'id': '2'},
         
     | 
| 
      
 79 
     | 
    
         
            +
                                {'content': '[Research] investigate OAuth2 best practices', 'status': 'pending', 'priority': 'low', 'id': '3'},
         
     | 
| 
       80 
80 
     | 
    
         
             
                            ]
         
     | 
| 
       81 
81 
     | 
    
         
             
                        }
         
     | 
| 
       82 
82 
     | 
    
         
             
                    },
         
     | 
| 
         @@ -93,9 +93,9 @@ def demo_validation_only(): 
     | 
|
| 
       93 
93 
     | 
    
         
             
                        'name': 'Mixed valid and invalid',
         
     | 
| 
       94 
94 
     | 
    
         
             
                        'params': {
         
     | 
| 
       95 
95 
     | 
    
         
             
                            'todos': [
         
     | 
| 
       96 
     | 
    
         
            -
                                {'content': 'Security 
     | 
| 
      
 96 
     | 
    
         
            +
                                {'content': '[Security] audit authentication system', 'status': 'pending', 'priority': 'high', 'id': '1'},
         
     | 
| 
       97 
97 
     | 
    
         
             
                                {'content': 'update documentation', 'status': 'pending', 'priority': 'low', 'id': '2'},  # Missing prefix
         
     | 
| 
       98 
     | 
    
         
            -
                                {'content': 'Ops 
     | 
| 
      
 98 
     | 
    
         
            +
                                {'content': '[Ops] configure CI/CD pipeline', 'status': 'pending', 'priority': 'medium', 'id': '3'},
         
     | 
| 
       99 
99 
     | 
    
         
             
                            ]
         
     | 
| 
       100 
100 
     | 
    
         
             
                        }
         
     | 
| 
       101 
101 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -0,0 +1,62 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env python3
         
     | 
| 
      
 2 
     | 
    
         
            +
            """Debug script to understand hook behavior."""
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            import sys
         
     | 
| 
      
 5 
     | 
    
         
            +
            import os
         
     | 
| 
      
 6 
     | 
    
         
            +
            sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            from datetime import datetime
         
     | 
| 
      
 9 
     | 
    
         
            +
            from claude_mpm.hooks.builtin.todo_agent_prefix_hook import TodoAgentPrefixHook
         
     | 
| 
      
 10 
     | 
    
         
            +
            from claude_mpm.hooks.base_hook import HookContext, HookType
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            # Create hook instance
         
     | 
| 
      
 13 
     | 
    
         
            +
            hook = TodoAgentPrefixHook()
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            # Test case
         
     | 
| 
      
 16 
     | 
    
         
            +
            test_todo = "Research best practices for testing"
         
     | 
| 
      
 17 
     | 
    
         
            +
            context = HookContext(
         
     | 
| 
      
 18 
     | 
    
         
            +
                hook_type=HookType.CUSTOM,
         
     | 
| 
      
 19 
     | 
    
         
            +
                data={
         
     | 
| 
      
 20 
     | 
    
         
            +
                    'tool_name': 'TodoWrite',
         
     | 
| 
      
 21 
     | 
    
         
            +
                    'parameters': {
         
     | 
| 
      
 22 
     | 
    
         
            +
                        'todos': [{'content': test_todo}]
         
     | 
| 
      
 23 
     | 
    
         
            +
                    }
         
     | 
| 
      
 24 
     | 
    
         
            +
                },
         
     | 
| 
      
 25 
     | 
    
         
            +
                metadata={},
         
     | 
| 
      
 26 
     | 
    
         
            +
                timestamp=datetime.now()
         
     | 
| 
      
 27 
     | 
    
         
            +
            )
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            print(f"Testing todo: '{test_todo}'")
         
     | 
| 
      
 30 
     | 
    
         
            +
            print(f"Hook validation: {hook.validate(context)}")
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            # Execute hook
         
     | 
| 
      
 33 
     | 
    
         
            +
            result = hook.execute(context)
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            print(f"\nResult:")
         
     | 
| 
      
 36 
     | 
    
         
            +
            print(f"  Success: {result.success}")
         
     | 
| 
      
 37 
     | 
    
         
            +
            print(f"  Modified: {result.modified}")
         
     | 
| 
      
 38 
     | 
    
         
            +
            print(f"  Error: {result.error}")
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            if result.success and result.modified:
         
     | 
| 
      
 41 
     | 
    
         
            +
                updated_todos = result.data['parameters']['todos']
         
     | 
| 
      
 42 
     | 
    
         
            +
                print(f"  Updated content: '{updated_todos[0]['content']}'")
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            # Test with a todo that already has a prefix
         
     | 
| 
      
 45 
     | 
    
         
            +
            prefixed_todo = "[Research] Analyze patterns"
         
     | 
| 
      
 46 
     | 
    
         
            +
            context2 = HookContext(
         
     | 
| 
      
 47 
     | 
    
         
            +
                hook_type=HookType.CUSTOM,
         
     | 
| 
      
 48 
     | 
    
         
            +
                data={
         
     | 
| 
      
 49 
     | 
    
         
            +
                    'tool_name': 'TodoWrite',
         
     | 
| 
      
 50 
     | 
    
         
            +
                    'parameters': {
         
     | 
| 
      
 51 
     | 
    
         
            +
                        'todos': [{'content': prefixed_todo}]
         
     | 
| 
      
 52 
     | 
    
         
            +
                    }
         
     | 
| 
      
 53 
     | 
    
         
            +
                },
         
     | 
| 
      
 54 
     | 
    
         
            +
                metadata={},
         
     | 
| 
      
 55 
     | 
    
         
            +
                timestamp=datetime.now()
         
     | 
| 
      
 56 
     | 
    
         
            +
            )
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            print(f"\n\nTesting prefixed todo: '{prefixed_todo}'")
         
     | 
| 
      
 59 
     | 
    
         
            +
            result2 = hook.execute(context2)
         
     | 
| 
      
 60 
     | 
    
         
            +
            print(f"Result:")
         
     | 
| 
      
 61 
     | 
    
         
            +
            print(f"  Success: {result2.success}")
         
     | 
| 
      
 62 
     | 
    
         
            +
            print(f"  Modified: {result2.modified}")
         
     | 
| 
         @@ -0,0 +1,66 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env python3
         
     | 
| 
      
 2 
     | 
    
         
            +
            """Debug script to understand hook behavior in detail."""
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            import sys
         
     | 
| 
      
 5 
     | 
    
         
            +
            import os
         
     | 
| 
      
 6 
     | 
    
         
            +
            sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            from datetime import datetime
         
     | 
| 
      
 9 
     | 
    
         
            +
            from claude_mpm.hooks.builtin.todo_agent_prefix_hook import TodoAgentPrefixHook
         
     | 
| 
      
 10 
     | 
    
         
            +
            from claude_mpm.hooks.base_hook import HookContext, HookType
         
     | 
| 
      
 11 
     | 
    
         
            +
            from claude_mpm.core.agent_name_normalizer import agent_name_normalizer
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            # Create hook instance
         
     | 
| 
      
 14 
     | 
    
         
            +
            hook = TodoAgentPrefixHook()
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            # Test cases from the failing test
         
     | 
| 
      
 17 
     | 
    
         
            +
            test_cases = [
         
     | 
| 
      
 18 
     | 
    
         
            +
                ("Research best practices for testing", "[Research]"),
         
     | 
| 
      
 19 
     | 
    
         
            +
                ("Implement new feature", "[Engineer]"),
         
     | 
| 
      
 20 
     | 
    
         
            +
                ("Test the implementation", "[QA]"),
         
     | 
| 
      
 21 
     | 
    
         
            +
                ("Document the API", "[Documentation]"),
         
     | 
| 
      
 22 
     | 
    
         
            +
                ("Check security vulnerabilities", "[Security]"),
         
     | 
| 
      
 23 
     | 
    
         
            +
                ("Deploy to production", "[Ops]"),
         
     | 
| 
      
 24 
     | 
    
         
            +
                ("Create data pipeline", "[Data Engineer]"),
         
     | 
| 
      
 25 
     | 
    
         
            +
                ("Create new git branch", "[Version Control]"),
         
     | 
| 
      
 26 
     | 
    
         
            +
            ]
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            for content, expected_prefix in test_cases:
         
     | 
| 
      
 29 
     | 
    
         
            +
                print(f"\nTesting: '{content}'")
         
     | 
| 
      
 30 
     | 
    
         
            +
                print(f"Expected prefix: {expected_prefix}")
         
     | 
| 
      
 31 
     | 
    
         
            +
                
         
     | 
| 
      
 32 
     | 
    
         
            +
                # Check if it already has a prefix
         
     | 
| 
      
 33 
     | 
    
         
            +
                has_prefix = hook._has_agent_prefix(content)
         
     | 
| 
      
 34 
     | 
    
         
            +
                print(f"Has prefix: {has_prefix}")
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                # Check what agent it suggests
         
     | 
| 
      
 37 
     | 
    
         
            +
                suggested = hook._suggest_agent(content)
         
     | 
| 
      
 38 
     | 
    
         
            +
                print(f"Suggested agent: {suggested}")
         
     | 
| 
      
 39 
     | 
    
         
            +
                
         
     | 
| 
      
 40 
     | 
    
         
            +
                if suggested:
         
     | 
| 
      
 41 
     | 
    
         
            +
                    prefix = agent_name_normalizer.to_todo_prefix(suggested)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    print(f"Generated prefix: {prefix}")
         
     | 
| 
      
 43 
     | 
    
         
            +
                
         
     | 
| 
      
 44 
     | 
    
         
            +
                # Create context and execute
         
     | 
| 
      
 45 
     | 
    
         
            +
                context = HookContext(
         
     | 
| 
      
 46 
     | 
    
         
            +
                    hook_type=HookType.CUSTOM,
         
     | 
| 
      
 47 
     | 
    
         
            +
                    data={
         
     | 
| 
      
 48 
     | 
    
         
            +
                        'tool_name': 'TodoWrite',
         
     | 
| 
      
 49 
     | 
    
         
            +
                        'parameters': {
         
     | 
| 
      
 50 
     | 
    
         
            +
                            'todos': [{'content': content}]
         
     | 
| 
      
 51 
     | 
    
         
            +
                        }
         
     | 
| 
      
 52 
     | 
    
         
            +
                    },
         
     | 
| 
      
 53 
     | 
    
         
            +
                    metadata={},
         
     | 
| 
      
 54 
     | 
    
         
            +
                    timestamp=datetime.now()
         
     | 
| 
      
 55 
     | 
    
         
            +
                )
         
     | 
| 
      
 56 
     | 
    
         
            +
                
         
     | 
| 
      
 57 
     | 
    
         
            +
                result = hook.execute(context)
         
     | 
| 
      
 58 
     | 
    
         
            +
                print(f"Result - Success: {result.success}, Modified: {result.modified}")
         
     | 
| 
      
 59 
     | 
    
         
            +
                
         
     | 
| 
      
 60 
     | 
    
         
            +
                if result.modified and result.data:
         
     | 
| 
      
 61 
     | 
    
         
            +
                    updated_content = result.data['parameters']['todos'][0]['content']
         
     | 
| 
      
 62 
     | 
    
         
            +
                    print(f"Updated content: '{updated_content}'")
         
     | 
| 
      
 63 
     | 
    
         
            +
                elif result.error:
         
     | 
| 
      
 64 
     | 
    
         
            +
                    print(f"Error: {result.error}")
         
     | 
| 
      
 65 
     | 
    
         
            +
                
         
     | 
| 
      
 66 
     | 
    
         
            +
                print("-" * 50)
         
     | 
| 
         @@ -0,0 +1,282 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env python3
         
     | 
| 
      
 2 
     | 
    
         
            +
            """
         
     | 
| 
      
 3 
     | 
    
         
            +
            Demonstration script showing agent name consistency between TodoWrite and Task tools.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            This script demonstrates:
         
     | 
| 
      
 6 
     | 
    
         
            +
            1. TodoWrite accepting bracketed agent names like [Research], [Version Control]
         
     | 
| 
      
 7 
     | 
    
         
            +
            2. Task tool accepting both capitalized and lowercase formats
         
     | 
| 
      
 8 
     | 
    
         
            +
            3. Proper conversion between formats
         
     | 
| 
      
 9 
     | 
    
         
            +
            4. Error handling for invalid agent names
         
     | 
| 
      
 10 
     | 
    
         
            +
            """
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            import sys
         
     | 
| 
      
 13 
     | 
    
         
            +
            import os
         
     | 
| 
      
 14 
     | 
    
         
            +
            sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            from datetime import datetime
         
     | 
| 
      
 17 
     | 
    
         
            +
            from claude_mpm.core.agent_name_normalizer import AgentNameNormalizer, agent_name_normalizer
         
     | 
| 
      
 18 
     | 
    
         
            +
            from claude_mpm.hooks.builtin.todo_agent_prefix_hook import (
         
     | 
| 
      
 19 
     | 
    
         
            +
                TodoAgentPrefixHook,
         
     | 
| 
      
 20 
     | 
    
         
            +
                TodoAgentPrefixValidatorHook
         
     | 
| 
      
 21 
     | 
    
         
            +
            )
         
     | 
| 
      
 22 
     | 
    
         
            +
            from claude_mpm.hooks.base_hook import HookContext, HookType
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            def print_section(title):
         
     | 
| 
      
 26 
     | 
    
         
            +
                """Print a formatted section header."""
         
     | 
| 
      
 27 
     | 
    
         
            +
                print(f"\n{'='*60}")
         
     | 
| 
      
 28 
     | 
    
         
            +
                print(f" {title}")
         
     | 
| 
      
 29 
     | 
    
         
            +
                print('='*60)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            def demonstrate_agent_normalization():
         
     | 
| 
      
 33 
     | 
    
         
            +
                """Demonstrate the agent name normalization functionality."""
         
     | 
| 
      
 34 
     | 
    
         
            +
                print_section("Agent Name Normalization")
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                # Show all supported agents
         
     | 
| 
      
 37 
     | 
    
         
            +
                print("\nSupported agent types:")
         
     | 
| 
      
 38 
     | 
    
         
            +
                for key, canonical in AgentNameNormalizer.CANONICAL_NAMES.items():
         
     | 
| 
      
 39 
     | 
    
         
            +
                    print(f"  {key:20} -> {canonical}")
         
     | 
| 
      
 40 
     | 
    
         
            +
                
         
     | 
| 
      
 41 
     | 
    
         
            +
                # Demonstrate normalization
         
     | 
| 
      
 42 
     | 
    
         
            +
                print("\nNormalization examples:")
         
     | 
| 
      
 43 
     | 
    
         
            +
                test_inputs = [
         
     | 
| 
      
 44 
     | 
    
         
            +
                    "research", "Research", "RESEARCH", "researcher",
         
     | 
| 
      
 45 
     | 
    
         
            +
                    "version_control", "version-control", "Version Control", "git",
         
     | 
| 
      
 46 
     | 
    
         
            +
                    "data_engineer", "data-engineer", "Data Engineer", "data",
         
     | 
| 
      
 47 
     | 
    
         
            +
                    "qa", "QA", "testing", "test",
         
     | 
| 
      
 48 
     | 
    
         
            +
                ]
         
     | 
| 
      
 49 
     | 
    
         
            +
                
         
     | 
| 
      
 50 
     | 
    
         
            +
                for input_name in test_inputs:
         
     | 
| 
      
 51 
     | 
    
         
            +
                    normalized = AgentNameNormalizer.normalize(input_name)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    print(f"  '{input_name:20}' -> '{normalized}'")
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            def demonstrate_todo_format():
         
     | 
| 
      
 56 
     | 
    
         
            +
                """Demonstrate TodoWrite format handling."""
         
     | 
| 
      
 57 
     | 
    
         
            +
                print_section("TodoWrite Format")
         
     | 
| 
      
 58 
     | 
    
         
            +
                
         
     | 
| 
      
 59 
     | 
    
         
            +
                # Show TODO prefix generation
         
     | 
| 
      
 60 
     | 
    
         
            +
                print("\nTODO prefix generation:")
         
     | 
| 
      
 61 
     | 
    
         
            +
                agents = ["Research", "Engineer", "Version Control", "Data Engineer", "QA"]
         
     | 
| 
      
 62 
     | 
    
         
            +
                for agent in agents:
         
     | 
| 
      
 63 
     | 
    
         
            +
                    prefix = AgentNameNormalizer.to_todo_prefix(agent)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    print(f"  {agent:20} -> {prefix}")
         
     | 
| 
      
 65 
     | 
    
         
            +
                
         
     | 
| 
      
 66 
     | 
    
         
            +
                # Show extraction from TODOs
         
     | 
| 
      
 67 
     | 
    
         
            +
                print("\nExtracting agents from TODO text:")
         
     | 
| 
      
 68 
     | 
    
         
            +
                todos = [
         
     | 
| 
      
 69 
     | 
    
         
            +
                    "[Research] Analyze user behavior patterns",
         
     | 
| 
      
 70 
     | 
    
         
            +
                    "[Version Control] Create release branch v2.0",
         
     | 
| 
      
 71 
     | 
    
         
            +
                    "[Data Engineer] Build data pipeline for analytics",
         
     | 
| 
      
 72 
     | 
    
         
            +
                    "[QA] Run integration test suite",
         
     | 
| 
      
 73 
     | 
    
         
            +
                    "[Security] Perform security audit",
         
     | 
| 
      
 74 
     | 
    
         
            +
                ]
         
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
      
 76 
     | 
    
         
            +
                for todo in todos:
         
     | 
| 
      
 77 
     | 
    
         
            +
                    agent = AgentNameNormalizer.extract_from_todo(todo)
         
     | 
| 
      
 78 
     | 
    
         
            +
                    print(f"  '{todo[:50]}...' -> Agent: {agent}")
         
     | 
| 
      
 79 
     | 
    
         
            +
                
         
     | 
| 
      
 80 
     | 
    
         
            +
                # Show validation
         
     | 
| 
      
 81 
     | 
    
         
            +
                print("\nTODO format validation:")
         
     | 
| 
      
 82 
     | 
    
         
            +
                test_todos = [
         
     | 
| 
      
 83 
     | 
    
         
            +
                    "[Research] Valid todo",
         
     | 
| 
      
 84 
     | 
    
         
            +
                    "[Invalid Agent] This won't work",
         
     | 
| 
      
 85 
     | 
    
         
            +
                    "Missing prefix todo",
         
     | 
| 
      
 86 
     | 
    
         
            +
                    "[Version Control] Another valid todo",
         
     | 
| 
      
 87 
     | 
    
         
            +
                ]
         
     | 
| 
      
 88 
     | 
    
         
            +
                
         
     | 
| 
      
 89 
     | 
    
         
            +
                for todo in test_todos:
         
     | 
| 
      
 90 
     | 
    
         
            +
                    is_valid, error = AgentNameNormalizer.validate_todo_format(todo)
         
     | 
| 
      
 91 
     | 
    
         
            +
                    status = "✓ Valid" if is_valid else f"✗ Invalid: {error[:50]}..."
         
     | 
| 
      
 92 
     | 
    
         
            +
                    print(f"  '{todo[:30]:30}' -> {status}")
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
            def demonstrate_task_format_conversion():
         
     | 
| 
      
 96 
     | 
    
         
            +
                """Demonstrate conversion between TodoWrite and Task formats."""
         
     | 
| 
      
 97 
     | 
    
         
            +
                print_section("TodoWrite <-> Task Format Conversion")
         
     | 
| 
      
 98 
     | 
    
         
            +
                
         
     | 
| 
      
 99 
     | 
    
         
            +
                # TodoWrite to Task format
         
     | 
| 
      
 100 
     | 
    
         
            +
                print("\nTodoWrite format -> Task format:")
         
     | 
| 
      
 101 
     | 
    
         
            +
                todo_formats = [
         
     | 
| 
      
 102 
     | 
    
         
            +
                    "Research", "Engineer", "QA", "Security",
         
     | 
| 
      
 103 
     | 
    
         
            +
                    "Documentation", "Ops", "Version Control",
         
     | 
| 
      
 104 
     | 
    
         
            +
                    "Data Engineer", "Architect", "PM"
         
     | 
| 
      
 105 
     | 
    
         
            +
                ]
         
     | 
| 
      
 106 
     | 
    
         
            +
                
         
     | 
| 
      
 107 
     | 
    
         
            +
                for todo_format in todo_formats:
         
     | 
| 
      
 108 
     | 
    
         
            +
                    task_format = AgentNameNormalizer.to_task_format(todo_format)
         
     | 
| 
      
 109 
     | 
    
         
            +
                    print(f"  {todo_format:20} -> {task_format}")
         
     | 
| 
      
 110 
     | 
    
         
            +
                
         
     | 
| 
      
 111 
     | 
    
         
            +
                # Task to TodoWrite format
         
     | 
| 
      
 112 
     | 
    
         
            +
                print("\nTask format -> TodoWrite format:")
         
     | 
| 
      
 113 
     | 
    
         
            +
                task_formats = [
         
     | 
| 
      
 114 
     | 
    
         
            +
                    "research", "engineer", "qa", "security",
         
     | 
| 
      
 115 
     | 
    
         
            +
                    "documentation", "ops", "version-control",
         
     | 
| 
      
 116 
     | 
    
         
            +
                    "data-engineer", "architect", "pm"
         
     | 
| 
      
 117 
     | 
    
         
            +
                ]
         
     | 
| 
      
 118 
     | 
    
         
            +
                
         
     | 
| 
      
 119 
     | 
    
         
            +
                for task_format in task_formats:
         
     | 
| 
      
 120 
     | 
    
         
            +
                    todo_format = AgentNameNormalizer.from_task_format(task_format)
         
     | 
| 
      
 121 
     | 
    
         
            +
                    print(f"  {task_format:20} -> {todo_format}")
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
            def demonstrate_hook_behavior():
         
     | 
| 
      
 125 
     | 
    
         
            +
                """Demonstrate the TodoAgentPrefixHook behavior."""
         
     | 
| 
      
 126 
     | 
    
         
            +
                print_section("TodoAgentPrefixHook Behavior")
         
     | 
| 
      
 127 
     | 
    
         
            +
                
         
     | 
| 
      
 128 
     | 
    
         
            +
                hook = TodoAgentPrefixHook()
         
     | 
| 
      
 129 
     | 
    
         
            +
                
         
     | 
| 
      
 130 
     | 
    
         
            +
                # Test auto-prefix addition
         
     | 
| 
      
 131 
     | 
    
         
            +
                print("\nAuto-prefix addition:")
         
     | 
| 
      
 132 
     | 
    
         
            +
                test_todos = [
         
     | 
| 
      
 133 
     | 
    
         
            +
                    "Research best practices for microservices",
         
     | 
| 
      
 134 
     | 
    
         
            +
                    "Implement user authentication feature",
         
     | 
| 
      
 135 
     | 
    
         
            +
                    "Test the new API endpoints",
         
     | 
| 
      
 136 
     | 
    
         
            +
                    "Document the deployment process",
         
     | 
| 
      
 137 
     | 
    
         
            +
                    "Deploy to production environment",
         
     | 
| 
      
 138 
     | 
    
         
            +
                    "Create data pipeline for analytics",
         
     | 
| 
      
 139 
     | 
    
         
            +
                    "Create git branch for hotfix",
         
     | 
| 
      
 140 
     | 
    
         
            +
                ]
         
     | 
| 
      
 141 
     | 
    
         
            +
                
         
     | 
| 
      
 142 
     | 
    
         
            +
                for todo_content in test_todos:
         
     | 
| 
      
 143 
     | 
    
         
            +
                    context = HookContext(
         
     | 
| 
      
 144 
     | 
    
         
            +
                        hook_type=HookType.CUSTOM,
         
     | 
| 
      
 145 
     | 
    
         
            +
                        data={
         
     | 
| 
      
 146 
     | 
    
         
            +
                            'tool_name': 'TodoWrite',
         
     | 
| 
      
 147 
     | 
    
         
            +
                            'parameters': {
         
     | 
| 
      
 148 
     | 
    
         
            +
                                'todos': [{'content': todo_content}]
         
     | 
| 
      
 149 
     | 
    
         
            +
                            }
         
     | 
| 
      
 150 
     | 
    
         
            +
                        },
         
     | 
| 
      
 151 
     | 
    
         
            +
                        metadata={},
         
     | 
| 
      
 152 
     | 
    
         
            +
                        timestamp=datetime.now()
         
     | 
| 
      
 153 
     | 
    
         
            +
                    )
         
     | 
| 
      
 154 
     | 
    
         
            +
                    
         
     | 
| 
      
 155 
     | 
    
         
            +
                    result = hook.execute(context)
         
     | 
| 
      
 156 
     | 
    
         
            +
                    
         
     | 
| 
      
 157 
     | 
    
         
            +
                    if result.success and result.modified:
         
     | 
| 
      
 158 
     | 
    
         
            +
                        new_content = result.data['parameters']['todos'][0]['content']
         
     | 
| 
      
 159 
     | 
    
         
            +
                        print(f"  '{todo_content[:40]:40}' -> '{new_content}'")
         
     | 
| 
      
 160 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 161 
     | 
    
         
            +
                        print(f"  '{todo_content[:40]:40}' -> Error: {result.error[:30]}...")
         
     | 
| 
      
 162 
     | 
    
         
            +
                
         
     | 
| 
      
 163 
     | 
    
         
            +
                # Test preservation of existing prefixes
         
     | 
| 
      
 164 
     | 
    
         
            +
                print("\nPreservation of existing prefixes:")
         
     | 
| 
      
 165 
     | 
    
         
            +
                prefixed_todos = [
         
     | 
| 
      
 166 
     | 
    
         
            +
                    "[Research] Analyze patterns",
         
     | 
| 
      
 167 
     | 
    
         
            +
                    "[Version Control] Create release",
         
     | 
| 
      
 168 
     | 
    
         
            +
                    "[Data Engineer] Build pipeline",
         
     | 
| 
      
 169 
     | 
    
         
            +
                ]
         
     | 
| 
      
 170 
     | 
    
         
            +
                
         
     | 
| 
      
 171 
     | 
    
         
            +
                for todo_content in prefixed_todos:
         
     | 
| 
      
 172 
     | 
    
         
            +
                    context = HookContext(
         
     | 
| 
      
 173 
     | 
    
         
            +
                        hook_type=HookType.CUSTOM,
         
     | 
| 
      
 174 
     | 
    
         
            +
                        data={
         
     | 
| 
      
 175 
     | 
    
         
            +
                            'tool_name': 'TodoWrite',
         
     | 
| 
      
 176 
     | 
    
         
            +
                            'parameters': {
         
     | 
| 
      
 177 
     | 
    
         
            +
                                'todos': [{'content': todo_content}]
         
     | 
| 
      
 178 
     | 
    
         
            +
                            }
         
     | 
| 
      
 179 
     | 
    
         
            +
                        },
         
     | 
| 
      
 180 
     | 
    
         
            +
                        metadata={},
         
     | 
| 
      
 181 
     | 
    
         
            +
                        timestamp=datetime.now()
         
     | 
| 
      
 182 
     | 
    
         
            +
                    )
         
     | 
| 
      
 183 
     | 
    
         
            +
                    
         
     | 
| 
      
 184 
     | 
    
         
            +
                    result = hook.execute(context)
         
     | 
| 
      
 185 
     | 
    
         
            +
                    
         
     | 
| 
      
 186 
     | 
    
         
            +
                    status = "Not modified" if not result.modified else "Modified"
         
     | 
| 
      
 187 
     | 
    
         
            +
                    print(f"  '{todo_content}' -> {status}")
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
             
     | 
| 
      
 190 
     | 
    
         
            +
            def demonstrate_color_coding():
         
     | 
| 
      
 191 
     | 
    
         
            +
                """Demonstrate agent color coding."""
         
     | 
| 
      
 192 
     | 
    
         
            +
                print_section("Agent Color Coding")
         
     | 
| 
      
 193 
     | 
    
         
            +
                
         
     | 
| 
      
 194 
     | 
    
         
            +
                print("\nColorized agent names:")
         
     | 
| 
      
 195 
     | 
    
         
            +
                agents = ["Research", "Engineer", "QA", "Security", "Documentation", 
         
     | 
| 
      
 196 
     | 
    
         
            +
                          "Ops", "Version Control", "Data Engineer", "Architect", "PM"]
         
     | 
| 
      
 197 
     | 
    
         
            +
                
         
     | 
| 
      
 198 
     | 
    
         
            +
                for agent in agents:
         
     | 
| 
      
 199 
     | 
    
         
            +
                    colorized = AgentNameNormalizer.colorize(agent)
         
     | 
| 
      
 200 
     | 
    
         
            +
                    print(f"  {colorized}")
         
     | 
| 
      
 201 
     | 
    
         
            +
                
         
     | 
| 
      
 202 
     | 
    
         
            +
                print("\nColorized with custom text:")
         
     | 
| 
      
 203 
     | 
    
         
            +
                colorized = AgentNameNormalizer.colorize("research", "[Research] Analyze patterns")
         
     | 
| 
      
 204 
     | 
    
         
            +
                print(f"  {colorized}")
         
     | 
| 
      
 205 
     | 
    
         
            +
             
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
            def demonstrate_error_cases():
         
     | 
| 
      
 208 
     | 
    
         
            +
                """Demonstrate error handling."""
         
     | 
| 
      
 209 
     | 
    
         
            +
                print_section("Error Handling")
         
     | 
| 
      
 210 
     | 
    
         
            +
                
         
     | 
| 
      
 211 
     | 
    
         
            +
                # Unknown agents
         
     | 
| 
      
 212 
     | 
    
         
            +
                print("\nHandling unknown agents:")
         
     | 
| 
      
 213 
     | 
    
         
            +
                unknown = ["unknown_agent", "random", "xyz", ""]
         
     | 
| 
      
 214 
     | 
    
         
            +
                for agent in unknown:
         
     | 
| 
      
 215 
     | 
    
         
            +
                    normalized = AgentNameNormalizer.normalize(agent)
         
     | 
| 
      
 216 
     | 
    
         
            +
                    print(f"  '{agent:20}' -> '{normalized}' (fallback)")
         
     | 
| 
      
 217 
     | 
    
         
            +
                
         
     | 
| 
      
 218 
     | 
    
         
            +
                # Invalid TODO formats
         
     | 
| 
      
 219 
     | 
    
         
            +
                validator = TodoAgentPrefixValidatorHook()
         
     | 
| 
      
 220 
     | 
    
         
            +
                
         
     | 
| 
      
 221 
     | 
    
         
            +
                print("\nValidating invalid TODO formats:")
         
     | 
| 
      
 222 
     | 
    
         
            +
                invalid_todos = [
         
     | 
| 
      
 223 
     | 
    
         
            +
                    "No prefix here",
         
     | 
| 
      
 224 
     | 
    
         
            +
                    "[Unknown] Invalid agent",
         
     | 
| 
      
 225 
     | 
    
         
            +
                    "[] Empty brackets",
         
     | 
| 
      
 226 
     | 
    
         
            +
                    "[Research] [Engineer] Multiple prefixes?",
         
     | 
| 
      
 227 
     | 
    
         
            +
                ]
         
     | 
| 
      
 228 
     | 
    
         
            +
                
         
     | 
| 
      
 229 
     | 
    
         
            +
                for todo_content in invalid_todos:
         
     | 
| 
      
 230 
     | 
    
         
            +
                    context = HookContext(
         
     | 
| 
      
 231 
     | 
    
         
            +
                        hook_type=HookType.CUSTOM,
         
     | 
| 
      
 232 
     | 
    
         
            +
                        data={
         
     | 
| 
      
 233 
     | 
    
         
            +
                            'tool_name': 'TodoWrite',
         
     | 
| 
      
 234 
     | 
    
         
            +
                            'parameters': {
         
     | 
| 
      
 235 
     | 
    
         
            +
                                'todos': [{'content': todo_content}]
         
     | 
| 
      
 236 
     | 
    
         
            +
                            }
         
     | 
| 
      
 237 
     | 
    
         
            +
                        },
         
     | 
| 
      
 238 
     | 
    
         
            +
                        metadata={},
         
     | 
| 
      
 239 
     | 
    
         
            +
                        timestamp=datetime.now()
         
     | 
| 
      
 240 
     | 
    
         
            +
                    )
         
     | 
| 
      
 241 
     | 
    
         
            +
                    
         
     | 
| 
      
 242 
     | 
    
         
            +
                    result = validator.execute(context)
         
     | 
| 
      
 243 
     | 
    
         
            +
                    
         
     | 
| 
      
 244 
     | 
    
         
            +
                    if not result.success:
         
     | 
| 
      
 245 
     | 
    
         
            +
                        print(f"  '{todo_content[:30]:30}' -> Error detected")
         
     | 
| 
      
 246 
     | 
    
         
            +
             
     | 
| 
      
 247 
     | 
    
         
            +
             
     | 
| 
      
 248 
     | 
    
         
            +
            def main():
         
     | 
| 
      
 249 
     | 
    
         
            +
                """Run all demonstrations."""
         
     | 
| 
      
 250 
     | 
    
         
            +
                print("\n" + "="*60)
         
     | 
| 
      
 251 
     | 
    
         
            +
                print(" Agent Name Consistency Demonstration")
         
     | 
| 
      
 252 
     | 
    
         
            +
                print(" TodoWrite and Task Tool Integration")
         
     | 
| 
      
 253 
     | 
    
         
            +
                print("="*60)
         
     | 
| 
      
 254 
     | 
    
         
            +
                
         
     | 
| 
      
 255 
     | 
    
         
            +
                demonstrate_agent_normalization()
         
     | 
| 
      
 256 
     | 
    
         
            +
                demonstrate_todo_format()
         
     | 
| 
      
 257 
     | 
    
         
            +
                demonstrate_task_format_conversion()
         
     | 
| 
      
 258 
     | 
    
         
            +
                demonstrate_hook_behavior()
         
     | 
| 
      
 259 
     | 
    
         
            +
                demonstrate_color_coding()
         
     | 
| 
      
 260 
     | 
    
         
            +
                demonstrate_error_cases()
         
     | 
| 
      
 261 
     | 
    
         
            +
                
         
     | 
| 
      
 262 
     | 
    
         
            +
                print_section("Summary")
         
     | 
| 
      
 263 
     | 
    
         
            +
                print("""
         
     | 
| 
      
 264 
     | 
    
         
            +
            This demonstration shows that:
         
     | 
| 
      
 265 
     | 
    
         
            +
             
     | 
| 
      
 266 
     | 
    
         
            +
            1. ✓ TodoWrite accepts bracketed agent names like [Research], [Version Control]
         
     | 
| 
      
 267 
     | 
    
         
            +
            2. ✓ Task tool can accept both formats:
         
     | 
| 
      
 268 
     | 
    
         
            +
               - Capitalized: "Research", "Version Control"
         
     | 
| 
      
 269 
     | 
    
         
            +
               - Lowercase with hyphens: "research", "version-control"
         
     | 
| 
      
 270 
     | 
    
         
            +
            3. ✓ Proper conversion between formats is supported
         
     | 
| 
      
 271 
     | 
    
         
            +
            4. ✓ Invalid agent names are handled with appropriate errors
         
     | 
| 
      
 272 
     | 
    
         
            +
            5. ✓ All agent types have consistent naming across the system
         
     | 
| 
      
 273 
     | 
    
         
            +
             
     | 
| 
      
 274 
     | 
    
         
            +
            The agent name normalization ensures consistency between:
         
     | 
| 
      
 275 
     | 
    
         
            +
            - TodoWrite prefixes: [Research], [Version Control], [Data Engineer]
         
     | 
| 
      
 276 
     | 
    
         
            +
            - Task tool formats: research, version-control, data-engineer
         
     | 
| 
      
 277 
     | 
    
         
            +
            - Display names: Research, Version Control, Data Engineer
         
     | 
| 
      
 278 
     | 
    
         
            +
            """)
         
     | 
| 
      
 279 
     | 
    
         
            +
             
     | 
| 
      
 280 
     | 
    
         
            +
             
     | 
| 
      
 281 
     | 
    
         
            +
            if __name__ == "__main__":
         
     | 
| 
      
 282 
     | 
    
         
            +
                main()
         
     | 
| 
         @@ -0,0 +1,82 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env python3
         
     | 
| 
      
 2 
     | 
    
         
            +
            """Test script to verify agent name normalization functionality."""
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            import sys
         
     | 
| 
      
 5 
     | 
    
         
            +
            import os
         
     | 
| 
      
 6 
     | 
    
         
            +
            sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            from claude_mpm.core.agent_name_normalizer import AgentNameNormalizer
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            def test_agent_name_formats():
         
     | 
| 
      
 11 
     | 
    
         
            +
                """Test various agent name format conversions."""
         
     | 
| 
      
 12 
     | 
    
         
            +
                normalizer = AgentNameNormalizer()
         
     | 
| 
      
 13 
     | 
    
         
            +
                
         
     | 
| 
      
 14 
     | 
    
         
            +
                print("Testing Agent Name Format Conversions")
         
     | 
| 
      
 15 
     | 
    
         
            +
                print("=" * 50)
         
     | 
| 
      
 16 
     | 
    
         
            +
                
         
     | 
| 
      
 17 
     | 
    
         
            +
                # Test cases mapping TodoWrite format to Task format
         
     | 
| 
      
 18 
     | 
    
         
            +
                test_cases = [
         
     | 
| 
      
 19 
     | 
    
         
            +
                    ("Research", "research"),
         
     | 
| 
      
 20 
     | 
    
         
            +
                    ("Engineer", "engineer"),
         
     | 
| 
      
 21 
     | 
    
         
            +
                    ("QA", "qa"),
         
     | 
| 
      
 22 
     | 
    
         
            +
                    ("Documentation", "documentation"),
         
     | 
| 
      
 23 
     | 
    
         
            +
                    ("Security", "security"),
         
     | 
| 
      
 24 
     | 
    
         
            +
                    ("Ops", "ops"),
         
     | 
| 
      
 25 
     | 
    
         
            +
                    ("Version Control", "version-control"),
         
     | 
| 
      
 26 
     | 
    
         
            +
                    ("Data Engineer", "data-engineer"),
         
     | 
| 
      
 27 
     | 
    
         
            +
                    # Also test lowercase inputs
         
     | 
| 
      
 28 
     | 
    
         
            +
                    ("research", "research"),
         
     | 
| 
      
 29 
     | 
    
         
            +
                    ("version-control", "version-control"),
         
     | 
| 
      
 30 
     | 
    
         
            +
                    ("data-engineer", "data-engineer"),
         
     | 
| 
      
 31 
     | 
    
         
            +
                ]
         
     | 
| 
      
 32 
     | 
    
         
            +
                
         
     | 
| 
      
 33 
     | 
    
         
            +
                print("\nTodoWrite Format → Task Format:")
         
     | 
| 
      
 34 
     | 
    
         
            +
                print("-" * 50)
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                all_passed = True
         
     | 
| 
      
 37 
     | 
    
         
            +
                for todo_format, expected_task_format in test_cases:
         
     | 
| 
      
 38 
     | 
    
         
            +
                    actual = normalizer.to_task_format(todo_format)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    status = "✓" if actual == expected_task_format else "✗"
         
     | 
| 
      
 40 
     | 
    
         
            +
                    
         
     | 
| 
      
 41 
     | 
    
         
            +
                    if actual != expected_task_format:
         
     | 
| 
      
 42 
     | 
    
         
            +
                        all_passed = False
         
     | 
| 
      
 43 
     | 
    
         
            +
                        
         
     | 
| 
      
 44 
     | 
    
         
            +
                    print(f"{status} '{todo_format}' → '{actual}' (expected: '{expected_task_format}')")
         
     | 
| 
      
 45 
     | 
    
         
            +
                
         
     | 
| 
      
 46 
     | 
    
         
            +
                print("\n" + "-" * 50)
         
     | 
| 
      
 47 
     | 
    
         
            +
                
         
     | 
| 
      
 48 
     | 
    
         
            +
                # Test reverse conversion
         
     | 
| 
      
 49 
     | 
    
         
            +
                print("\nTask Format → TodoWrite Format:")
         
     | 
| 
      
 50 
     | 
    
         
            +
                print("-" * 50)
         
     | 
| 
      
 51 
     | 
    
         
            +
                
         
     | 
| 
      
 52 
     | 
    
         
            +
                reverse_test_cases = [
         
     | 
| 
      
 53 
     | 
    
         
            +
                    ("research", "Research"),
         
     | 
| 
      
 54 
     | 
    
         
            +
                    ("engineer", "Engineer"),
         
     | 
| 
      
 55 
     | 
    
         
            +
                    ("qa", "QA"),
         
     | 
| 
      
 56 
     | 
    
         
            +
                    ("documentation", "Documentation"),
         
     | 
| 
      
 57 
     | 
    
         
            +
                    ("security", "Security"),
         
     | 
| 
      
 58 
     | 
    
         
            +
                    ("ops", "Ops"),
         
     | 
| 
      
 59 
     | 
    
         
            +
                    ("version-control", "Version Control"),
         
     | 
| 
      
 60 
     | 
    
         
            +
                    ("data-engineer", "Data Engineer"),
         
     | 
| 
      
 61 
     | 
    
         
            +
                ]
         
     | 
| 
      
 62 
     | 
    
         
            +
                
         
     | 
| 
      
 63 
     | 
    
         
            +
                for task_format, expected_todo_format in reverse_test_cases:
         
     | 
| 
      
 64 
     | 
    
         
            +
                    actual = normalizer.from_task_format(task_format)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    status = "✓" if actual == expected_todo_format else "✗"
         
     | 
| 
      
 66 
     | 
    
         
            +
                    
         
     | 
| 
      
 67 
     | 
    
         
            +
                    if actual != expected_todo_format:
         
     | 
| 
      
 68 
     | 
    
         
            +
                        all_passed = False
         
     | 
| 
      
 69 
     | 
    
         
            +
                        
         
     | 
| 
      
 70 
     | 
    
         
            +
                    print(f"{status} '{task_format}' → '{actual}' (expected: '{expected_todo_format}')")
         
     | 
| 
      
 71 
     | 
    
         
            +
                
         
     | 
| 
      
 72 
     | 
    
         
            +
                print("\n" + "=" * 50)
         
     | 
| 
      
 73 
     | 
    
         
            +
                
         
     | 
| 
      
 74 
     | 
    
         
            +
                if all_passed:
         
     | 
| 
      
 75 
     | 
    
         
            +
                    print("✅ All tests passed!")
         
     | 
| 
      
 76 
     | 
    
         
            +
                    return 0
         
     | 
| 
      
 77 
     | 
    
         
            +
                else:
         
     | 
| 
      
 78 
     | 
    
         
            +
                    print("❌ Some tests failed!")
         
     | 
| 
      
 79 
     | 
    
         
            +
                    return 1
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            if __name__ == "__main__":
         
     | 
| 
      
 82 
     | 
    
         
            +
                sys.exit(test_agent_name_formats())
         
     |