mapify-cli 3.28.0__tar.gz → 3.28.1__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 (549) hide show
  1. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/PKG-INFO +8 -1
  2. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/README.md +7 -0
  3. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/pyproject.toml +1 -1
  4. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/__init__.py +103 -3
  5. mapify_cli-3.28.1/src/mapify_cli/_python_guard.py +31 -0
  6. mapify_cli-3.28.1/src/mapify_cli/python_runtime.py +383 -0
  7. {mapify_cli-3.28.0/src/mapify_cli/templates → mapify_cli-3.28.1/src/mapify_cli/templates/codex}/hooks/workflow-gate.py +48 -0
  8. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/README.md +21 -2
  9. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/context-meter.py +26 -0
  10. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +26 -0
  11. mapify_cli-3.28.1/src/mapify_cli/templates/hooks/map-memory-capture.py +66 -0
  12. mapify_cli-3.28.1/src/mapify_cli/templates/hooks/map-memory-endmark.py +66 -0
  13. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/map-memory-finalize.py +27 -0
  14. mapify_cli-3.28.1/src/mapify_cli/templates/hooks/map-memory-recall.py +74 -0
  15. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/map-statusline.py +26 -0
  16. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/map-token-meter.py +26 -0
  17. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/post-compact-context.py +27 -0
  18. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +27 -0
  19. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +27 -0
  20. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +27 -0
  21. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/safety-guardrails.py +47 -0
  22. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/scrub-internal-ids.py +26 -0
  23. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/workflow-context-injector.py +26 -0
  24. {mapify_cli-3.28.0/src/mapify_cli/templates/codex → mapify_cli-3.28.1/src/mapify_cli/templates}/hooks/workflow-gate.py +48 -0
  25. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +26 -0
  26. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/map_step_runner.py +26 -0
  27. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +26 -0
  28. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/hook-patterns.md +76 -0
  29. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-release/SKILL.md +1 -1
  30. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-release/release-reference.md +30 -15
  31. mapify_cli-3.28.1/src/mapify_cli/templates_src/_partials/python-version-guard.py.jinja +63 -0
  32. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +2 -0
  33. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/README.md.jinja +21 -2
  34. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +1 -0
  35. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +1 -0
  36. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +2 -0
  37. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +2 -0
  38. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +2 -0
  39. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +2 -0
  40. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-statusline.py.jinja +1 -0
  41. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +1 -0
  42. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +2 -0
  43. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +2 -0
  44. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +2 -0
  45. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +2 -0
  46. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +1 -0
  47. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/scrub-internal-ids.py.jinja +1 -0
  48. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +1 -0
  49. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +2 -0
  50. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +1 -0
  51. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +1 -0
  52. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +1 -0
  53. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +76 -0
  54. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +1 -1
  55. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-release/release-reference.md.jinja +30 -15
  56. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/conftest.py +8 -0
  57. mapify_cli-3.28.1/tests/test_python_version_requirement.py +608 -0
  58. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_sofa_client.py +40 -10
  59. mapify_cli-3.28.0/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -39
  60. mapify_cli-3.28.0/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -39
  61. mapify_cli-3.28.0/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -47
  62. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/.claude/hooks/README.md +0 -0
  63. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/.claude/skills/README.md +0 -0
  64. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/.gitignore +0 -0
  65. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/LICENSE +0 -0
  66. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/_locking.py +0 -0
  67. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/auto_update.py +0 -0
  68. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/boundary_quality_report.py +0 -0
  69. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/cli_ui.py +0 -0
  70. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/code_map.py +0 -0
  71. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/__init__.py +0 -0
  72. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/mcp.py +0 -0
  73. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/project_config.py +0 -0
  74. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/settings.py +0 -0
  75. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/__init__.py +0 -0
  76. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/agent_generator.py +0 -0
  77. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/codex_copier.py +0 -0
  78. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/domain_skill.py +0 -0
  79. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/file_copier.py +0 -0
  80. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/governance_report.py +0 -0
  81. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
  82. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/providers.py +0 -0
  83. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/template_renderer.py +0 -0
  84. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/dependency_graph.py +0 -0
  85. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/grace_eval/__init__.py +0 -0
  86. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/grace_eval/schema.py +0 -0
  87. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/grace_eval/sweep.py +0 -0
  88. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/install_manifest.py +0 -0
  89. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/intent_detector.py +0 -0
  90. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/__init__.py +0 -0
  91. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/capture.py +0 -0
  92. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/digest_schema.py +0 -0
  93. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/finalize.py +0 -0
  94. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/recall.py +0 -0
  95. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/minimality_eval.py +0 -0
  96. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/minimality_report.py +0 -0
  97. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/parallelism_observability.py +0 -0
  98. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/ralph_state.py +0 -0
  99. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/repo_insight.py +0 -0
  100. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/research_eval.py +0 -0
  101. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/research_eval_compare.py +0 -0
  102. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/schemas.py +0 -0
  103. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/scope_classifier.py +0 -0
  104. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skill_ir.py +0 -0
  105. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/__init__.py +0 -0
  106. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  107. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  108. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/assertions.py +0 -0
  109. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  110. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  111. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  112. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/proposer.py +0 -0
  113. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/runner.py +0 -0
  114. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/__init__.py +0 -0
  115. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/bundle.py +0 -0
  116. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/dispatcher.py +0 -0
  117. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/eval_schema.py +0 -0
  118. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/gates.py +0 -0
  119. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/judge.py +0 -0
  120. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/repeated.py +0 -0
  121. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/report.py +0 -0
  122. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/runner.py +0 -0
  123. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/seeding.py +0 -0
  124. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/viewer.py +0 -0
  125. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/.gitignore +0 -0
  126. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/CLAUDE.md +0 -0
  127. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/actor.md +0 -0
  128. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
  129. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  130. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  131. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/monitor.md +0 -0
  132. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/predictor.md +0 -0
  133. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/reflector.md +0 -0
  134. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  135. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  136. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
  137. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  138. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/evaluator.toml +0 -0
  139. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
  140. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/predictor.toml +0 -0
  141. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  142. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/config.toml +0 -0
  143. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/hooks.json +0 -0
  144. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  145. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +0 -0
  146. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +0 -0
  147. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  148. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  149. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
  150. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-review/SKILL.md +0 -0
  151. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-review/adversarial-reference.md +0 -0
  152. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-review/review-reference.md +0 -0
  153. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
  154. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-upgrade/SKILL.md +0 -0
  155. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  156. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/classify_scope.py +0 -0
  157. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  158. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  159. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/scrub_internal_ids.py +0 -0
  160. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  161. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/wayfind_runner.py +0 -0
  162. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  163. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  164. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  165. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  166. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  167. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  168. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  169. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  170. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  171. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
  172. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/host-paths.md +0 -0
  173. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  174. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  175. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  176. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  177. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  178. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  179. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  180. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/settings.json +0 -0
  181. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/README.md +0 -0
  182. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-architecture/SKILL.md +0 -0
  183. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-auto/SKILL.md +0 -0
  184. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-auto/auto-reference.md +0 -0
  185. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  186. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  187. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
  188. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +0 -0
  189. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -0
  190. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  191. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  192. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  193. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  194. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  195. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  196. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  197. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-plan/SKILL.md +0 -0
  198. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
  199. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-prd-review/SKILL.md +0 -0
  200. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  201. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  202. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
  203. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-review/adversarial-reference.md +0 -0
  204. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
  205. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  206. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  207. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  208. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  209. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  210. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  211. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  212. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  213. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  214. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  215. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  216. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  217. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  218. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  219. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
  220. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
  221. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-upgrade/SKILL.md +0 -0
  222. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-wayfind/SKILL.md +0 -0
  223. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-wayfind/wayfind-reference.md +0 -0
  224. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  225. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/workflow-rules.json +0 -0
  226. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
  227. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  228. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/_partials/auto-update-preflight.md.jinja +0 -0
  229. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/_partials/manual-upgrade-flow.md.jinja +0 -0
  230. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/actor.md.jinja +0 -0
  231. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
  232. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  233. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  234. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/monitor.md.jinja +0 -0
  235. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  236. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  237. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  238. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  239. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
  240. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  241. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/evaluator.toml.jinja +0 -0
  242. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
  243. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/predictor.toml.jinja +0 -0
  244. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  245. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
  246. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  247. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  248. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +0 -0
  249. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +0 -0
  250. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  251. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  252. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
  253. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-review/SKILL.md.jinja +0 -0
  254. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-review/adversarial-reference.md.jinja +0 -0
  255. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-review/review-reference.md.jinja +0 -0
  256. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
  257. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-upgrade/SKILL.md.jinja +0 -0
  258. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  259. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/classify_scope.py.jinja +0 -0
  260. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  261. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  262. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/scrub_internal_ids.py.jinja +0 -0
  263. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  264. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/wayfind_runner.py.jinja +0 -0
  265. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  266. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  267. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  268. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  269. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  270. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  271. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  272. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  273. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  274. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
  275. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  276. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  277. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  278. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  279. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  280. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  281. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  282. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  283. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
  284. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  285. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-architecture/SKILL.md.jinja +0 -0
  286. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-auto/SKILL.md.jinja +0 -0
  287. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-auto/auto-reference.md.jinja +0 -0
  288. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  289. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  290. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
  291. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +0 -0
  292. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -0
  293. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  294. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  295. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  296. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  297. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  298. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  299. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  300. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +0 -0
  301. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
  302. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-prd-review/SKILL.md.jinja +0 -0
  303. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  304. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  305. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
  306. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-review/adversarial-reference.md.jinja +0 -0
  307. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
  308. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  309. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  310. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  311. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  312. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  313. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  314. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  315. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  316. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  317. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  318. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  319. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  320. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  321. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  322. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
  323. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
  324. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-upgrade/SKILL.md.jinja +0 -0
  325. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-wayfind/SKILL.md.jinja +0 -0
  326. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-wayfind/wayfind-reference.md.jinja +0 -0
  327. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  328. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  329. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/token_budget.py +0 -0
  330. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/tool_output_offload.py +0 -0
  331. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/tools/__init__.py +0 -0
  332. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  333. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/update_install.py +0 -0
  334. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/update_state.py +0 -0
  335. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/update_versions.py +0 -0
  336. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/verification_recorder.py +0 -0
  337. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/workflow_finalizer.py +0 -0
  338. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/workflow_logger.py +0 -0
  339. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/workflow_state.py +0 -0
  340. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/__init__.py +0 -0
  341. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/_fake_task_tool.py +0 -0
  342. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/fixtures/claude/escalation-matrix.md +0 -0
  343. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/fixtures/codex/config.toml +0 -0
  344. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/fixtures/wave_blueprints.py +0 -0
  345. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  346. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_end_of_turn.py +0 -0
  347. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_hook_inventory_smoke.py +0 -0
  348. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_safety_guardrails.py +0 -0
  349. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_scrub_internal_ids_hook.py +0 -0
  350. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/__init__.py +0 -0
  351. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/blueprint.json +0 -0
  352. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/code_review.md +0 -0
  353. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/plan_handoff.json +0 -0
  354. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/spec.md +0 -0
  355. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/step_state_initialized.json +0 -0
  356. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  357. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/task_plan.md +0 -0
  358. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/verification_summary.md +0 -0
  359. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  360. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/test_e2e_claude_sdk.py +0 -0
  361. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/README.md +0 -0
  362. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  363. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  364. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  365. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  366. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  367. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  368. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  369. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  370. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  371. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  372. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  373. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  374. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  375. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  376. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  377. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  378. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  379. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  380. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  381. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  382. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  383. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  384. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  385. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  386. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  387. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  388. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  389. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  390. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  391. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  392. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  393. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  394. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  395. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  396. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  397. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  398. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  399. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/hidden/test_kvparse_full.py +0 -0
  400. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/manifest.json +0 -0
  401. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/.map/main/blueprint.json +0 -0
  402. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/.map/main/task_plan_main.md +0 -0
  403. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/src/__init__.py +0 -0
  404. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/src/kvparse.py +0 -0
  405. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/tests/test_kvparse_basic.py +0 -0
  406. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  407. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  408. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  409. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  410. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  411. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  412. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  413. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  414. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  415. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  416. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  417. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  418. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  419. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  420. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  421. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  422. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  423. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  424. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  425. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  426. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  427. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  428. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  429. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  430. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  431. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  432. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  433. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  434. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  435. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  436. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  437. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  438. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  439. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  440. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  441. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_cli_correctness.py +0 -0
  442. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_dispatch_audit.py +0 -0
  443. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_frontmatter.py +0 -0
  444. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_memory.py +0 -0
  445. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_approval_hold.py +0 -0
  446. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_artifact_schemas.py +0 -0
  447. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_auto_update.py +0 -0
  448. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_boundary_quality_report.py +0 -0
  449. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_bump_version.py +0 -0
  450. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_classify_scope_script.py +0 -0
  451. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_code_map.py +0 -0
  452. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_compaction_offload_integration.py +0 -0
  453. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_concurrent_dispatch_harness.py +0 -0
  454. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_context_usefulness.py +0 -0
  455. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_cross_ai_config.py +0 -0
  456. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_decomposition.py +0 -0
  457. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_dependency_graph.py +0 -0
  458. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_diagnostics.py +0 -0
  459. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_digest_schema.py +0 -0
  460. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_domain_skill.py +0 -0
  461. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_file_copier.py +0 -0
  462. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_governance_attack_fixtures.py +0 -0
  463. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_governance_report.py +0 -0
  464. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_grace_eval_schema.py +0 -0
  465. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_grace_eval_sweep.py +0 -0
  466. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_hook_patterns.py +0 -0
  467. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_init_import_graph.py +0 -0
  468. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_install_manifest.py +0 -0
  469. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_intent_detector.py +0 -0
  470. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  471. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_jinja2_dep.py +0 -0
  472. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_locking.py +0 -0
  473. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_managed_file_copier.py +0 -0
  474. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_auto.py +0 -0
  475. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_orchestrator.py +0 -0
  476. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_step_runner.py +0 -0
  477. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_token_meter.py +0 -0
  478. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_utils_sanitize.py +0 -0
  479. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_mapify_cli.py +0 -0
  480. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_capture.py +0 -0
  481. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_finalize.py +0 -0
  482. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_integration.py +0 -0
  483. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_recall.py +0 -0
  484. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_review_fixes.py +0 -0
  485. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_minimality_eval.py +0 -0
  486. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_minimality_report.py +0 -0
  487. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_parallelism_observability.py +0 -0
  488. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_post_compact_context.py +0 -0
  489. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_preset_commands.py +0 -0
  490. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_project_config.py +0 -0
  491. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_prompt_layering.py +0 -0
  492. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_prompt_profile_commands.py +0 -0
  493. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_pyyaml_dep.py +0 -0
  494. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_ralph_hooks.py +0 -0
  495. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_ralph_state.py +0 -0
  496. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_repo_insight.py +0 -0
  497. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_research_eval.py +0 -0
  498. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_research_eval_compare.py +0 -0
  499. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_review_verdict_ledger.py +0 -0
  500. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_schemas.py +0 -0
  501. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_scope_classifier.py +0 -0
  502. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_scrub_internal_ids.py +0 -0
  503. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_settings_deny_globs.py +0 -0
  504. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_shell_json_pipes.py +0 -0
  505. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skill_ir.py +0 -0
  506. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills.py +0 -0
  507. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_consistency.py +0 -0
  508. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_aggregator.py +0 -0
  509. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_apply.py +0 -0
  510. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_cli_optimize.py +0 -0
  511. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_dispatcher_env.py +0 -0
  512. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  513. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_fixtures.py +0 -0
  514. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_optimizer.py +0 -0
  515. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  516. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_proposer.py +0 -0
  517. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_runner.py +0 -0
  518. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_schema.py +0 -0
  519. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_bundle.py +0 -0
  520. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_cli.py +0 -0
  521. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_gates.py +0 -0
  522. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_judge.py +0 -0
  523. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_repeated.py +0 -0
  524. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_report.py +0 -0
  525. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_runner.py +0 -0
  526. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_schema.py +0 -0
  527. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_viewer.py +0 -0
  528. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_slice5b_leak_guards.py +0 -0
  529. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_sofa_search.py +0 -0
  530. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_statusline.py +0 -0
  531. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_template_render.py +0 -0
  532. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_token_budget.py +0 -0
  533. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_tool_output_offload.py +0 -0
  534. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_update_install.py +0 -0
  535. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_update_state.py +0 -0
  536. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_update_versions.py +0 -0
  537. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_validate_dependencies.py +0 -0
  538. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_validate_spec_citations.py +0 -0
  539. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_verification_recorder.py +0 -0
  540. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wave_eval_harness.py +0 -0
  541. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wave_fixtures.py +0 -0
  542. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wave_parallel_harness.py +0 -0
  543. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wayfind_runner.py +0 -0
  544. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_context_injector.py +0 -0
  545. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_finalizer.py +0 -0
  546. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_gate.py +0 -0
  547. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_logger.py +0 -0
  548. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_state.py +0 -0
  549. {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_worktree_isolation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mapify-cli
3
- Version: 3.28.0
3
+ Version: 3.28.1
4
4
  Summary: MAP Framework installer - Modular Agentic Planner for Claude Code
5
5
  Project-URL: Homepage, https://github.com/azalio/map-framework
6
6
  Project-URL: Repository, https://github.com/azalio/map-framework.git
@@ -87,6 +87,11 @@ uv tool install mapify-cli
87
87
  pip install mapify-cli
88
88
  ```
89
89
 
90
+ Requires Python 3.11+, and `python3` on your `PATH` must be that interpreter — the
91
+ installed hooks and `.map/scripts/` runners execute through a `#!/usr/bin/env
92
+ python3` shebang, not through the interpreter that ran `mapify`. `mapify init`
93
+ checks it up front and tells you what to fix ([details](docs/INSTALL.md#why-python3-on-path-matters)).
94
+
90
95
  **2. Initialize your project**
91
96
 
92
97
  Claude Code is the default provider:
@@ -301,6 +306,8 @@ mapify init . --no-autonomy # remove the autonomy posture
301
306
  ## Trouble?
302
307
 
303
308
  - **Command not found** → Run `mapify init` in your project first.
309
+ - **`init` stops on a Python version** → `python3` on your `PATH` is older than 3.11; the hooks run under it. Install 3.11+ (`brew install python@3.12` / `uv python install 3.12`), then `mapify check`. To install anyway, pass `--skip-python-check` or set `MAPIFY_SKIP_PYTHON_CHECK=1` — hooks stay non-functional until `python3` is upgraded ([details](docs/INSTALL.md#why-python3-on-path-matters)).
310
+ - **A hook printed "MAP requires Python 3.11 or newer"** → same cause, detected at run time; the message names the interpreter it ran under. Context hooks report and let the session continue; the two PreToolUse gates (`safety-guardrails.py`, `workflow-gate.py`) deny the tool call instead of allowing it unguarded, so fix `python3` in another terminal to unblock.
304
311
  - **Agent errors** → Check `.claude/agents/` has all shipped agent `.md` files, or run `mapify doctor`.
305
312
  - **Poor output on a complex task** → Start with `/map-plan` and feed `/map-efficient` the approved plan instead of asking it to infer the architecture.
306
313
  - [More help →](docs/INSTALL.md#troubleshooting)
@@ -42,6 +42,11 @@ uv tool install mapify-cli
42
42
  pip install mapify-cli
43
43
  ```
44
44
 
45
+ Requires Python 3.11+, and `python3` on your `PATH` must be that interpreter — the
46
+ installed hooks and `.map/scripts/` runners execute through a `#!/usr/bin/env
47
+ python3` shebang, not through the interpreter that ran `mapify`. `mapify init`
48
+ checks it up front and tells you what to fix ([details](docs/INSTALL.md#why-python3-on-path-matters)).
49
+
45
50
  **2. Initialize your project**
46
51
 
47
52
  Claude Code is the default provider:
@@ -256,6 +261,8 @@ mapify init . --no-autonomy # remove the autonomy posture
256
261
  ## Trouble?
257
262
 
258
263
  - **Command not found** → Run `mapify init` in your project first.
264
+ - **`init` stops on a Python version** → `python3` on your `PATH` is older than 3.11; the hooks run under it. Install 3.11+ (`brew install python@3.12` / `uv python install 3.12`), then `mapify check`. To install anyway, pass `--skip-python-check` or set `MAPIFY_SKIP_PYTHON_CHECK=1` — hooks stay non-functional until `python3` is upgraded ([details](docs/INSTALL.md#why-python3-on-path-matters)).
265
+ - **A hook printed "MAP requires Python 3.11 or newer"** → same cause, detected at run time; the message names the interpreter it ran under. Context hooks report and let the session continue; the two PreToolUse gates (`safety-guardrails.py`, `workflow-gate.py`) deny the tool call instead of allowing it unguarded, so fix `python3` in another terminal to unblock.
259
266
  - **Agent errors** → Check `.claude/agents/` has all shipped agent `.md` files, or run `mapify doctor`.
260
267
  - **Poor output on a complex task** → Start with `/map-plan` and feed `/map-efficient` the approved plan instead of asking it to infer the architecture.
261
268
  - [More help →](docs/INSTALL.md#troubleshooting)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mapify-cli"
3
- version = "3.28.0"
3
+ version = "3.28.1"
4
4
  description = "MAP Framework installer - Modular Agentic Planner for Claude Code"
5
5
  authors = [{ name = "MAP Framework Contributors" }]
6
6
  readme = "README.md"
@@ -23,8 +23,12 @@ Or install globally:
23
23
  mapify check
24
24
  """
25
25
 
26
- __version__ = "3.28.0"
26
+ __version__ = "3.28.1"
27
27
 
28
+ # MUST stay the first import: it turns "this interpreter is older than 3.11" into
29
+ # a message that says so, instead of the ImportError raised by `from datetime
30
+ # import UTC` a few lines below. See mapify_cli/_python_guard.py.
31
+ from . import _python_guard # noqa: F401, I001 (import order is load-order here)
28
32
  import contextlib
29
33
  import functools
30
34
  import inspect
@@ -290,6 +294,37 @@ def check_mcp_server(server: str) -> bool:
290
294
  return server in build_standard_mcp_servers()
291
295
 
292
296
 
297
+ def check_hook_python_version(*, skip: bool = False, warn_only: bool = False) -> bool:
298
+ """Gate on the ``python3`` that shipped hooks and .map/scripts runners will use.
299
+
300
+ Every installed hook and runner carries a ``#!/usr/bin/env python3`` shebang, so
301
+ they execute under PATH's ``python3`` -- not under the interpreter running
302
+ ``mapify`` (typically a uv-managed 3.12/3.13). On a stock macOS PATH that is
303
+ Python 3.9, where every one of them fails at import. Surfacing it here is the
304
+ difference between a named cause and an ``ImportError`` an hour later.
305
+
306
+ Args:
307
+ skip: Bypass the check (``--skip-python-check``). ``MAPIFY_SKIP_PYTHON_CHECK``
308
+ has the same effect.
309
+ warn_only: Print the problem but return True, so an updater-driven refresh
310
+ of an already-installed project is never blocked by it.
311
+
312
+ Returns:
313
+ True when installation may proceed.
314
+ """
315
+ from mapify_cli.python_runtime import check_hook_python
316
+
317
+ problem = check_hook_python(skip=skip)
318
+ if problem is None:
319
+ return True
320
+
321
+ label = "Warning" if warn_only else "Error"
322
+ color = "yellow" if warn_only else "red"
323
+ console.print(f"[{color}]{label}:[/{color}] {problem}")
324
+ console.print()
325
+ return warn_only
326
+
327
+
293
328
  def is_debug_enabled(debug_flag: bool | None = None) -> bool:
294
329
  """
295
330
  Check if debug mode is enabled via CLI flag or environment variable.
@@ -1137,6 +1172,18 @@ def init(
1137
1172
  "Enabled by default; omit to preserve an existing project choice."
1138
1173
  ),
1139
1174
  ),
1175
+ skip_python_check: bool = typer.Option(
1176
+ False,
1177
+ "--skip-python-check",
1178
+ help=(
1179
+ "Install even when the `python3` on PATH is older than 3.11. Shipped "
1180
+ "hooks and .map/scripts/ runners use that interpreter via their "
1181
+ "shebang: context hooks stay broken, and the blocking PreToolUse "
1182
+ "gates (safety-guardrails.py, workflow-gate.py) deny every matched "
1183
+ "tool call until it is upgraded. Equivalent to "
1184
+ "MAPIFY_SKIP_PYTHON_CHECK=1."
1185
+ ),
1186
+ ),
1140
1187
  refresh_existing: bool = typer.Option(
1141
1188
  False,
1142
1189
  "--refresh-existing",
@@ -1178,8 +1225,6 @@ def init(
1178
1225
  show_banner()
1179
1226
 
1180
1227
  requested_project_name = project_name
1181
- if not refresh_existing:
1182
- _start_init_workflow_logger(requested_project_name, mcp, debug)
1183
1228
 
1184
1229
  # Validate provider
1185
1230
  valid_providers = ("claude", "codex")
@@ -1190,6 +1235,20 @@ def init(
1190
1235
  )
1191
1236
  raise typer.Exit(1)
1192
1237
 
1238
+ # Gate on PATH's python3 before writing anything: it is what runs the hooks and
1239
+ # .map/scripts/ runners we are about to install. A refresh is an updater-owned
1240
+ # replay of an existing install, so there it warns instead of hard-stopping.
1241
+ if not check_hook_python_version(
1242
+ skip=skip_python_check, warn_only=refresh_existing
1243
+ ):
1244
+ raise typer.Exit(1)
1245
+
1246
+ # Only now start diagnostics: a rejected init must not leave a workflow log
1247
+ # behind in the current directory (the gate above writes nothing, and
1248
+ # --debug must not be the one exception).
1249
+ if not refresh_existing:
1250
+ _start_init_workflow_logger(requested_project_name, mcp, debug)
1251
+
1193
1252
  if refresh_existing and project_name != ".":
1194
1253
  console.print(
1195
1254
  "[red]Error:[/red] --refresh-existing can only refresh the current "
@@ -1777,6 +1836,22 @@ def check(debug: bool = typer.Option(False, "--debug", help="Enable debug loggin
1777
1836
  tracker.error(tool, "not found")
1778
1837
  results[tool] = False
1779
1838
 
1839
+ # PATH's python3 executes every shipped hook and .map/scripts/ runner via their
1840
+ # shebang, so its version belongs in the readiness check next to git/claude.
1841
+ from mapify_cli.python_runtime import (
1842
+ detect_hook_interpreter,
1843
+ minimum_python_str,
1844
+ remediation_lines,
1845
+ )
1846
+
1847
+ tracker.add("python", f"python3 on PATH (>= {minimum_python_str()})")
1848
+ interpreter = detect_hook_interpreter()
1849
+ results["python"] = interpreter.satisfies_minimum
1850
+ if interpreter.satisfies_minimum:
1851
+ tracker.complete("python", interpreter.summary)
1852
+ else:
1853
+ tracker.error("python", interpreter.summary)
1854
+
1780
1855
  health = get_project_health(Path.cwd())
1781
1856
 
1782
1857
  tracker.add("project", "Detect MAP project")
@@ -1808,6 +1883,13 @@ def check(debug: bool = typer.Option(False, "--debug", help="Enable debug loggin
1808
1883
  )
1809
1884
  else:
1810
1885
  console.print("[yellow]MAP environment needs attention:[/yellow]")
1886
+ if not results.get("python"):
1887
+ console.print(
1888
+ f" • Upgrade python3 to {minimum_python_str()}+ — every shipped "
1889
+ "hook and .map/scripts/ runner executes under it:"
1890
+ )
1891
+ for line in remediation_lines():
1892
+ console.print(f" {line}")
1811
1893
  if not results.get("git"):
1812
1894
  console.print(" • Install git: https://git-scm.com/downloads")
1813
1895
  if detected == "codex" and not results.get("codex"):
@@ -1855,6 +1937,15 @@ def doctor(debug: bool = typer.Option(False, "--debug", help="Enable debug loggi
1855
1937
  else:
1856
1938
  tracker.error(tool_name, "not found")
1857
1939
 
1940
+ from mapify_cli.python_runtime import detect_hook_interpreter, minimum_python_str
1941
+
1942
+ interpreter = detect_hook_interpreter()
1943
+ tracker.add("python", f"python3 on PATH (>= {minimum_python_str()})")
1944
+ if interpreter.satisfies_minimum:
1945
+ tracker.complete("python", interpreter.summary)
1946
+ else:
1947
+ tracker.error("python", interpreter.summary)
1948
+
1858
1949
  tracker.add("project", "MAP project structure")
1859
1950
  if detected == "codex":
1860
1951
  codex_dir = project_path / ".codex"
@@ -1915,6 +2006,15 @@ def doctor(debug: bool = typer.Option(False, "--debug", help="Enable debug loggi
1915
2006
  details.add_column("Check")
1916
2007
  details.add_column("Status")
1917
2008
  details.add_column("Details")
2009
+ details.add_row(
2010
+ "Hook interpreter",
2011
+ (
2012
+ f"Python {interpreter.version_str}"
2013
+ if interpreter.satisfies_minimum
2014
+ else f"needs >= {minimum_python_str()}"
2015
+ ),
2016
+ f"{interpreter.summary} runs every hook and .map/scripts/ runner",
2017
+ )
1918
2018
  details.add_row(
1919
2019
  "Project",
1920
2020
  "OK" if health["initialized"] else "Needs init",
@@ -0,0 +1,31 @@
1
+ """Report an unsupported interpreter by name, not as an ``ImportError``.
2
+
3
+ ``mapify_cli`` uses Python 3.11+ constructs (``datetime.UTC``, PEP 604 unions in
4
+ evaluated annotations). ``pyproject.toml`` declares ``requires-python = ">=3.11"``,
5
+ which stops every PEP-517-aware installer -- but not ``python3 -m mapify_cli`` from
6
+ a source clone, nor an install forced with ``--ignore-requires-python``. Without
7
+ this module those paths die on ``ImportError: cannot import name 'UTC' from
8
+ 'datetime'``, which never mentions a Python version.
9
+
10
+ ``mapify_cli/__init__.py`` imports this module BEFORE any 3.11-only import, so the
11
+ check runs first. Everything here must stay parsable and runnable on old
12
+ interpreters: no PEP 604 unions, no ``datetime.UTC``, no walrus in a comprehension.
13
+
14
+ The version floor is duplicated here on purpose (importing
15
+ :mod:`mapify_cli.python_runtime` would itself have to be version-safe);
16
+ ``tests/test_python_version_requirement.py`` asserts every copy agrees.
17
+ """
18
+
19
+ import sys
20
+
21
+ # UP036 is suppressed on purpose: the project targets 3.11, but this check exists
22
+ # precisely for interpreters older than the target.
23
+ if sys.version_info < (3, 11): # noqa: UP036
24
+ sys.stderr.write(
25
+ f"mapify requires Python 3.11 or newer, but {sys.executable} is "
26
+ f"Python {sys.version_info[0]}.{sys.version_info[1]}.\n"
27
+ "Install Python 3.11+ (brew install python@3.12, uv python install 3.12,\n"
28
+ "or pyenv install), then re-install mapify with that interpreter --\n"
29
+ "for example: uv tool install --python 3.12 mapify-cli\n"
30
+ )
31
+ raise SystemExit(1)
@@ -0,0 +1,383 @@
1
+ """Detect the ``python3`` interpreter that shipped hooks and scripts will use.
2
+
3
+ MAP ships every hook (``.claude/hooks/``, ``.codex/hooks/``) and every
4
+ ``.map/scripts/`` runner with a ``#!/usr/bin/env python3`` shebang. The installed
5
+ framework therefore runs under whatever ``python3`` resolves to on the user's
6
+ PATH -- **not** under the interpreter that runs ``mapify`` (which is typically a
7
+ uv-managed 3.12/3.13 when installed via ``uvx`` / ``uv tool install``).
8
+
9
+ Those shipped files use Python 3.11+ constructs (``datetime.UTC``, PEP 604
10
+ unions in evaluated annotations), so a stock macOS ``/usr/bin/python3`` (3.9)
11
+ makes every hook fail at import time with ``ImportError: cannot import name
12
+ 'UTC' from 'datetime'`` -- a message that says nothing about a Python version
13
+ requirement. ``pyproject.toml`` declares ``requires-python = ">=3.11"``, but that
14
+ constrains only the installer, never the interpreter the hooks pick up at
15
+ runtime.
16
+
17
+ This module turns that deferred, cryptic failure into an install-time gate:
18
+
19
+ * :func:`detect_hook_interpreter` resolves ``python3`` exactly the way a shebang
20
+ does (``PATH`` lookup) and reports its version.
21
+ * :func:`format_problem` renders an actionable message naming the required
22
+ version, the resolved interpreter, and how to fix it -- or ``None`` when the
23
+ interpreter is fine.
24
+
25
+ The shipped executables carry the matching runtime half of this contract: a
26
+ version guard rendered from
27
+ ``templates_src/_partials/python-version-guard.py.jinja`` that exits with the
28
+ same explanation instead of an ``ImportError`` traceback.
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import os
34
+ import re
35
+ import shutil
36
+ import subprocess
37
+ import sys
38
+ from collections.abc import Mapping
39
+ from dataclasses import dataclass
40
+ from pathlib import Path
41
+ from typing import Final
42
+
43
+ # Minimum interpreter version for every shipped hook and .map/scripts runner.
44
+ # Keep in sync with pyproject.toml ``requires-python`` and with
45
+ # templates_src/_partials/python-version-guard.py.jinja.
46
+ MINIMUM_PYTHON: Final[tuple[int, int]] = (3, 11)
47
+
48
+ #: Escape hatch for CI and for users who knowingly install before fixing PATH.
49
+ SKIP_ENV_VAR: Final[str] = "MAPIFY_SKIP_PYTHON_CHECK"
50
+
51
+ #: Command a shebang resolves; parameterised only so tests can probe a fake.
52
+ DEFAULT_COMMAND: Final[str] = "python3"
53
+
54
+ _TRUTHY: Final[frozenset[str]] = frozenset({"1", "true", "yes", "on"})
55
+
56
+ # Printed by the probe; kept Python-2-parsable so even a bizarre ``python3`` on
57
+ # PATH produces a parsable line rather than a SyntaxError we cannot explain.
58
+ _VERSION_PROBE: Final[str] = (
59
+ "import sys; sys.stdout.write('%d.%d.%d' % sys.version_info[:3])"
60
+ )
61
+
62
+ _VERSION_RE: Final[re.Pattern[str]] = re.compile(r"(\d+)\.(\d+)\.(\d+)")
63
+
64
+ _PROBE_TIMEOUT_SECONDS: Final[float] = 5.0
65
+
66
+
67
+ def minimum_python_str() -> str:
68
+ """Return the minimum version as ``"3.11"``."""
69
+ return f"{MINIMUM_PYTHON[0]}.{MINIMUM_PYTHON[1]}"
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class InterpreterInfo:
74
+ """What the shebang-resolved ``python3`` on PATH turned out to be.
75
+
76
+ Attributes:
77
+ command: The command that was resolved (normally ``python3``).
78
+ executable: Absolute path ``PATH`` lookup produced, or ``None`` when the
79
+ command is not on ``PATH`` at all.
80
+ version: ``(major, minor, micro)`` when the version could be read, else
81
+ ``None``.
82
+ detection_error: Why the version is unknown (not on PATH, probe failed,
83
+ unparsable output). ``None`` when :attr:`version` is populated.
84
+ shadowed: Path to a nearer ``python3`` that was deliberately ignored
85
+ because it lives in the environment running ``mapify`` (see
86
+ :func:`_own_environment_bin_dirs`). ``None`` when nothing was skipped.
87
+ """
88
+
89
+ command: str = DEFAULT_COMMAND
90
+ executable: str | None = None
91
+ version: tuple[int, int, int] | None = None
92
+ detection_error: str | None = None
93
+ shadowed: str | None = None
94
+
95
+ @property
96
+ def found(self) -> bool:
97
+ """True when the command was resolvable on ``PATH``."""
98
+ return self.executable is not None
99
+
100
+ @property
101
+ def satisfies_minimum(self) -> bool:
102
+ """True only when a version was read AND it meets :data:`MINIMUM_PYTHON`.
103
+
104
+ An unknown version is never treated as satisfying the floor: if we could
105
+ not run the interpreter, the hooks cannot either.
106
+ """
107
+ return self.version is not None and self.version[:2] >= MINIMUM_PYTHON
108
+
109
+ @property
110
+ def version_str(self) -> str:
111
+ """Version as ``"3.9.6"``, or ``"unknown"`` when detection failed."""
112
+ if self.version is None:
113
+ return "unknown"
114
+ return ".".join(str(part) for part in self.version)
115
+
116
+ @property
117
+ def summary(self) -> str:
118
+ """One-line description suitable for a status table."""
119
+ if not self.found:
120
+ return f"{self.command} not found on PATH"
121
+ if self.version is None:
122
+ return f"{self.executable} (version unknown)"
123
+ return f"{self.executable} (Python {self.version_str})"
124
+
125
+
126
+ def _parse_version(text: str) -> tuple[int, int, int] | None:
127
+ match = _VERSION_RE.search(text)
128
+ if match is None:
129
+ return None
130
+ major, minor, micro = (int(part) for part in match.groups())
131
+ return (major, minor, micro)
132
+
133
+
134
+ def _first_line(text: str) -> str:
135
+ for line in text.splitlines():
136
+ stripped = line.strip()
137
+ if stripped:
138
+ return stripped
139
+ return ""
140
+
141
+
142
+ def _resolve_path(entry: str) -> Path:
143
+ try:
144
+ return Path(entry).resolve()
145
+ except OSError: # pragma: no cover - unreadable PATH entry
146
+ return Path(entry)
147
+
148
+
149
+ def _own_environment_bin_dirs() -> set[Path]:
150
+ """Directories belonging to the environment that runs ``mapify`` itself.
151
+
152
+ ``uvx mapify init`` (the documented install path) runs from an *ephemeral* uv
153
+ environment whose ``bin`` is prepended to PATH -- with a modern ``python3`` in
154
+ it. That interpreter disappears when the command exits, so it is exactly the
155
+ wrong thing to judge: the hooks installed by this run are launched later, by
156
+ Claude Code, from a shell that never sees it. Same for ``uv run`` / an
157
+ activated venv. Skip these directories so the check answers "what will an
158
+ independent shell resolve?".
159
+
160
+ Only a *virtual* environment is skipped (``sys.prefix != sys.base_prefix``).
161
+ When mapify runs from a plain system/Homebrew install, its own interpreter is
162
+ a legitimate PATH-visible ``python3`` that hooks will resolve too, so nothing
163
+ is excluded and the check stays a straight ``which`` lookup.
164
+ """
165
+ if sys.prefix == getattr(sys, "base_prefix", sys.prefix):
166
+ return set()
167
+ candidates: set[Path] = set()
168
+ if sys.executable:
169
+ candidates.add(_resolve_path(sys.executable).parent)
170
+ if sys.prefix:
171
+ candidates.add(_resolve_path(sys.prefix) / "bin")
172
+ candidates.add(_resolve_path(sys.prefix) / "Scripts")
173
+ return candidates
174
+
175
+
176
+ def _path_outside_own_environment(raw_path: str | None = None) -> str:
177
+ """Return PATH with the running environment's bin directories removed.
178
+
179
+ Empty entries are preserved: POSIX ``execvp`` (and therefore
180
+ ``#!/usr/bin/env python3``) reads an empty ``PATH`` entry as the current
181
+ directory, and :func:`shutil.which` follows the same rule. Dropping them
182
+ would let this check approve a *later* interpreter while the installed hooks
183
+ keep resolving the ``./python3`` next to them. An empty entry is filtered
184
+ only when the current directory *is* one of our own environment bin
185
+ directories, which is what :func:`_resolve_path` reports for it.
186
+ """
187
+ source = os.environ.get("PATH", os.defpath) if raw_path is None else raw_path
188
+ own = _own_environment_bin_dirs()
189
+ kept = [
190
+ entry for entry in source.split(os.pathsep) if _resolve_path(entry) not in own
191
+ ]
192
+ return os.pathsep.join(kept)
193
+
194
+
195
+ def _resolve_shebang_interpreter(command: str) -> tuple[str | None, str | None]:
196
+ """Resolve *command* as an independent shell would.
197
+
198
+ Returns:
199
+ ``(executable, shadowed)``. *shadowed* is the nearer match that was
200
+ ignored because it belongs to this process's own environment, or ``None``.
201
+ When PATH offers nothing outside that environment, its own interpreter is
202
+ returned as *executable* (better a real verdict than none).
203
+ """
204
+ nearest = shutil.which(command)
205
+ outside = shutil.which(command, path=_path_outside_own_environment())
206
+ if outside is None:
207
+ return nearest, None
208
+ if nearest is not None and _resolve_path(nearest) == _resolve_path(outside):
209
+ return outside, None
210
+ return outside, nearest
211
+
212
+
213
+ def detect_hook_interpreter(command: str = DEFAULT_COMMAND) -> InterpreterInfo:
214
+ """Resolve *command* the way a ``#!/usr/bin/env`` shebang does and read its version.
215
+
216
+ Args:
217
+ command: Interpreter command to resolve on ``PATH``.
218
+
219
+ Returns:
220
+ An :class:`InterpreterInfo`. Never raises: every failure mode (absent
221
+ command, unrunnable interpreter, timeout, unparsable output) is reported
222
+ through :attr:`InterpreterInfo.detection_error`.
223
+ """
224
+ executable, shadowed = _resolve_shebang_interpreter(command)
225
+ if executable is None:
226
+ return InterpreterInfo(
227
+ command=command,
228
+ detection_error=f"{command} was not found on PATH",
229
+ shadowed=shadowed,
230
+ )
231
+ version, error = _probe_version(executable)
232
+ return InterpreterInfo(
233
+ command=command,
234
+ executable=executable,
235
+ version=version,
236
+ detection_error=error,
237
+ shadowed=shadowed,
238
+ )
239
+
240
+
241
+ def _probe_version(executable: str) -> tuple[tuple[int, int, int] | None, str | None]:
242
+ """Return ``(version, detection_error)`` for *executable*; exactly one is set."""
243
+ # Fast path: the resolved interpreter IS the one running mapify, so its version
244
+ # is already known and no subprocess is needed.
245
+ try:
246
+ if sys.executable and os.path.samefile(executable, sys.executable):
247
+ return (
248
+ sys.version_info[0],
249
+ sys.version_info[1],
250
+ sys.version_info[2],
251
+ ), None
252
+ except OSError:
253
+ pass
254
+
255
+ try:
256
+ proc = subprocess.run(
257
+ [executable, "-c", _VERSION_PROBE],
258
+ capture_output=True,
259
+ text=True,
260
+ timeout=_PROBE_TIMEOUT_SECONDS,
261
+ check=False,
262
+ )
263
+ except subprocess.TimeoutExpired:
264
+ return None, (
265
+ f"{executable} did not respond within {_PROBE_TIMEOUT_SECONDS:.0f}s "
266
+ "(on macOS a /usr/bin/python3 stub can block on the Xcode Command "
267
+ "Line Tools prompt)"
268
+ )
269
+ except OSError as exc:
270
+ return None, f"{executable} could not be executed: {exc}"
271
+
272
+ if proc.returncode != 0:
273
+ detail = _first_line(proc.stderr) or f"exit code {proc.returncode}"
274
+ return None, f"{executable} failed the version probe: {detail}"
275
+
276
+ version = _parse_version(proc.stdout)
277
+ if version is None:
278
+ return None, (
279
+ f"{executable} printed an unparsable version: "
280
+ f"{_first_line(proc.stdout)!r}"
281
+ )
282
+ return version, None
283
+
284
+
285
+ def skip_requested(env: Mapping[str, str] | None = None) -> bool:
286
+ """True when :data:`SKIP_ENV_VAR` opts out of the check."""
287
+ source: Mapping[str, str] = os.environ if env is None else env
288
+ return source.get(SKIP_ENV_VAR, "").strip().lower() in _TRUTHY
289
+
290
+
291
+ def remediation_lines() -> list[str]:
292
+ """Actionable, copy-pasteable ways to get a new enough ``python3`` on PATH."""
293
+ minimum = minimum_python_str()
294
+ return [
295
+ f" Homebrew (macOS): brew install python@3.12 # or newer than {minimum}",
296
+ " uv: uv python install 3.12",
297
+ " pyenv: pyenv install 3.12 && pyenv global 3.12",
298
+ " Then confirm: python3 --version",
299
+ ]
300
+
301
+
302
+ def format_problem(info: InterpreterInfo) -> str | None:
303
+ """Render an actionable message for a failing interpreter, else ``None``.
304
+
305
+ Args:
306
+ info: Result of :func:`detect_hook_interpreter`.
307
+
308
+ Returns:
309
+ Plain text (no rich markup, no square brackets so callers can print it
310
+ through ``rich`` unescaped) describing the problem and the fix, or
311
+ ``None`` when *info* satisfies :data:`MINIMUM_PYTHON`.
312
+ """
313
+ if info.satisfies_minimum:
314
+ return None
315
+
316
+ minimum = minimum_python_str()
317
+ if not info.found:
318
+ headline = (
319
+ f"{info.command} was not found on PATH, so MAP hooks and "
320
+ f".map/scripts/ runners cannot start."
321
+ )
322
+ elif info.version is None:
323
+ headline = (
324
+ f"could not determine the {info.command} version: "
325
+ f"{info.detection_error}."
326
+ )
327
+ else:
328
+ headline = (
329
+ f"{info.command} on PATH is {info.summary}, "
330
+ f"but MAP needs Python {minimum} or newer."
331
+ )
332
+
333
+ lines = [
334
+ headline,
335
+ "",
336
+ (
337
+ "Every shipped hook and .map/scripts/ runner starts with "
338
+ "#!/usr/bin/env python3, so they all run under this interpreter -- not "
339
+ f"under the one running mapify. On Python older than {minimum} they "
340
+ "fail at import (for example: cannot import name 'UTC' from 'datetime')."
341
+ ),
342
+ ]
343
+ if info.shadowed:
344
+ lines += [
345
+ "",
346
+ (
347
+ f"Note: {info.shadowed} was skipped -- it belongs to the "
348
+ "environment running mapify (uvx/uv run/venv), which is gone by "
349
+ "the time Claude Code launches a hook."
350
+ ),
351
+ ]
352
+ lines += [
353
+ "",
354
+ f"Install Python {minimum}+ and make sure python3 resolves to it:",
355
+ *remediation_lines(),
356
+ "",
357
+ (
358
+ f"To install anyway, pass --skip-python-check or set {SKIP_ENV_VAR}=1; "
359
+ "context hooks will stay broken and the blocking PreToolUse gates "
360
+ "(safety-guardrails.py, workflow-gate.py) will deny every matched "
361
+ "tool call until python3 is upgraded."
362
+ ),
363
+ ]
364
+ return "\n".join(lines)
365
+
366
+
367
+ def check_hook_python(
368
+ *, skip: bool = False, command: str = DEFAULT_COMMAND
369
+ ) -> str | None:
370
+ """Detect the hook interpreter and return a problem message, or ``None``.
371
+
372
+ Args:
373
+ skip: When True (CLI flag), skip detection entirely and report no
374
+ problem. :data:`SKIP_ENV_VAR` has the same effect.
375
+ command: Interpreter command to resolve.
376
+
377
+ Returns:
378
+ The message from :func:`format_problem`, or ``None`` when the
379
+ interpreter is acceptable or the check was skipped.
380
+ """
381
+ if skip or skip_requested():
382
+ return None
383
+ return format_problem(detect_hook_interpreter(command))