mapify-cli 3.11.0__tar.gz → 3.12.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 (407) hide show
  1. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/PKG-INFO +1 -1
  2. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/pyproject.toml +1 -1
  3. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/__init__.py +95 -101
  4. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_mapify_cli.py +145 -38
  5. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/.claude/hooks/README.md +0 -0
  6. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/.claude/skills/README.md +0 -0
  7. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/.gitignore +0 -0
  8. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/README.md +0 -0
  9. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/_locking.py +0 -0
  10. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/cli_ui.py +0 -0
  11. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/config/__init__.py +0 -0
  12. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/config/mcp.py +0 -0
  13. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/config/project_config.py +0 -0
  14. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/config/settings.py +0 -0
  15. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/__init__.py +0 -0
  16. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
  17. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/codex_copier.py +0 -0
  18. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/file_copier.py +0 -0
  19. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
  20. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/providers.py +0 -0
  21. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
  22. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/dependency_graph.py +0 -0
  23. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/intent_detector.py +0 -0
  24. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/memory/__init__.py +0 -0
  25. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/memory/capture.py +0 -0
  26. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/memory/digest_schema.py +0 -0
  27. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/memory/finalize.py +0 -0
  28. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/memory/recall.py +0 -0
  29. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/ralph_state.py +0 -0
  30. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/repo_insight.py +0 -0
  31. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/schemas.py +0 -0
  32. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skill_ir.py +0 -0
  33. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
  34. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  35. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  36. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
  37. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  38. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  39. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  40. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
  41. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/runner.py +0 -0
  42. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
  43. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/.gitignore +0 -0
  44. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
  45. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/actor.md +0 -0
  46. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/debate-arbiter.md +0 -0
  47. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
  48. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  49. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  50. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/monitor.md +0 -0
  51. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
  52. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
  53. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  54. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/synthesizer.md +0 -0
  55. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  56. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
  57. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  58. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
  59. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  60. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/config.toml +0 -0
  61. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
  62. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
  63. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  64. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +0 -0
  65. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +0 -0
  66. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  67. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  68. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
  69. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/README.md +0 -0
  70. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
  71. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
  72. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  73. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
  74. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
  75. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
  76. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
  77. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
  78. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
  79. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
  80. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
  81. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
  82. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +0 -0
  83. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +0 -0
  84. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
  85. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  86. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +0 -0
  87. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +0 -0
  88. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  89. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  90. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
  91. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  92. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  93. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  94. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  95. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  96. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  97. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  98. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  99. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  100. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
  101. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
  102. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
  103. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  104. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  105. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  106. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  107. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  108. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  109. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  110. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/settings.json +0 -0
  111. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/README.md +0 -0
  112. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  113. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  114. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
  115. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +0 -0
  116. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -0
  117. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  118. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  119. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  120. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  121. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  122. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  123. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  124. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +0 -0
  125. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
  126. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
  127. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  128. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  129. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
  130. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
  131. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  132. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  133. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  134. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  135. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  136. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  137. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  138. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  139. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  140. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  141. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  142. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  143. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  144. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  145. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
  146. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  147. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
  148. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
  149. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  150. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +0 -0
  151. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/debate-arbiter.md.jinja +0 -0
  152. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
  153. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  154. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  155. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +0 -0
  156. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  157. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  158. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  159. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/synthesizer.md.jinja +0 -0
  160. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  161. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
  162. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  163. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
  164. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  165. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
  166. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
  167. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  168. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  169. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +0 -0
  170. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +0 -0
  171. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  172. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  173. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
  174. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
  175. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
  176. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
  177. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  178. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
  179. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
  180. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
  181. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
  182. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
  183. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
  184. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
  185. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
  186. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
  187. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +0 -0
  188. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +0 -0
  189. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
  190. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  191. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +0 -0
  192. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +0 -0
  193. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  194. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  195. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
  196. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  197. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  198. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  199. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  200. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  201. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  202. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  203. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  204. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  205. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
  206. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
  207. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  208. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  209. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  210. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  211. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  212. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  213. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  214. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  215. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
  216. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  217. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  218. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  219. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
  220. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +0 -0
  221. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -0
  222. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  223. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  224. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  225. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  226. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  227. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  228. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  229. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +0 -0
  230. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
  231. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
  232. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  233. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  234. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
  235. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
  236. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  237. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  238. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  239. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  240. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  241. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  242. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  243. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  244. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  245. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  246. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  247. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  248. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  249. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  250. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
  251. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  252. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  253. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/token_budget.py +0 -0
  254. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/tools/__init__.py +0 -0
  255. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  256. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/verification_recorder.py +0 -0
  257. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/workflow_finalizer.py +0 -0
  258. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/workflow_logger.py +0 -0
  259. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/src/mapify_cli/workflow_state.py +0 -0
  260. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/__init__.py +0 -0
  261. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/conftest.py +0 -0
  262. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/fixtures/claude/escalation-matrix.md +0 -0
  263. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/fixtures/codex/config.toml +0 -0
  264. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  265. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/hooks/test_end_of_turn.py +0 -0
  266. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/hooks/test_hook_inventory_smoke.py +0 -0
  267. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/hooks/test_safety_guardrails.py +0 -0
  268. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/__init__.py +0 -0
  269. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/blueprint.json +0 -0
  270. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/code_review.md +0 -0
  271. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/plan_handoff.json +0 -0
  272. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/spec.md +0 -0
  273. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
  274. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  275. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/task_plan.md +0 -0
  276. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/fixtures/verification_summary.md +0 -0
  277. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  278. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
  279. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/README.md +0 -0
  280. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  281. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  282. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  283. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  284. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  285. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  286. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  287. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  288. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  289. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  290. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  291. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  292. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  293. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  294. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  295. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  296. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  297. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  298. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  299. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  300. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  301. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  302. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  303. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  304. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  305. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  306. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  307. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  308. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  309. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  310. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  311. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  312. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  313. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  314. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  315. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  316. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  317. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  318. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  319. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  320. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  321. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  322. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  323. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  324. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  325. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  326. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  327. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  328. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  329. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  330. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  331. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  332. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  333. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  334. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  335. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  336. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  337. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  338. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  339. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  340. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  341. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  342. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  343. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  344. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  345. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  346. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  347. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  348. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  349. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  350. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  351. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  352. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_agent_cli_correctness.py +0 -0
  353. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_agent_frontmatter.py +0 -0
  354. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_artifact_schemas.py +0 -0
  355. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_decomposition.py +0 -0
  356. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_dependency_graph.py +0 -0
  357. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_diagnostics.py +0 -0
  358. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_digest_schema.py +0 -0
  359. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_file_copier.py +0 -0
  360. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_hook_patterns.py +0 -0
  361. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_init_import_graph.py +0 -0
  362. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_intent_detector.py +0 -0
  363. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  364. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_jinja2_dep.py +0 -0
  365. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_locking.py +0 -0
  366. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_managed_file_copier.py +0 -0
  367. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_map_orchestrator.py +0 -0
  368. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_map_step_runner.py +0 -0
  369. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_map_token_meter.py +0 -0
  370. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_map_utils_sanitize.py +0 -0
  371. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_memory_capture.py +0 -0
  372. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_memory_finalize.py +0 -0
  373. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_memory_integration.py +0 -0
  374. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_memory_recall.py +0 -0
  375. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_memory_review_fixes.py +0 -0
  376. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_post_compact_context.py +0 -0
  377. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_ralph_hooks.py +0 -0
  378. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_ralph_state.py +0 -0
  379. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_repo_insight.py +0 -0
  380. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_schemas.py +0 -0
  381. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skill_ir.py +0 -0
  382. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills.py +0 -0
  383. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_consistency.py +0 -0
  384. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_aggregator.py +0 -0
  385. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_apply.py +0 -0
  386. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_cli_optimize.py +0 -0
  387. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
  388. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  389. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_fixtures.py +0 -0
  390. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_optimizer.py +0 -0
  391. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  392. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_proposer.py +0 -0
  393. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_runner.py +0 -0
  394. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_schema.py +0 -0
  395. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_skills_eval_viewer.py +0 -0
  396. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_sofa_client.py +0 -0
  397. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_sofa_search.py +0 -0
  398. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_template_render.py +0 -0
  399. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_token_budget.py +0 -0
  400. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_validate_dependencies.py +0 -0
  401. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_validate_spec_citations.py +0 -0
  402. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_verification_recorder.py +0 -0
  403. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_workflow_context_injector.py +0 -0
  404. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_workflow_finalizer.py +0 -0
  405. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_workflow_gate.py +0 -0
  406. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_workflow_logger.py +0 -0
  407. {mapify_cli-3.11.0 → mapify_cli-3.12.0}/tests/test_workflow_state.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapify-cli
3
- Version: 3.11.0
3
+ Version: 3.12.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mapify-cli"
3
- version = "3.11.0"
3
+ version = "3.12.0"
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,7 +23,7 @@ Or install globally:
23
23
  mapify check
24
24
  """
25
25
 
26
- __version__ = "3.11.0"
26
+ __version__ = "3.12.0"
27
27
 
28
28
  import os
29
29
  import subprocess
@@ -70,12 +70,12 @@ from mapify_cli.delivery import (
70
70
  create_evaluator_content as create_evaluator_content,
71
71
  create_reflector_content as create_reflector_content,
72
72
  create_documentation_reviewer_content as create_documentation_reviewer_content,
73
- create_agent_files,
74
- create_reference_files,
75
- create_command_files,
76
- create_skill_files,
77
- create_hook_files,
78
- create_config_files,
73
+ create_agent_files as create_agent_files,
74
+ create_reference_files as create_reference_files,
75
+ create_command_files as create_command_files,
76
+ create_skill_files as create_skill_files,
77
+ create_hook_files as create_hook_files,
78
+ create_config_files as create_config_files,
79
79
  create_commands_dir as create_commands_dir,
80
80
  )
81
81
  from mapify_cli.config import (
@@ -1259,32 +1259,62 @@ def doctor(debug: bool = typer.Option(False, "--debug", help="Enable debug loggi
1259
1259
  console.print(f" • {path_name}")
1260
1260
 
1261
1261
 
1262
+ def _mapify_install_kind() -> str:
1263
+ """Classify how this mapify CLI is installed.
1264
+
1265
+ Returns one of:
1266
+ - ``"uv-tool"``: installed via ``uv tool install`` (self-upgradeable with uv)
1267
+ - ``"pip"``: installed into a regular/virtualenv site-packages (pip -U)
1268
+ - ``"source"``: running from a source checkout / editable install
1269
+ (self-upgrade disabled — the user owns the tree)
1270
+ """
1271
+ pkg = str(Path(__file__).resolve()).replace("\\", "/")
1272
+ if "/uv/tools/" in pkg:
1273
+ return "uv-tool"
1274
+ if "/site-packages/" in pkg or "/dist-packages/" in pkg:
1275
+ return "pip"
1276
+ return "source"
1277
+
1278
+
1279
+ def _self_upgrade_command(kind: str) -> Optional[List[str]]:
1280
+ """Return the argv that upgrades mapify-cli for ``kind``, or None if unknown."""
1281
+ if kind == "uv-tool":
1282
+ uv = shutil.which("uv")
1283
+ return [uv, "tool", "upgrade", "mapify-cli"] if uv else None
1284
+ if kind == "pip":
1285
+ return [sys.executable, "-m", "pip", "install", "--upgrade", "mapify-cli"]
1286
+ return None
1287
+
1288
+
1289
+ def _run_self_upgrade(cmd: List[str]) -> int:
1290
+ """Run the self-upgrade command, streaming its output. Returns the exit code.
1291
+
1292
+ Returns ``127`` when the executable is not found. Isolated into its own
1293
+ function so tests can stub the subprocess invocation without patching the
1294
+ module-level ``subprocess`` used by many other commands.
1295
+ """
1296
+ try:
1297
+ return subprocess.run(cmd, check=False).returncode
1298
+ except FileNotFoundError:
1299
+ return 127
1300
+
1301
+
1262
1302
  @app.command()
1263
1303
  def upgrade():
1264
- """Upgrade MAP agents to the latest version."""
1265
- show_banner()
1266
- project_path = Path.cwd()
1267
-
1268
- if not is_map_initialized(project_path):
1269
- console.print(
1270
- "[yellow]MAP Framework not initialized in this directory.[/yellow]"
1271
- )
1272
- console.print("Run: [cyan]mapify init .[/cyan]")
1273
- raise typer.Exit(0)
1304
+ """Upgrade the mapify CLI itself to the latest released version.
1274
1305
 
1275
- if _detect_provider(project_path) == "codex":
1276
- console.print(
1277
- "[yellow]Codex projects: re-run "
1278
- "[cyan]mapify init . --provider codex --force[/cyan] to refresh.[/yellow]"
1279
- )
1280
- raise typer.Exit(0)
1306
+ This refreshes the installed ``mapify-cli`` package (the tool), not the
1307
+ files inside a project. After upgrading, run ``mapify init . --force`` to
1308
+ refresh a project's shipped MAP files with the new templates.
1309
+ """
1310
+ show_banner()
1281
1311
 
1282
- console.print("[cyan]Checking for updates...[/cyan]")
1312
+ console.print("[cyan]Checking for the latest release...[/cyan]")
1283
1313
  latest_release = get_latest_release("azalio", "map-framework")
1284
- latest_version = None
1314
+ latest_version: Optional[str] = None
1285
1315
 
1286
1316
  if latest_release and latest_release.get("tag_name"):
1287
- latest_version = latest_release["tag_name"].lstrip("v")
1317
+ latest_version = str(latest_release["tag_name"]).lstrip("v")
1288
1318
  if parse_version(latest_version) > parse_version(__version__):
1289
1319
  console.print(
1290
1320
  f"[yellow]New version available:[/yellow] {latest_version} "
@@ -1294,97 +1324,61 @@ def upgrade():
1294
1324
  console.print(f"Release: [cyan]{latest_release['html_url']}[/cyan]")
1295
1325
  else:
1296
1326
  console.print(
1297
- f"[green]You are on the latest installed version ({__version__}).[/green]"
1327
+ f"[green]Already on the latest release ({__version__}).[/green]"
1298
1328
  )
1329
+ console.print("[dim]Nothing to upgrade.[/dim]")
1330
+ raise typer.Exit(0)
1299
1331
  else:
1300
1332
  console.print(
1301
- "[dim]Could not fetch release metadata; refreshing local templates anyway.[/dim]"
1333
+ "[dim]Could not fetch release metadata; attempting upgrade anyway.[/dim]"
1302
1334
  )
1303
1335
 
1304
- tracker = StepTracker("Upgrade MAP Framework Files")
1305
-
1306
- # Track drift across all file types
1307
- from mapify_cli.delivery.managed_file_copier import DriftReport
1308
-
1309
- drift_report = DriftReport()
1336
+ kind = _mapify_install_kind()
1310
1337
 
1311
- existing_project_mcp = read_project_mcp_json(project_path / ".mcp.json")
1312
- existing_server_names = []
1313
- if existing_project_mcp:
1314
- existing_server_names = list(existing_project_mcp.get("mcpServers", {}).keys())
1315
-
1316
- tracker.add("agents", "Refresh agent templates")
1317
- tracker.start("agents")
1318
- agent_count = create_agent_files(project_path, existing_server_names, drift_report)
1319
- tracker.complete("agents", f"{agent_count} files")
1320
-
1321
- tracker.add("commands", "Refresh slash commands")
1322
- tracker.start("commands")
1323
- command_count = create_command_files(project_path, drift_report)
1324
- tracker.complete("commands", f"{command_count} files")
1325
-
1326
- tracker.add("skills", "Refresh skills")
1327
- tracker.start("skills")
1328
- skill_count = create_skill_files(project_path)
1329
- tracker.complete("skills", f"{skill_count} folders")
1330
-
1331
- tracker.add("references", "Refresh reference files")
1332
- tracker.start("references")
1333
- ref_count = create_reference_files(project_path, drift_report)
1334
- tracker.complete("references", f"{ref_count} files")
1335
-
1336
- tracker.add("hooks", "Refresh shared hooks")
1337
- tracker.start("hooks")
1338
- hook_count = create_hook_files(project_path, drift_report)
1339
- tracker.complete("hooks", f"{hook_count} files")
1340
-
1341
- tracker.add("configs", "Refresh config files")
1342
- tracker.start("configs")
1343
- config_count = create_config_files(project_path, drift_report)
1344
- tracker.complete("configs", f"{config_count} files")
1345
-
1346
- tracker.add("permissions", "Merge local approvals")
1347
- tracker.start("permissions")
1348
- create_or_merge_project_settings_local(project_path)
1349
- tracker.complete("permissions", "settings.local.json updated")
1338
+ if kind == "source":
1339
+ source_root = Path(__file__).resolve().parents[2]
1340
+ console.print(
1341
+ "[yellow]Running from a source checkout — self-upgrade is disabled.[/yellow]"
1342
+ )
1343
+ console.print(f"[dim]Source: {source_root}[/dim]")
1344
+ console.print(
1345
+ "[dim]Update with [cyan]git pull[/cyan] "
1346
+ "(then re-install the tool if needed).[/dim]"
1347
+ )
1348
+ raise typer.Exit(0)
1350
1349
 
1351
- if (project_path / ".claude" / "mcp_config.json").exists() or (
1352
- project_path / ".mcp.json"
1353
- ).exists():
1354
- tracker.add("mcp", "Preserve MCP config")
1355
- tracker.complete("mcp", "left unchanged")
1350
+ cmd = _self_upgrade_command(kind)
1351
+ if cmd is None:
1352
+ console.print(
1353
+ "[red]Could not determine how to upgrade mapify automatically.[/red]"
1354
+ )
1355
+ console.print(
1356
+ "Upgrade manually: [cyan]uv tool upgrade mapify-cli[/cyan] "
1357
+ "or [cyan]pip install --upgrade mapify-cli[/cyan]"
1358
+ )
1359
+ raise typer.Exit(1)
1356
1360
 
1357
1361
  console.print()
1358
- console.print(tracker.render())
1362
+ console.print(f"[cyan]Upgrading mapify-cli...[/cyan] [dim]({' '.join(cmd)})[/dim]")
1363
+ exit_code = _run_self_upgrade(cmd)
1359
1364
 
1360
- # Show drift warnings if any files were modified by the user
1361
- if drift_report.has_drift:
1365
+ if exit_code != 0:
1362
1366
  console.print()
1363
1367
  console.print(
1364
- f"[yellow] {len(drift_report.drifted_files)} file(s) had local modifications:[/yellow]"
1365
- )
1366
- for r in drift_report.drifted_files:
1367
- try:
1368
- rel = r.dest.relative_to(project_path)
1369
- except ValueError:
1370
- rel = r.dest
1371
- backup_note = ""
1372
- if r.backed_up and r.backup_path:
1373
- try:
1374
- backup_rel = r.backup_path.relative_to(project_path)
1375
- except ValueError:
1376
- backup_rel = r.backup_path
1377
- backup_note = f" → backup: [cyan]{backup_rel}[/cyan]"
1378
- console.print(f" [yellow]•[/yellow] {rel}{backup_note}")
1379
- console.print(
1380
- "[dim]Your changes were backed up to .bak files. "
1381
- "Review and re-apply any customizations if needed.[/dim]"
1368
+ f"[red]Upgrade command failed (exit {exit_code}).[/red] Run it manually:"
1382
1369
  )
1370
+ console.print(f" [cyan]{' '.join(cmd)}[/cyan]")
1371
+ raise typer.Exit(1)
1383
1372
 
1373
+ target = latest_version or "the latest release"
1384
1374
  console.print()
1385
- console.print("[bold green]Upgrade complete.[/bold green]")
1386
1375
  console.print(
1387
- "[dim]Note: upgrade refreshes shipped MAP files but does not overwrite project-specific MCP selections.[/dim]"
1376
+ f"[bold green]mapify upgraded[/bold green] (was {__version__}, now {target})."
1377
+ )
1378
+ console.print("[dim]Confirm with [cyan]mapify --version[/cyan].[/dim]")
1379
+ console.print(
1380
+ "[dim]To refresh this project's MAP files with the new templates, run "
1381
+ "[cyan]mapify init . --force[/cyan].[/dim]"
1388
1382
  )
1389
1383
 
1390
1384
 
@@ -14,6 +14,7 @@ from typer.testing import CliRunner
14
14
  # Add src directory to path for imports
15
15
  sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
16
16
 
17
+ import mapify_cli
17
18
  from mapify_cli.delivery import create_map_tools
18
19
  from mapify_cli import (
19
20
  app,
@@ -703,17 +704,19 @@ class TestDoctorCommand:
703
704
  class TestUpgradeCommand:
704
705
  """Test the upgrade command."""
705
706
 
707
+ @mock.patch("mapify_cli._run_self_upgrade", return_value=0)
708
+ @mock.patch(
709
+ "mapify_cli._self_upgrade_command",
710
+ return_value=["uv", "tool", "upgrade", "mapify-cli"],
711
+ )
712
+ @mock.patch("mapify_cli._mapify_install_kind", return_value="uv-tool")
706
713
  @mock.patch("mapify_cli.get_latest_release")
707
- def test_upgrade_available(self, mock_get_latest, tmp_path):
708
- """Test upgrade refreshes files and reports newer release."""
714
+ def test_upgrade_self_upgrades_when_newer(
715
+ self, mock_get_latest, _mock_kind, _mock_cmd, mock_run, tmp_path
716
+ ):
717
+ """A newer release self-upgrades the mapify CLI and writes no project files."""
718
+ del _mock_kind, _mock_cmd
709
719
  os.chdir(tmp_path)
710
- init_result = runner.invoke(app, ["init", ".", "--no-git", "--mcp", "none"])
711
- assert init_result.exit_code == 0
712
-
713
- actor_file = tmp_path / ".claude" / "agents" / "actor.md"
714
- original_content = actor_file.read_text()
715
- actor_file.write_text("stale content\n")
716
-
717
720
  mock_get_latest.return_value = {
718
721
  "tag_name": "v9.9.9",
719
722
  "html_url": "https://github.com/azalio/map-framework/releases/tag/v9.9.9",
@@ -721,43 +724,144 @@ class TestUpgradeCommand:
721
724
 
722
725
  result = runner.invoke(app, ["upgrade"])
723
726
 
724
- assert result.exit_code == 0
725
- assert "New version available" in result.stdout
726
- assert "Upgrade complete" in result.stdout
727
- # Compare content ignoring MAP-MANAGED metadata timestamps (which differ between init and upgrade)
728
- import re
727
+ # Rich may hard-wrap output to terminal width; normalize whitespace
728
+ # before substring checks so wrapped lines still match.
729
+ normalized = " ".join(result.stdout.split())
730
+ assert result.exit_code == 0, result.stdout
731
+ assert "New version available" in normalized
732
+ assert "mapify upgraded" in normalized
733
+ # Directs users at the project-file refresh path
734
+ assert "mapify init . --force" in normalized
735
+ # Shelled out to the self-upgrade command exactly once
736
+ mock_run.assert_called_once_with(["uv", "tool", "upgrade", "mapify-cli"])
737
+ # upgrade no longer creates any project files
738
+ assert not (tmp_path / ".claude").exists()
739
+
740
+ @mock.patch("mapify_cli._run_self_upgrade")
741
+ @mock.patch("mapify_cli.get_latest_release")
742
+ def test_upgrade_already_latest_does_nothing(
743
+ self, mock_get_latest, mock_run, tmp_path
744
+ ):
745
+ """When already on the latest release, no upgrade command runs."""
746
+ os.chdir(tmp_path)
747
+ mock_get_latest.return_value = {
748
+ "tag_name": "v0.0.1",
749
+ "html_url": "https://github.com/azalio/map-framework/releases/tag/v0.0.1",
750
+ }
729
751
 
730
- def _strip_managed_meta(text):
731
- return re.sub(r"<!-- MAP-MANAGED:.*?-->\n?", "", text)
752
+ result = runner.invoke(app, ["upgrade"])
732
753
 
733
- assert _strip_managed_meta(actor_file.read_text()) == _strip_managed_meta(
734
- original_content
735
- )
754
+ assert result.exit_code == 0
755
+ assert "Already on the latest release" in result.stdout
756
+ assert "Nothing to upgrade" in result.stdout
757
+ mock_run.assert_not_called()
736
758
 
759
+ @mock.patch("mapify_cli._run_self_upgrade")
760
+ @mock.patch("mapify_cli._mapify_install_kind", return_value="source")
737
761
  @mock.patch("mapify_cli.get_latest_release")
738
- def test_upgrade_not_available(self, mock_get_latest, tmp_path):
739
- """Test upgrade when already on latest version."""
762
+ def test_upgrade_source_checkout_disabled(
763
+ self, mock_get_latest, _mock_kind, mock_run, tmp_path
764
+ ):
765
+ """A source checkout disables self-upgrade and runs no command."""
766
+ del _mock_kind
740
767
  os.chdir(tmp_path)
741
- init_result = runner.invoke(app, ["init", ".", "--no-git", "--mcp", "none"])
742
- assert init_result.exit_code == 0
743
- mock_get_latest.return_value = {
744
- "tag_name": "v3.5.0",
745
- "html_url": "https://github.com/azalio/map-framework/releases/tag/v3.5.0",
746
- }
768
+ mock_get_latest.return_value = {"tag_name": "v9.9.9"}
747
769
 
748
770
  result = runner.invoke(app, ["upgrade"])
749
771
 
750
772
  assert result.exit_code == 0
751
- assert "latest installed version" in result.stdout
752
- assert "Upgrade complete" in result.stdout
773
+ assert "self-upgrade is disabled" in result.stdout
774
+ mock_run.assert_not_called()
753
775
 
754
- def test_upgrade_not_initialized(self, tmp_path):
755
- """Test upgrade in non-initialized directory."""
776
+ @mock.patch("mapify_cli._run_self_upgrade", return_value=1)
777
+ @mock.patch(
778
+ "mapify_cli._self_upgrade_command",
779
+ return_value=["uv", "tool", "upgrade", "mapify-cli"],
780
+ )
781
+ @mock.patch("mapify_cli._mapify_install_kind", return_value="uv-tool")
782
+ @mock.patch("mapify_cli.get_latest_release")
783
+ def test_upgrade_command_failure_exits_nonzero(
784
+ self, mock_get_latest, _mock_kind, _mock_cmd, _mock_run, tmp_path
785
+ ):
786
+ """A failing upgrade command surfaces a nonzero exit and a manual hint."""
787
+ del _mock_kind, _mock_cmd, _mock_run
788
+ os.chdir(tmp_path)
789
+ mock_get_latest.return_value = {"tag_name": "v9.9.9"}
790
+
791
+ result = runner.invoke(app, ["upgrade"])
792
+
793
+ assert result.exit_code == 1
794
+ assert "Upgrade command failed" in result.stdout
795
+
796
+ @mock.patch("mapify_cli.get_latest_release", return_value=None)
797
+ def test_upgrade_no_release_metadata_attempts_anyway(
798
+ self, _mock_get_latest, tmp_path
799
+ ):
800
+ """No release metadata: upgrade still proceeds past the version gate."""
801
+ del _mock_get_latest
756
802
  os.chdir(tmp_path)
757
803
  result = runner.invoke(app, ["upgrade"])
758
804
 
805
+ # In the pytest runtime mapify resolves to a source checkout, so the
806
+ # self-upgrade path short-circuits cleanly instead of shelling out.
807
+ normalized = " ".join(result.stdout.split())
759
808
  assert result.exit_code == 0
760
- assert "MAP Framework not initialized" in result.stdout
809
+ assert "Could not fetch release metadata" in normalized
810
+
811
+
812
+ class TestSelfUpgradeHelpers:
813
+ """Unit tests for install-kind detection and the upgrade-command builder."""
814
+
815
+ def test_install_kind_uv_tool(self, monkeypatch):
816
+ monkeypatch.setattr(
817
+ mapify_cli,
818
+ "__file__",
819
+ "/home/u/.local/share/uv/tools/mapify-cli/lib/"
820
+ "python3.11/site-packages/mapify_cli/__init__.py",
821
+ )
822
+ assert mapify_cli._mapify_install_kind() == "uv-tool"
823
+
824
+ def test_install_kind_pip(self, monkeypatch):
825
+ monkeypatch.setattr(
826
+ mapify_cli,
827
+ "__file__",
828
+ "/home/u/.venv/lib/python3.11/site-packages/mapify_cli/__init__.py",
829
+ )
830
+ assert mapify_cli._mapify_install_kind() == "pip"
831
+
832
+ def test_install_kind_source(self, monkeypatch):
833
+ monkeypatch.setattr(
834
+ mapify_cli,
835
+ "__file__",
836
+ "/home/u/gitroot/map-framework/src/mapify_cli/__init__.py",
837
+ )
838
+ assert mapify_cli._mapify_install_kind() == "source"
839
+
840
+ def test_self_upgrade_command_uv_tool(self, monkeypatch):
841
+ monkeypatch.setattr(mapify_cli.shutil, "which", lambda *_: "/usr/bin/uv")
842
+ assert mapify_cli._self_upgrade_command("uv-tool") == [
843
+ "/usr/bin/uv",
844
+ "tool",
845
+ "upgrade",
846
+ "mapify-cli",
847
+ ]
848
+
849
+ def test_self_upgrade_command_uv_tool_missing_uv(self, monkeypatch):
850
+ monkeypatch.setattr(mapify_cli.shutil, "which", lambda *_: None)
851
+ assert mapify_cli._self_upgrade_command("uv-tool") is None
852
+
853
+ def test_self_upgrade_command_pip(self):
854
+ assert mapify_cli._self_upgrade_command("pip") == [
855
+ sys.executable,
856
+ "-m",
857
+ "pip",
858
+ "install",
859
+ "--upgrade",
860
+ "mapify-cli",
861
+ ]
862
+
863
+ def test_self_upgrade_command_source_is_none(self):
864
+ assert mapify_cli._self_upgrade_command("source") is None
761
865
 
762
866
 
763
867
  class TestAgentCreation:
@@ -1721,18 +1825,21 @@ class TestCodexProvider:
1721
1825
  # AC-21: upgrade on codex project must not create .claude/ #
1722
1826
  # ------------------------------------------------------------------ #
1723
1827
 
1724
- def test_ac21_upgrade_codex_project_no_claude(self, codex_project):
1725
- """AC-21: 'mapify upgrade' on codex project must not create .claude/."""
1828
+ @mock.patch("mapify_cli.get_latest_release")
1829
+ def test_ac21_upgrade_codex_project_no_claude(self, mock_get_latest, codex_project):
1830
+ """AC-21: 'mapify upgrade' upgrades the CLI only and creates no project files.
1831
+
1832
+ upgrade is now provider-agnostic and never writes into the project, so a
1833
+ codex project stays codex-only — no .claude/ is ever created.
1834
+ """
1835
+ mock_get_latest.return_value = {"tag_name": "v9.9.9"}
1726
1836
  local_runner = CliRunner()
1727
1837
  os.chdir(codex_project)
1728
1838
  result = local_runner.invoke(app, ["upgrade"])
1729
1839
  assert result.exit_code == 0, f"upgrade failed: {result.output}"
1730
1840
  assert not (
1731
1841
  codex_project / ".claude"
1732
- ).exists(), ".claude/ must NOT be created when upgrading a codex project"
1733
- assert (
1734
- "mapify init . --provider codex --force" in result.output
1735
- ), "upgrade must tell codex users to re-run init with --provider codex"
1842
+ ).exists(), ".claude/ must NOT be created by upgrade on a codex project"
1736
1843
 
1737
1844
  def test_ac22_map_efficient_state_machine_markers(self, codex_project):
1738
1845
  """AC-22: $map-efficient documents the required state-machine commands."""
File without changes
File without changes