multi-agent-platform 0.2.0__tar.gz → 0.3.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.
Files changed (311) hide show
  1. {multi_agent_platform-0.2.0/multi_agent_platform.egg-info → multi_agent_platform-0.3.0}/PKG-INFO +19 -1
  2. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/README.md +18 -0
  3. multi_agent_platform-0.3.0/cli/commands/skill.py +168 -0
  4. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/main.py +2 -0
  5. multi_agent_platform-0.3.0/cli/skills/experiment-host/SKILL.md +223 -0
  6. multi_agent_platform-0.3.0/cli/skills/experiment-reviewer/SKILL.md +108 -0
  7. multi_agent_platform-0.3.0/cli/skills/map-project-collab/SKILL.md +365 -0
  8. multi_agent_platform-0.3.0/cli/skills/map-project-collab/scripts/map-bootstrap.sh +6 -0
  9. multi_agent_platform-0.3.0/cli/skills/map-runtime-waker/SKILL.md +89 -0
  10. multi_agent_platform-0.3.0/cli/skills/map-runtime-waker/agents/openai.yaml +4 -0
  11. multi_agent_platform-0.3.0/cli/skills/topic-host/SKILL.md +289 -0
  12. multi_agent_platform-0.3.0/cli/skills/topic-participant/SKILL.md +125 -0
  13. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0/multi_agent_platform.egg-info}/PKG-INFO +19 -1
  14. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/multi_agent_platform.egg-info/SOURCES.txt +11 -0
  15. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/pyproject.toml +4 -1
  16. multi_agent_platform-0.3.0/server/services/__init__.py +0 -0
  17. multi_agent_platform-0.3.0/tests/test_skill_install.py +164 -0
  18. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/LICENSE +0 -0
  19. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/__init__.py +0 -0
  20. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/action_item_escalation.py +0 -0
  21. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/agent_client.py +0 -0
  22. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/bridge_state.py +0 -0
  23. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/__init__.py +0 -0
  24. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/action.py +0 -0
  25. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/agent.py +0 -0
  26. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/audit.py +0 -0
  27. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/docs.py +0 -0
  28. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/experiment.py +0 -0
  29. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/feedback.py +0 -0
  30. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/notification.py +0 -0
  31. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/persona.py +0 -0
  32. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/project.py +0 -0
  33. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/runtime.py +0 -0
  34. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/sync.py +0 -0
  35. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/commands/topic.py +0 -0
  36. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/e2e_collab.py +0 -0
  37. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/git_checkpoint.py +0 -0
  38. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/host_worker_types.py +0 -0
  39. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/local_cache.py +0 -0
  40. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/map_command_client.py +0 -0
  41. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/participant_worker.py +0 -0
  42. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/project_export.py +0 -0
  43. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/reviewer_worker.py +0 -0
  44. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/runtime/__init__.py +0 -0
  45. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/runtime/run_lock.py +0 -0
  46. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/runtime_chat.py +0 -0
  47. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/session_wake_log.py +0 -0
  48. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/simple_waker.py +0 -0
  49. {multi_agent_platform-0.2.0/server → multi_agent_platform-0.3.0/cli/skills}/__init__.py +0 -0
  50. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/table_render.py +0 -0
  51. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/wake_backend.py +0 -0
  52. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/cli/worker_cycle_log.py +0 -0
  53. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/multi_agent_platform.egg-info/dependency_links.txt +0 -0
  54. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/multi_agent_platform.egg-info/entry_points.txt +0 -0
  55. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/multi_agent_platform.egg-info/requires.txt +0 -0
  56. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/multi_agent_platform.egg-info/top_level.txt +0 -0
  57. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/__init__.py +0 -0
  58. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/bootstrap.py +0 -0
  59. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/client.py +0 -0
  60. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/config.py +0 -0
  61. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/errors.py +0 -0
  62. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/exceptions.py +0 -0
  63. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/plan_evidence.py +0 -0
  64. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/project_config.py +0 -0
  65. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/result_template.py +0 -0
  66. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_client/testing.py +0 -0
  67. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/__init__.py +0 -0
  68. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/_utils.py +0 -0
  69. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/auth.py +0 -0
  70. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/config.py +0 -0
  71. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/context.py +0 -0
  72. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/main.py +0 -0
  73. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/server.py +0 -0
  74. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_mcp/session.py +0 -0
  75. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_sdk/__init__.py +0 -0
  76. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_sdk/evidence.py +0 -0
  77. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_types/__init__.py +0 -0
  78. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_types/enums.py +0 -0
  79. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/sdk/python/map_types/schemas.py +0 -0
  80. {multi_agent_platform-0.2.0/server/api → multi_agent_platform-0.3.0/server}/__init__.py +0 -0
  81. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/__version__.py +0 -0
  82. {multi_agent_platform-0.2.0/server/scripts → multi_agent_platform-0.3.0/server/api}/__init__.py +0 -0
  83. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/action_items.py +0 -0
  84. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/agents.py +0 -0
  85. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/audit.py +0 -0
  86. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/background_tasks.py +0 -0
  87. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/common.py +0 -0
  88. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/deps.py +0 -0
  89. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/experiments.py +0 -0
  90. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/feedback.py +0 -0
  91. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/notifications.py +0 -0
  92. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/projects.py +0 -0
  93. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/router.py +0 -0
  94. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/status.py +0 -0
  95. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/topics.py +0 -0
  96. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/api/webhooks.py +0 -0
  97. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/auth/__init__.py +0 -0
  98. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/auth/experiment_access.py +0 -0
  99. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/config.py +0 -0
  100. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/db/__init__.py +0 -0
  101. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/db/base.py +0 -0
  102. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/db/deadlock_retry.py +0 -0
  103. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/db/session.py +0 -0
  104. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/domain/__init__.py +0 -0
  105. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/domain/encrypted_types.py +0 -0
  106. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/domain/models.py +0 -0
  107. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/domain/schemas.py +0 -0
  108. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/domain/state_machine.py +0 -0
  109. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/domain/topic_ack_constants.py +0 -0
  110. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/main.py +0 -0
  111. {multi_agent_platform-0.2.0/server/services → multi_agent_platform-0.3.0/server/scripts}/__init__.py +0 -0
  112. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/scripts/migrate_notification_unique.py +0 -0
  113. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/scripts/purge_audit_pollution.py +0 -0
  114. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/_lookups.py +0 -0
  115. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/acceptance_service.py +0 -0
  116. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/action_item_migration_service.py +0 -0
  117. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/action_item_service.py +0 -0
  118. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/agent_work_service.py +0 -0
  119. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/archive_lint_service.py +0 -0
  120. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/audit_service.py +0 -0
  121. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/auth.py +0 -0
  122. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/comment_service.py +0 -0
  123. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/errors.py +0 -0
  124. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/escalation_resolver.py +0 -0
  125. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/evidence_service.py +0 -0
  126. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/experiment_capabilities_service.py +0 -0
  127. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/inbound_event_service.py +0 -0
  128. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/lock_service.py +0 -0
  129. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/log_service.py +0 -0
  130. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/mention_service.py +0 -0
  131. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/notification_service.py +0 -0
  132. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/notification_stream.py +0 -0
  133. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/permissions.py +0 -0
  134. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/persona_activity_service.py +0 -0
  135. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/phase_owner_resolver.py +0 -0
  136. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/phase_service.py +0 -0
  137. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/plan_marker_service.py +0 -0
  138. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/plan_service.py +0 -0
  139. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/platform_feedback_service.py +0 -0
  140. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/project_service.py +0 -0
  141. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/project_status_service.py +0 -0
  142. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/review_service.py +0 -0
  143. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/secret_encryption.py +0 -0
  144. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/similarity_service.py +0 -0
  145. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/sse_event_schemas.py +0 -0
  146. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/status_service.py +0 -0
  147. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/template_service.py +0 -0
  148. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/text_utils.py +0 -0
  149. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/thread_activity.py +0 -0
  150. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/todo_persona_filter.py +0 -0
  151. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/todo_service.py +0 -0
  152. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_ack_service.py +0 -0
  153. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_action_item_ops.py +0 -0
  154. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_comment_kind.py +0 -0
  155. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_comment_service.py +0 -0
  156. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_helpers.py +0 -0
  157. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_lifecycle_service.py +0 -0
  158. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_progress_service.py +0 -0
  159. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_resolve_service.py +0 -0
  160. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_service.py +0 -0
  161. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/topic_work_item_service.py +0 -0
  162. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/server/services/webhook_service.py +0 -0
  163. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/setup.cfg +0 -0
  164. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_18a64691_linkage.py +0 -0
  165. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_a2_action_item_cascade.py +0 -0
  166. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_accept_result_verdict.py +0 -0
  167. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_action_items.py +0 -0
  168. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_agent_client.py +0 -0
  169. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_agent_work.py +0 -0
  170. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_agents_list.py +0 -0
  171. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_arch_map_sdk_evidence.py +0 -0
  172. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_archive_lint_service.py +0 -0
  173. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_audit_admin_cli.py +0 -0
  174. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_audit_admin_filter.py +0 -0
  175. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_auth.py +0 -0
  176. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_auth_experiment_access.py +0 -0
  177. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_authz_cross_persona_capability.py +0 -0
  178. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_authz_pr3_creator_gating_extended.py +0 -0
  179. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_b_acceptance.py +0 -0
  180. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_b_action_item_stale.py +0 -0
  181. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_b_action_item_wake_endpoints.py +0 -0
  182. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_b_action_item_wake_stale.py +0 -0
  183. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_b_action_item_wake_stale_notifications.py +0 -0
  184. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_b_waker_should_wake_action_item.py +0 -0
  185. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_bridge_state.py +0 -0
  186. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cleanup_audit_log_no_commit.py +0 -0
  187. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cleanup_exp_b_paging_seven_endpoints.py +0 -0
  188. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cleanup_exp_b_paging_unified_limit.py +0 -0
  189. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_clear_action_template.py +0 -0
  190. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli.py +0 -0
  191. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_error_envelope.py +0 -0
  192. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_evidence_contract.py +0 -0
  193. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_format_priority.py +0 -0
  194. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_n2_hard_cutover.py +0 -0
  195. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_schema_discovery.py +0 -0
  196. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_status.py +0 -0
  197. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_template_contract.py +0 -0
  198. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cli_work_deprecation.py +0 -0
  199. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_cross_persona_call_audit.py +0 -0
  200. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_deadlock_retry.py +0 -0
  201. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_docs_inventory.py +0 -0
  202. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_fast_gate_whitelist_complete.py +0 -0
  203. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_agent_work_service.py +0 -0
  204. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_agents.py +0 -0
  205. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_experiment_capabilities_service.py +0 -0
  206. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_experiments_projects.py +0 -0
  207. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_mention_service.py +0 -0
  208. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_notification_service.py +0 -0
  209. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_phase_service.py +0 -0
  210. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_project_service.py +0 -0
  211. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_todo_service.py +0 -0
  212. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_topic_comment_service.py +0 -0
  213. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_topic_service.py +0 -0
  214. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_topic_work_item_service.py +0 -0
  215. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_mypy_strict_topics.py +0 -0
  216. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_typing_extensions_clean.py +0 -0
  217. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_uv_lock.py +0 -0
  218. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_eng_version_single_source.py +0 -0
  219. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_error_codes_cli.py +0 -0
  220. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_error_envelope_and_file_options.py +0 -0
  221. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_escalation_resolver.py +0 -0
  222. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_escalation_target_endpoint.py +0 -0
  223. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_evidence_service.py +0 -0
  224. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_experiment_capabilities.py +0 -0
  225. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_experiment_capabilities_whitelist.py +0 -0
  226. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_experiment_lock_fuzz.py +0 -0
  227. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_experiment_lock_notifications.py +0 -0
  228. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_experiment_lock_unit.py +0 -0
  229. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_experiments.py +0 -0
  230. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_feedback.py +0 -0
  231. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_feedback_admin_cli.py +0 -0
  232. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_field_rename_alias.py +0 -0
  233. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_git_checkpoint.py +0 -0
  234. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_inbound_event_rejection.py +0 -0
  235. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_local_cache.py +0 -0
  236. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_log_create_response.py +0 -0
  237. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_m2_flow.py +0 -0
  238. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_m3_flow.py +0 -0
  239. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_map_sdk_skeleton.py +0 -0
  240. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_mcp.py +0 -0
  241. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_mcp_http.py +0 -0
  242. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_mention_code_skip_unit.py +0 -0
  243. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_mentions.py +0 -0
  244. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_notification_bulk_filter.py +0 -0
  245. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_notification_service_v09.py +0 -0
  246. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_notification_stream.py +0 -0
  247. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_notification_upsert_pr2.py +0 -0
  248. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_notifications.py +0 -0
  249. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_participant_worker_claude_agent.py +0 -0
  250. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_perf_count_sql_fixture.py +0 -0
  251. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_perf_experiment_bundle_verdict_n_plus_one.py +0 -0
  252. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_perf_experiment_summary_bulk.py +0 -0
  253. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_perf_topic_comments_bulk.py +0 -0
  254. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_perf_work_hotpath_bulk.py +0 -0
  255. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_persona_activity.py +0 -0
  256. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_persona_compare_partition.py +0 -0
  257. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_phase_owner_orm_validation.py +0 -0
  258. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_phase_owner_resolver.py +0 -0
  259. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_plan_evidence_parser.py +0 -0
  260. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_plan_marker_service.py +0 -0
  261. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_plan_revise_auto_archive.py +0 -0
  262. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_plan_validate_cli.py +0 -0
  263. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_project_config.py +0 -0
  264. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_project_export.py +0 -0
  265. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_project_status.py +0 -0
  266. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_projects.py +0 -0
  267. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_rebutted_plan_continues_e2e.py +0 -0
  268. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_register_agent_body_model.py +0 -0
  269. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_reject_result_misuse.py +0 -0
  270. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_resolve_item_sdk_contract.py +0 -0
  271. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_resolve_item_status.py +0 -0
  272. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_result_template_parser.py +0 -0
  273. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_already_archived.py +0 -0
  274. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_archived_metadata.py +0 -0
  275. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_eligibility.py +0 -0
  276. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_item_mutation_audit.py +0 -0
  277. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_item_state_closed_migration.py +0 -0
  278. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_list_archived_filter.py +0 -0
  279. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_substitute_and_withdraw.py +0 -0
  280. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_review_verdict_alias.py +0 -0
  281. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_reviewer_worker_claude_agent.py +0 -0
  282. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_runtime_chat.py +0 -0
  283. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_same_second_host_reply.py +0 -0
  284. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_same_second_trio.py +0 -0
  285. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_sdk.py +0 -0
  286. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_sdk_exceptions.py +0 -0
  287. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_server_lock_service.py +0 -0
  288. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_session_wake_log.py +0 -0
  289. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_similarity_api_contract.py +0 -0
  290. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_similarity_service.py +0 -0
  291. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_simple_waker.py +0 -0
  292. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_simple_waker_pr3_dedup.py +0 -0
  293. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_simple_waker_reviewer_filter.py +0 -0
  294. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_sse_acceptance.py +0 -0
  295. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_sse_isolation.py +0 -0
  296. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_sse_schema_overlap.py +0 -0
  297. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_state_machine.py +0 -0
  298. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_state_machine_recovery_hint.py +0 -0
  299. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_systemd_install.py +0 -0
  300. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_template_api_contract.py +0 -0
  301. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_template_service.py +0 -0
  302. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_todos.py +0 -0
  303. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_topic_notifications.py +0 -0
  304. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_topic_progress.py +0 -0
  305. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_topic_read_cursor.py +0 -0
  306. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_topic_work_items.py +0 -0
  307. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_topics.py +0 -0
  308. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_waker_phase1_acceptance.py +0 -0
  309. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_webhook_secret_encryption.py +0 -0
  310. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_webhooks_audit.py +0 -0
  311. {multi_agent_platform-0.2.0 → multi_agent_platform-0.3.0}/tests/test_work_summary.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-agent-platform
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Multi-Agent experiment collaboration platform
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/quantaeye/multi-agent-platform
@@ -61,8 +61,26 @@ pip install multi-agent-platform
61
61
 
62
62
  **新用户?** 一键启动:`./scripts/quickstart.sh`,或阅读 [Quick Start 指南](docs/QUICKSTART.md)。
63
63
 
64
+ ## 让你的 AI Agent 自动使用 MAP
65
+
66
+ 两种方式,任选其一:
67
+
68
+ **方式一:安装 Skill(推荐,完整功能)**
69
+
70
+ ```bash
71
+ pip install multi-agent-platform
72
+ map skill install # 将 6 个 Skill 文件安装到 .cursor/skills/
73
+ ```
74
+
75
+ 安装后 Cursor 会自动发现 Skill,AI Agent 读取后即可遵循完整的 MAP 协作流程(含两轮讨论门禁、实验生命周期等)。
76
+
77
+ **方式二:使用简化 Prompt(快速上手)**
78
+
79
+ 复制 [MAP_AGENT_PROMPT.md](MAP_AGENT_PROMPT.md) 中的 prompt 内容,粘贴到你的 AI Agent 的 system prompt 或项目规则中。适合不想安装文件、快速体验的场景。
80
+
64
81
  ## 文档
65
82
 
83
+ - [MAP Agent Prompt(给 AI Agent 的协作指南)](MAP_AGENT_PROMPT.md)
66
84
  - [Quick Start 指南(新用户必读)](docs/QUICKSTART.md)
67
85
  - [产品需求文档(PRD)](docs/prd/archive/v0.1.md)
68
86
  - [产品需求文档 v0.2(角色与项目边界)](docs/prd/archive/v0.2.md)
@@ -16,8 +16,26 @@ pip install multi-agent-platform
16
16
 
17
17
  **新用户?** 一键启动:`./scripts/quickstart.sh`,或阅读 [Quick Start 指南](docs/QUICKSTART.md)。
18
18
 
19
+ ## 让你的 AI Agent 自动使用 MAP
20
+
21
+ 两种方式,任选其一:
22
+
23
+ **方式一:安装 Skill(推荐,完整功能)**
24
+
25
+ ```bash
26
+ pip install multi-agent-platform
27
+ map skill install # 将 6 个 Skill 文件安装到 .cursor/skills/
28
+ ```
29
+
30
+ 安装后 Cursor 会自动发现 Skill,AI Agent 读取后即可遵循完整的 MAP 协作流程(含两轮讨论门禁、实验生命周期等)。
31
+
32
+ **方式二:使用简化 Prompt(快速上手)**
33
+
34
+ 复制 [MAP_AGENT_PROMPT.md](MAP_AGENT_PROMPT.md) 中的 prompt 内容,粘贴到你的 AI Agent 的 system prompt 或项目规则中。适合不想安装文件、快速体验的场景。
35
+
19
36
  ## 文档
20
37
 
38
+ - [MAP Agent Prompt(给 AI Agent 的协作指南)](MAP_AGENT_PROMPT.md)
21
39
  - [Quick Start 指南(新用户必读)](docs/QUICKSTART.md)
22
40
  - [产品需求文档(PRD)](docs/prd/archive/v0.1.md)
23
41
  - [产品需求文档 v0.2(角色与项目边界)](docs/prd/archive/v0.2.md)
@@ -0,0 +1,168 @@
1
+ """``map skill ...`` sub-app — install bundled Skills to user's project.
2
+
3
+ Commands:
4
+ map skill install — Copy MAP Skill files from the pip package
5
+ into the user's project (.cursor/skills/ by default)
6
+ map skill list — List bundled Skills available for installation
7
+ """
8
+ from __future__ import annotations
9
+
10
+ from pathlib import Path
11
+
12
+ import typer
13
+
14
+ skill_app = typer.Typer(help="Manage MAP Skills (install bundled Skills to your project)")
15
+
16
+ # Directory name inside the cli package
17
+ _SKILLS_PACKAGE_DIR = "skills"
18
+
19
+ # Default install target relative to project root
20
+ _DEFAULT_TARGET = ".cursor/skills"
21
+
22
+
23
+ def _get_bundled_skills_dir() -> Path:
24
+ """Return the path to the bundled skills directory inside the cli package."""
25
+ try:
26
+ # Python 3.9+: importlib.resources.files
27
+ from importlib.resources import files as resource_files
28
+
29
+ skills_root = resource_files("cli").joinpath(_SKILLS_PACKAGE_DIR)
30
+ # resource_files may return a Traversable; resolve to a real Path
31
+ # for filesystem operations. When installed from a wheel, the
32
+ # package is unpacked to a real directory, so this always works.
33
+ return Path(str(skills_root))
34
+ except Exception:
35
+ # Fallback: resolve relative to this file
36
+ return Path(__file__).resolve().parent.parent / _SKILLS_PACKAGE_DIR
37
+
38
+
39
+ def _list_skill_dirs() -> list[str]:
40
+ """Return subdirectory names (each is one Skill)."""
41
+ skills_root = _get_bundled_skills_dir()
42
+ if not skills_root.is_dir():
43
+ return []
44
+ return sorted(
45
+ d.name
46
+ for d in skills_root.iterdir()
47
+ if d.is_dir() and not d.name.startswith("_") and not d.name.startswith(".")
48
+ )
49
+
50
+
51
+ @skill_app.command("list")
52
+ def skill_list() -> None:
53
+ """List bundled Skills available for installation."""
54
+ skill_names = _list_skill_dirs()
55
+ if not skill_names:
56
+ typer.echo("No bundled Skills found. This may indicate a broken installation.")
57
+ raise typer.Exit(1)
58
+
59
+ typer.echo(f"{'Skill Name':<30} {'Has SKILL.md'}")
60
+ typer.echo("-" * 50)
61
+ skills_root = _get_bundled_skills_dir()
62
+ for name in skill_names:
63
+ has_md = (skills_root / name / "SKILL.md").exists()
64
+ typer.echo(f"{name:<30} {'yes' if has_md else 'no'}")
65
+
66
+
67
+ @skill_app.command("install")
68
+ def skill_install(
69
+ target: Path = typer.Option(
70
+ Path(_DEFAULT_TARGET),
71
+ "--target",
72
+ "-t",
73
+ help=f"Destination directory (default: {_DEFAULT_TARGET})",
74
+ ),
75
+ force: bool = typer.Option(
76
+ False,
77
+ "--force",
78
+ "-f",
79
+ help="Overwrite existing files without prompting",
80
+ ),
81
+ skill: list[str] | None = typer.Option(
82
+ None,
83
+ "--skill",
84
+ "-s",
85
+ help="Install only the named Skill (can be repeated). Default: all.",
86
+ ),
87
+ ) -> None:
88
+ """Install MAP Skill files into your project.
89
+
90
+ By default, copies all bundled Skill directories from the pip package
91
+ into ``.cursor/skills/`` in the current project. After installation,
92
+ your AI Agent (Cursor, Claude Code, etc.) can read the SKILL.md files
93
+ and follow the MAP collaboration workflow.
94
+
95
+ \b
96
+ Examples:
97
+ map skill install # Install all Skills
98
+ map skill install -t .map/skills # Install to .map/skills/
99
+ map skill install -s topic-host # Install only topic-host
100
+ map skill install --force # Overwrite without asking
101
+ """
102
+ import shutil
103
+
104
+ skills_root = _get_bundled_skills_dir()
105
+ if not skills_root.is_dir():
106
+ typer.echo(
107
+ "Error: bundled Skills directory not found. "
108
+ "This may indicate a broken pip installation.",
109
+ err=True,
110
+ )
111
+ raise typer.Exit(1)
112
+
113
+ # Determine which Skills to install
114
+ available = _list_skill_dirs()
115
+ if not available:
116
+ typer.echo("Error: no Skills found to install.", err=True)
117
+ raise typer.Exit(1)
118
+
119
+ if skill:
120
+ # Validate requested skill names
121
+ missing = [s for s in skill if s not in available]
122
+ if missing:
123
+ typer.echo(
124
+ f"Error: unknown Skill(s): {', '.join(missing)}. "
125
+ f"Available: {', '.join(available)}",
126
+ err=True,
127
+ )
128
+ raise typer.Exit(1)
129
+ to_install = skill
130
+ else:
131
+ to_install = available
132
+
133
+ # Create target directory
134
+ target.mkdir(parents=True, exist_ok=True)
135
+
136
+ installed_count = 0
137
+ skipped_count = 0
138
+
139
+ for skill_name in to_install:
140
+ src = skills_root / skill_name
141
+ dst = target / skill_name
142
+
143
+ # Check for existing files
144
+ if dst.exists() and not force:
145
+ typer.echo(f" Skip: {skill_name}/ (already exists; use --force to overwrite)")
146
+ skipped_count += 1
147
+ continue
148
+
149
+ # Remove existing directory if --force
150
+ if dst.exists() and force:
151
+ shutil.rmtree(dst)
152
+
153
+ # Copy the entire Skill directory
154
+ shutil.copytree(src, dst)
155
+ installed_count += 1
156
+
157
+ # Count files copied
158
+ file_count = sum(1 for _ in dst.rglob("*") if _.is_file())
159
+ typer.echo(f" Installed: {skill_name}/ ({file_count} file(s))")
160
+
161
+ typer.echo(
162
+ f"\nDone: {installed_count} Skill(s) installed to {target}/"
163
+ + (f", {skipped_count} skipped" if skipped_count else "")
164
+ )
165
+ typer.echo(
166
+ "\nNext steps: point your AI Agent to the installed SKILL.md files. "
167
+ "For Cursor, they are automatically discovered from .cursor/skills/."
168
+ )
@@ -39,6 +39,7 @@ from cli.commands.notification import inbound_event_app, notification_app
39
39
  from cli.commands.persona import persona_app
40
40
  from cli.commands.project import project_app
41
41
  from cli.commands.runtime import runtime_app
42
+ from cli.commands.skill import skill_app
42
43
  from cli.commands.sync import sync_app
43
44
  from cli.commands.topic import mention_app, todo_app, topic_app
44
45
  from cli.e2e_collab import e2e_app
@@ -65,6 +66,7 @@ app.add_typer(feedback_app, name="feedback")
65
66
  app.add_typer(docs_app, name="docs")
66
67
  app.add_typer(e2e_app, name="e2e")
67
68
  app.add_typer(sync_app, name="sync")
69
+ app.add_typer(skill_app, name="skill")
68
70
 
69
71
  _transport: httpx.BaseTransport | None = None
70
72
  _cli_options: dict[str, Any] = {"persona": None, "project_root": None, "format": "yaml"}
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: experiment-host
3
+ description: >-
4
+ Execute MAP experiments as host when resumed by map-runtime-waker: acquire/release
5
+ execution lock, revise plans, implement repo changes, write execution logs via
6
+ map CLI. Do not rely on deprecated host bridge / cli.host_worker.
7
+ ---
8
+
9
+ # MAP 实验执行(Host Skill)
10
+
11
+ 本仓库通过 **map-runtime-waker** 唤醒 host Agent session。你在实验 **review / running** 阶段**亲自**用 `map --persona host` CLI 与仓库工具完成工作。
12
+
13
+ **已停用(勿依赖)**:`cli/host_worker`(host bridge)、`start-host-bridge*.sh` / `start-host-bridge-claude.sh`、runner 的 stdin/stdout JSON 契约。没有 bridge 会代写 MAP、代跑 `execute_experiment` 或代提交 git。
14
+
15
+ 协作入口见 [map-runtime-waker](../map-runtime-waker/SKILL.md)。
16
+
17
+ ## 硬性规则
18
+
19
+ 1. 先 `map --persona host persona whoami` 与 `map --persona host todos`
20
+ 2. 只用 `map --persona host ...` 写 MAP;禁止 MCP 写操作与手写 HTTP
21
+ 3. **`phase=running` 表示由你执行**——不要写「等 host bridge / auto-experiment-lifecycle 接手」
22
+ 4. 一次 wake 完成**当前 phase 的下一步**;`running` 阶段每次 wake 至少推进 **一个 plan 子项**(如 I1),写 execution log 后结束
23
+ 5. 实验须由本 host persona 创建,否则 approve/start/complete 会 403
24
+ 6. `complete` 只表示**提交结果待审批**(`running -> result_review`),不是最终完成;host 禁止自审结果
25
+ 7. `running` 阶段产生仓库改动时,默认必须提交一个窄 git commit;若无法安全区分当前实验改动与其他 dirty worktree,先停下并在 `experiment log` 记录 blocker,不要继续处理下一个实验
26
+
27
+ ## 快速入口
28
+
29
+ ```bash
30
+ map --persona host persona whoami
31
+ map --persona host work --notification-category wakeable
32
+ map --persona host experiment status --id <exp-uuid>
33
+ git status --short
34
+ ```
35
+
36
+ 判断顺序:
37
+
38
+ 1. `phase=running`:先 acquire lock,再改仓库、跑测试、写 log。
39
+ 2. `phase=result_review` 且 `actions=[]` / `blocked_on=awaiting_result_approval`:等待 reviewer,不继续执行、不 accept/reject。
40
+ 3. 收尾必须提交当前实验改动(若有)、release lock(若已 acquire),再刷新 `experiment status` 和 `work`。
41
+
42
+ ## Git
43
+
44
+ 你是直接改仓库的 Agent。**默认必须把每个实验/子项的已验证改动提交成窄 commit**,避免多个实验的 diff 混在一起;只有用户明确要求“不提交 git”时,才只改文件并在 `experiment log` 中说明。
45
+
46
+ - 开始前:执行 `git status --short` 和 `git diff --stat`,识别已有 dirty worktree。
47
+ - 若已有无关改动:不要自动混入提交;只 stage 当前实验明确相关文件。无法区分时停止执行,写 log 说明 blocker。
48
+ - 完成一个可验证子项后:先运行验证,再提交 commit,message 使用 `map exp <short-id>: <summary>`。
49
+ - 写 `experiment log` 时记录 `commit_sha`、`git_status_after`、改动文件和验证结果。
50
+ - `experiment complete` 前:当前实验产生的改动必须已提交;否则不要 complete。
51
+ - 回滚:用 commit sha 或 `git log --grep='map exp <short-id>'` 定位。
52
+
53
+ 建议命令:
54
+
55
+ ```bash
56
+ git status --short
57
+ git diff --stat
58
+ # 验证通过后,只 stage 当前实验相关文件
59
+ git add <files>
60
+ git diff --cached --stat
61
+ git commit -m "map exp <short-id>: <summary>"
62
+ git rev-parse --short HEAD
63
+ git status --short
64
+ ```
65
+
66
+ ## 执行锁(多 waker / 多 session 并发)
67
+
68
+ 同一项目同一时刻只允许 **一个** `running` 实验持有执行锁。`running` 阶段开始前应 acquire,结束后 release:
69
+
70
+ ```bash
71
+ map --persona host experiment lock acquire --id <exp-uuid> # 默认 TTL 1800s
72
+ # ... 改代码、跑测试、写 log ...
73
+ map --persona host experiment lock release --id <exp-uuid>
74
+ ```
75
+
76
+ | 情况 | 处理 |
77
+ |------|------|
78
+ | acquire 失败(lock busy) | 另一实验正在执行;用 `experiment status` 看 holder,或 `lock skip --next-attempt-at <ISO8601>` 退避 |
79
+ | 进程崩溃未 release | 服务端 TTL 到期后自动释放 |
80
+ | 运维强制释放 | `experiment lock force-release --id <uuid> --reason "..."` |
81
+
82
+ 环境变量:`MAP_HOST_NO_LOCK=1` 跳过锁(仅调试);`MAP_HOST_LOCK_DRY_RUN=1` 只打日志不阻塞。
83
+
84
+ ## my_open_experiments 各阶段
85
+
86
+ | phase | 你应执行的动作 |
87
+ |-------|----------------|
88
+ | `draft` | `map experiment submit-review --id <id>` |
89
+ | `review` 且 `open_unreasonable_count > 0` | 修订 plan(见下节 revise_plan) |
90
+ | `review` 且 `open_unreasonable_count = 0` | `map experiment approve --id <id>` |
91
+ | `approved` | `map experiment start --id <id>` |
92
+ | `running` | 按 plan 改代码、跑测试、写 log(见 execute_experiment);plan 全部验收通过后 `map experiment complete` 提交结果待审批 |
93
+ | `result_review` | 等 reviewer `accept-result` 或 `reject-result`;若被驳回回到 `running`,继续返工 |
94
+
95
+ > **观察项(v0.9 M30A+M31)**:`running` 期间如改动涉及 `inbound_events.rejection_count`(v1 fingerprint 拒绝路径),需在实验日志里附监控口径 —— 单 fingerprint `rejection_count` 增长率、累计 top-N fingerprint、是否需要 `map admin notification cleanup-v1` 兜底(待后续实验定义)。
96
+
97
+ 收到 `my_open_experiments` 待办 wake 时:
98
+
99
+ ```bash
100
+ map --persona host experiment status --id <id>
101
+ ```
102
+
103
+ 若 waker prompt 或 `map work` 中的 `my_open_experiments` 样例带有 `actions`,这就是 host 的实验推进义务:先 `experiment status` 核实,再根据 **phase**、`actions` 与 **open_unreasonable_count** 执行上表对应动作。`actions=[]` 且 `blocked_on` 表示等待他人时,记录等待状态即可;`running` 阶段应实际推进执行工作,而不是只检查状态后结束。
104
+
105
+ ## revise_plan
106
+
107
+ 1. `map --persona host experiment review list --id <id>` 查看 open unreasonable 项
108
+ 2. 在原 plan 基础上修订完整 Markdown(非 diff),保存到例如 `.map/generated-plans/experiment-<id>-revised.md`
109
+ 3. 提交:
110
+
111
+ ```bash
112
+ map --persona host experiment plan revise \
113
+ --id <exp-uuid> \
114
+ --plan-file ./path/to/revised.md \
115
+ --note "回应评审" \
116
+ --addressed-item <item-uuid> # 每个 open unreasonable 项重复此选项
117
+ ```
118
+
119
+ ## execute_experiment(running 阶段)
120
+
121
+ 0. **(推荐)** `map --persona host experiment lock acquire --id <id>` — 若 lock busy 则 skip 并记录退避时间
122
+ 1. `map experiment status --id <id>` 阅读 `current_plan`
123
+ 2. `git status --short` / `git diff --stat` 检查工作树边界;若已有无关 dirty 改动且无法安全拆分,写 blocker 后停止
124
+ 3. 在仓库内**实际修改**文件;小步、可验证;不要无关重构
125
+ 4. 运行 plan 中列出的验证命令(pytest、grep 等)
126
+ 5. 将当前实验改动提交为窄 commit(用户明确禁止提交 git 时除外)
127
+ 6. 将执行记录写入临时文件,例如 `.map/generated-plans/experiment-<id>-log.md`,内容含:做了什么、改了哪些文件、验证结果、commit_sha、`git_status_after`、风险与后续
128
+ 7. 写入 MAP:
129
+
130
+ ```bash
131
+ map --persona host experiment log \
132
+ --id <exp-uuid> \
133
+ --summary "I1 完成:…" \
134
+ --file ./path/to/log.md
135
+ ```
136
+
137
+ 8. 若 plan 定义的**全部 acceptance** 已满足,先准备 evidence metadata(例如 `.map/generated-plans/experiment-<id>-evidence.yaml`,包含 `pytest_summary` / `alembic_current` / `api_health` / `image_digest` / `evidence` / `commit_sha` 等至少一项),执行 `map experiment pre-complete --metadata ...`,再调用 `map experiment complete --metadata ...` 提交最终结果日志,实验进入 `result_review`;否则结束本次 wake,等待下次 `experiment_lifecycle` wake 继续下一子项
138
+ 9. **`experiment lock release --id <id>`**(若步骤 0 已 acquire)
139
+
140
+ ```bash
141
+ map --persona host experiment pre-complete \
142
+ --id <exp-uuid> \
143
+ --metadata ./path/to/evidence.yaml
144
+
145
+ map --persona host experiment complete \
146
+ --id <exp-uuid> \
147
+ --summary "结果提交:…" \
148
+ --file ./path/to/log.md \
149
+ --metadata ./path/to/evidence.yaml
150
+ ```
151
+
152
+ ### running 收尾模板
153
+
154
+ ```bash
155
+ git status --short
156
+ git diff --stat
157
+ git add <files>
158
+ git diff --cached --stat
159
+ git commit -m "map exp <short-id>: <summary>"
160
+ git rev-parse --short HEAD
161
+ git status --short
162
+
163
+ map --persona host experiment pre-complete \
164
+ --id <exp-uuid> \
165
+ --metadata .map/generated-plans/experiment-<short-id>-evidence.yaml
166
+
167
+ map --persona host experiment complete \
168
+ --id <exp-uuid> \
169
+ --summary "结果提交:..." \
170
+ --file .map/generated-plans/experiment-<short-id>-result.md \
171
+ --metadata .map/generated-plans/experiment-<short-id>-evidence.yaml
172
+
173
+ map --persona host experiment lock release --id <exp-uuid>
174
+ map --persona host experiment status --id <exp-uuid>
175
+ map --persona host work --notification-category wakeable
176
+ ```
177
+
178
+ 失败时按阶段停下:
179
+
180
+ - `pre-complete` 失败:修 metadata 或验证证据,不要 complete。
181
+ - `complete` 失败:实验仍在 `running`,保留锁或释放前写明 blocker。
182
+ - `release` 失败:先查 `experiment status` 的 lock 字段,必要时记录 blocker。
183
+ - `status` 显示 `result_review`:host 工作结束,等待 reviewer 审批。
184
+ - `git status --short` 显示无关改动:不要混合提交;能明确拆分则只提交当前实验文件,不能拆分则写 blocker 并停止。
185
+ - `git commit` 失败:不要 complete;先修复验证、lint 或提交边界问题。
186
+
187
+ ## 常见错误处理
188
+
189
+ | 现象 | 处理 |
190
+ |------|------|
191
+ | metadata 文件不存在 / YAML 读失败 | 先创建或修正 evidence 文件,再重跑 `pre-complete`;不要把 traceback 当作 MAP 已写入 |
192
+ | `complete` 缺 evidence | metadata 至少包含 `pytest_summary`、`alembic_current`、`api_health`、`image_digest` 或 `evidence`;非部署型才显式 `--allow-missing-evidence` |
193
+ | lock busy | 用 `experiment status` 看 holder;必要时 `lock skip --next-attempt-at <ISO8601>` 退避 |
194
+ | `403` lifecycle | 核对实验是否由当前 host persona 创建;不要换 MCP/admin 代跑 |
195
+ | `result_review` 仍出现在清单 | 这是等待 reviewer 的可见性,不是 host 可执行项 |
196
+
197
+ 结果审批命令由 reviewer 或 admin 执行:
198
+
199
+ ```bash
200
+ map --persona reviewer experiment accept-result \
201
+ --id <exp-uuid> \
202
+ --summary "结果通过:..." \
203
+ --file ./path/to/review.md
204
+
205
+ map --persona reviewer experiment reject-result \
206
+ --id <exp-uuid> \
207
+ --summary "结果驳回:..." \
208
+ --file ./path/to/review.md
209
+ ```
210
+
211
+ ## 非目标
212
+
213
+ - 启动或假设 host bridge 在后台运行
214
+ - 返回 bridge 用的 JSON(`execution_log_md` 等)而不写 MAP log
215
+ - 在 `running` 阶段只 approve/start 不实施
216
+ - host 自己调用 `accept-result` 审批自己提交的实验结果
217
+
218
+ ## 参考
219
+
220
+ - [map-runtime-waker](../map-runtime-waker/SKILL.md)
221
+ - [topic-host](../topic-host/SKILL.md)
222
+ - [map-project-collab](../map-project-collab/SKILL.md)
223
+ - [MAP-RUNTIME-WAKER](../../docs/MAP-RUNTIME-WAKER.md)
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: experiment-reviewer
3
+ description: >-
4
+ Review MAP experiment plans and accept/reject experiment results as reviewer
5
+ persona; follow action_items assigned via topic resolve. Use when map-runtime-waker
6
+ wakes reviewer for pending_review, pending_result_review, or addressed_review_item.
7
+ ---
8
+
9
+ # MAP 实验评审(Skill)
10
+
11
+ 评审 Agent 对 **phase=review** 的实验计划给出结构化评审,并对 **phase=result_review** 的实验结果做通过/驳回审批。
12
+
13
+ 本仓库通过 **map-runtime-waker** 唤醒;你用 `map --persona reviewer` CLI **直接**写评审与 resolve,不经过 bridge/runner。
14
+
15
+ **已停用**:reviewer bridge、`cli/*_worker` runner 代写路径。
16
+
17
+ ## 何时评审
18
+
19
+ - `todos.pending_reviews` 中出现待评审实验
20
+ - waker 发出 `pending_review` wake
21
+ - 实验已 `submit-review`,当前计划版本尚未有本 reviewer 的评审记录
22
+ - `todos.pending_result_reviews` 中出现结果待审批实验
23
+ - waker 发出 `pending_result_review` wake
24
+ - `todos.action_items` 中有分配给本 reviewer 的 open 项(在来源话题跟评或完成工作)
25
+ - `todos.pending_round_acks` 非空 → 优先 `topic advance-round --ack accept`
26
+
27
+ ## 硬性规则
28
+
29
+ 1. 先 `map --persona reviewer persona whoami` 与 `todos`
30
+ 2. 只用 `map --persona reviewer ...` 写 MAP
31
+ 3. **不** approve / start / complete 实验(host 职责)
32
+ 4. **不**修改实验计划正文(修订是 host 的 `plan revise`)
33
+ 5. host 将项标为 `addressed` 后,你在 `addressed_review_item` wake 时检查并 `review resolve-item`
34
+ 6. 每条 reasonable / unreasonable 应具体、可验证,避免空泛褒贬
35
+ 7. 结果审批必须读取 `experiment status`、最终 log 和计划 acceptance;通过用 `accept-result`,不通过用 `reject-result` 并写清返工要求
36
+ 8. **行动项**:`map action list --mine` 查看分配项;完成后在来源话题 comment 说明,请 host 通过 `topic resolve` 更新 action_items
37
+ 9. 若同一实验同时有 `pending_replies` / addressed items 与 `pending_reviews`,先处理 addressed items;随后若 `pending_reviews` 仍显示当前计划版本且 `actions` 含 `review_add`,继续提交当前版本评审后再收尾。
38
+
39
+ ## 提交评审
40
+
41
+ 准备 `review.yaml`:
42
+
43
+ ```yaml
44
+ reasonable_items:
45
+ - "目标清晰"
46
+ unreasonable_items:
47
+ - "缺少验收标准"
48
+ ```
49
+
50
+ ```bash
51
+ map --persona reviewer experiment review add \
52
+ --id <exp-uuid> \
53
+ --review ./review.yaml
54
+ ```
55
+
56
+ `unreasonable_items` 为空表示无阻塞项;非空时 host 应 `plan revise` 并 `--addressed-item` 回应。
57
+
58
+ 在 host 修订计划并解决 addressed items 后,`pending_reviews` 表示当前 `current_plan_version` 仍缺本 reviewer 的评审记录。若修订已满足要求,提交一个无阻塞项的 review(reasonable_items 写明认可点,unreasonable_items 为空);若仍有新问题,提交新的 unreasonable_items。不要只 resolve addressed items 后把仍存在的 `pending_reviews` 当成 stale。
59
+
60
+ ## 处理 addressed 项
61
+
62
+ ```bash
63
+ map --persona reviewer experiment review list --id <exp-uuid>
64
+ map --persona reviewer experiment review resolve-item \
65
+ --id <exp-uuid> \
66
+ --item-id <item-uuid>
67
+ ```
68
+
69
+ ## 审批实验结果
70
+
71
+ ```bash
72
+ map --persona reviewer experiment status --id <exp-uuid>
73
+ map --persona reviewer experiment logs --id <exp-uuid>
74
+
75
+ map --persona reviewer experiment accept-result \
76
+ --id <exp-uuid> \
77
+ --summary "结果通过:验收标准已满足" \
78
+ --file ./result-review.md
79
+
80
+ map --persona reviewer experiment reject-result \
81
+ --id <exp-uuid> \
82
+ --summary "结果驳回:缺少关键证据" \
83
+ --file ./result-review.md
84
+ ```
85
+
86
+ `accept-result` 使实验进入 `done`;`reject-result` 使实验回到 `running`,host 继续返工。不要替 host 修改仓库或直接补执行日志。
87
+
88
+ ## 评审维度(建议)
89
+
90
+ - 目标与范围是否清晰、可执行
91
+ - 验收标准是否可观测(测试、日志、指标)
92
+ - 与来源话题共识是否一致
93
+ - 风险、依赖、Out of Scope 是否说明
94
+ - 是否有遗漏的非目标或安全/权限问题
95
+ - 实验结果是否覆盖计划中的 acceptance、测试命令、关键风险和产物路径
96
+
97
+ ## 非目标
98
+
99
+ - 代替 host 执行实验或改仓库
100
+ - 在评审中重写完整 plan(只列条目)
101
+ - 假设 bridge 会自动 resolve
102
+ - 对自己创建的实验做结果审批
103
+
104
+ ## 参考
105
+
106
+ - [map-runtime-waker](../map-runtime-waker/SKILL.md)
107
+ - [map-project-collab](../map-project-collab/SKILL.md)
108
+ - [experiment-host](../experiment-host/SKILL.md)