mapify-cli 3.11.0__tar.gz → 3.12.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 (407) hide show
  1. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/PKG-INFO +1 -1
  2. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/pyproject.toml +1 -1
  3. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/__init__.py +95 -101
  4. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/managed_file_copier.py +38 -38
  5. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_managed_file_copier.py +23 -13
  6. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_mapify_cli.py +145 -38
  7. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/.claude/hooks/README.md +0 -0
  8. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/.claude/skills/README.md +0 -0
  9. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/.gitignore +0 -0
  10. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/README.md +0 -0
  11. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/_locking.py +0 -0
  12. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/cli_ui.py +0 -0
  13. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/config/__init__.py +0 -0
  14. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/config/mcp.py +0 -0
  15. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/config/project_config.py +0 -0
  16. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/config/settings.py +0 -0
  17. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/__init__.py +0 -0
  18. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/agent_generator.py +0 -0
  19. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/codex_copier.py +0 -0
  20. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/file_copier.py +0 -0
  21. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/providers.py +0 -0
  22. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/delivery/template_renderer.py +0 -0
  23. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/dependency_graph.py +0 -0
  24. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/intent_detector.py +0 -0
  25. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/memory/__init__.py +0 -0
  26. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/memory/capture.py +0 -0
  27. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/memory/digest_schema.py +0 -0
  28. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/memory/finalize.py +0 -0
  29. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/memory/recall.py +0 -0
  30. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/ralph_state.py +0 -0
  31. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/repo_insight.py +0 -0
  32. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/schemas.py +0 -0
  33. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skill_ir.py +0 -0
  34. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/__init__.py +0 -0
  35. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  36. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  37. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/assertions.py +0 -0
  38. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  39. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  40. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  41. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/proposer.py +0 -0
  42. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/runner.py +0 -0
  43. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/skills_eval/viewer.py +0 -0
  44. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/.gitignore +0 -0
  45. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/CLAUDE.md +0 -0
  46. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/actor.md +0 -0
  47. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/debate-arbiter.md +0 -0
  48. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
  49. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  50. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  51. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/monitor.md +0 -0
  52. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/predictor.md +0 -0
  53. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/reflector.md +0 -0
  54. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  55. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/synthesizer.md +0 -0
  56. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  57. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
  58. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  59. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
  60. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  61. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/config.toml +0 -0
  62. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
  63. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/hooks.json +0 -0
  64. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  65. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +0 -0
  66. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +0 -0
  67. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  68. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  69. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
  70. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/README.md +0 -0
  71. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
  72. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
  73. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  74. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
  75. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
  76. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
  77. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
  78. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
  79. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
  80. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
  81. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
  82. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
  83. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/safety-guardrails.py +0 -0
  84. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/workflow-context-injector.py +0 -0
  85. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
  86. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  87. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +0 -0
  88. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/scripts/map_step_runner.py +0 -0
  89. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  90. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  91. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
  92. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  93. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  94. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  95. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  96. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  97. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  98. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  99. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  100. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  101. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
  102. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
  103. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/host-paths.md +0 -0
  104. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  105. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  106. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  107. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  108. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  109. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  110. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  111. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/settings.json +0 -0
  112. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/README.md +0 -0
  113. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  114. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  115. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
  116. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +0 -0
  117. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -0
  118. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  119. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  120. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  121. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  122. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  123. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  124. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  125. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-plan/SKILL.md +0 -0
  126. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
  127. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
  128. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  129. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  130. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
  131. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
  132. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  133. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  134. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  135. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  136. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  137. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  138. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  139. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  140. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  141. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  142. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  143. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  144. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  145. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  146. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
  147. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  148. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates/workflow-rules.json +0 -0
  149. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
  150. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  151. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/actor.md.jinja +0 -0
  152. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/debate-arbiter.md.jinja +0 -0
  153. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
  154. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  155. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  156. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/monitor.md.jinja +0 -0
  157. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  158. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  159. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  160. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/synthesizer.md.jinja +0 -0
  161. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  162. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
  163. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  164. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
  165. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  166. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
  167. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
  168. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  169. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  170. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +0 -0
  171. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +0 -0
  172. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  173. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  174. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
  175. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
  176. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
  177. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
  178. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  179. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
  180. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
  181. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
  182. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
  183. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
  184. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
  185. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
  186. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
  187. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
  188. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +0 -0
  189. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +0 -0
  190. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
  191. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  192. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +0 -0
  193. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +0 -0
  194. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  195. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  196. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
  197. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  198. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  199. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  200. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  201. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  202. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  203. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  204. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  205. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  206. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
  207. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
  208. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  209. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  210. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  211. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  212. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  213. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  214. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  215. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  216. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
  217. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  218. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  219. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  220. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
  221. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +0 -0
  222. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -0
  223. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  224. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  225. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  226. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  227. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  228. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  229. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  230. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +0 -0
  231. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
  232. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
  233. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  234. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  235. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
  236. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
  237. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  238. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  239. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  240. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  241. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  242. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  243. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  244. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  245. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  246. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  247. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  248. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  249. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  250. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  251. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
  252. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  253. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  254. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/token_budget.py +0 -0
  255. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/tools/__init__.py +0 -0
  256. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  257. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/verification_recorder.py +0 -0
  258. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/workflow_finalizer.py +0 -0
  259. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/workflow_logger.py +0 -0
  260. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/src/mapify_cli/workflow_state.py +0 -0
  261. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/__init__.py +0 -0
  262. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/conftest.py +0 -0
  263. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/fixtures/claude/escalation-matrix.md +0 -0
  264. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/fixtures/codex/config.toml +0 -0
  265. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  266. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/hooks/test_end_of_turn.py +0 -0
  267. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/hooks/test_hook_inventory_smoke.py +0 -0
  268. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/hooks/test_safety_guardrails.py +0 -0
  269. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/__init__.py +0 -0
  270. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/blueprint.json +0 -0
  271. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/code_review.md +0 -0
  272. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/plan_handoff.json +0 -0
  273. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/spec.md +0 -0
  274. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/step_state_initialized.json +0 -0
  275. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  276. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/task_plan.md +0 -0
  277. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/fixtures/verification_summary.md +0 -0
  278. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  279. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/integration/test_e2e_claude_sdk.py +0 -0
  280. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/README.md +0 -0
  281. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  282. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  283. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  284. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  285. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  286. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  287. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  288. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  289. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  290. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  291. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  292. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  293. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  294. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  295. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  296. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  297. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  298. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  299. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  300. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  301. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  302. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  303. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  304. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  305. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  306. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  307. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  308. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  309. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  310. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  311. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  312. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  313. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  314. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  315. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  316. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  317. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  318. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  319. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  320. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  321. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  322. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  323. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  324. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  325. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  326. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  327. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  328. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  329. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  330. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  331. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  332. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  333. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  334. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  335. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  336. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  337. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  338. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  339. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  340. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  341. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  342. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  343. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  344. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  345. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  346. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  347. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  348. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  349. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  350. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  351. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  352. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  353. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_agent_cli_correctness.py +0 -0
  354. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_agent_frontmatter.py +0 -0
  355. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_artifact_schemas.py +0 -0
  356. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_decomposition.py +0 -0
  357. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_dependency_graph.py +0 -0
  358. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_diagnostics.py +0 -0
  359. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_digest_schema.py +0 -0
  360. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_file_copier.py +0 -0
  361. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_hook_patterns.py +0 -0
  362. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_init_import_graph.py +0 -0
  363. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_intent_detector.py +0 -0
  364. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  365. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_jinja2_dep.py +0 -0
  366. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_locking.py +0 -0
  367. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_map_orchestrator.py +0 -0
  368. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_map_step_runner.py +0 -0
  369. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_map_token_meter.py +0 -0
  370. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_map_utils_sanitize.py +0 -0
  371. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_memory_capture.py +0 -0
  372. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_memory_finalize.py +0 -0
  373. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_memory_integration.py +0 -0
  374. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_memory_recall.py +0 -0
  375. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_memory_review_fixes.py +0 -0
  376. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_post_compact_context.py +0 -0
  377. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_ralph_hooks.py +0 -0
  378. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_ralph_state.py +0 -0
  379. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_repo_insight.py +0 -0
  380. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_schemas.py +0 -0
  381. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skill_ir.py +0 -0
  382. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills.py +0 -0
  383. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_consistency.py +0 -0
  384. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_aggregator.py +0 -0
  385. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_apply.py +0 -0
  386. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_cli_optimize.py +0 -0
  387. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_dispatcher_env.py +0 -0
  388. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  389. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_fixtures.py +0 -0
  390. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_optimizer.py +0 -0
  391. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  392. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_proposer.py +0 -0
  393. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_runner.py +0 -0
  394. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_schema.py +0 -0
  395. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_skills_eval_viewer.py +0 -0
  396. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_sofa_client.py +0 -0
  397. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_sofa_search.py +0 -0
  398. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_template_render.py +0 -0
  399. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_token_budget.py +0 -0
  400. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_validate_dependencies.py +0 -0
  401. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_validate_spec_citations.py +0 -0
  402. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_verification_recorder.py +0 -0
  403. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_workflow_context_injector.py +0 -0
  404. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_workflow_finalizer.py +0 -0
  405. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_workflow_gate.py +0 -0
  406. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/tests/test_workflow_logger.py +0 -0
  407. {mapify_cli-3.11.0 → mapify_cli-3.12.1}/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.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mapify-cli"
3
- version = "3.11.0"
3
+ version = "3.12.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,7 +23,7 @@ Or install globally:
23
23
  mapify check
24
24
  """
25
25
 
26
- __version__ = "3.11.0"
26
+ __version__ = "3.12.1"
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
 
@@ -49,6 +49,7 @@ class CopyResult:
49
49
  backup_path: Optional[Path] = None
50
50
  reason: str = ""
51
51
  first_install: bool = False
52
+ migrated: bool = False
52
53
 
53
54
 
54
55
  @dataclass
@@ -754,50 +755,49 @@ def copy_managed_file(
754
755
  return result
755
756
 
756
757
  if fence_result.state == "no_fence":
757
- # INV-T / D10: Phase B install (metadata present, no fence)
758
- # Treat as fully managed (current behavior, no regression) + emit notice
759
- notice = (
760
- f"MIGRATION: {dest}: Phase B install detected (metadata present, no fence). "
761
- "Treating as fully managed. Re-install with mapify to add fence structure."
762
- )
763
- print(notice, file=sys.stderr)
764
-
765
- # Compute hash of clean dest content to detect drift
758
+ # INV-T / D10: legacy unfenced install (metadata present, no fence markers).
759
+ # Silently upgrade it to the fenced layout exactly what a fresh install
760
+ # writes (Case A). Legacy unfenced files were fully managed (no user tail),
761
+ # so the entire body becomes the managed region inside the fence.
762
+ #
763
+ # This migration is one-time and invisible by design: once the fence is
764
+ # written, the next copy_managed_file() run finds state == "found" and takes
765
+ # the normal merge path, so this branch never fires for that file again.
766
+ # We deliberately emit NO per-file notice a routine, self-healing upgrade
767
+ # should not flood stderr with alarming lines on every `mapify init`.
766
768
  stored_hash = existing_meta.get("template_hash", "")
767
769
  _, clean_dest = extract_metadata(dest_content, ext)
768
770
  current_hash = compute_hash(clean_dest)
769
771
 
770
772
  result = CopyResult(src=src, dest=dest)
771
- result.reason = notice
772
-
773
- if stored_hash and current_hash == stored_hash:
774
- # No drift; upgrade metadata only
775
- final_text = injected
776
- try:
777
- _atomic_write(dest, final_text)
778
- result.success = True
779
- except OSError as exc:
780
- result.success = False
781
- result.reason += f" write failed: {exc}"
782
- else:
783
- # Drift or unknown hash → backup + overwrite fully managed
784
- if stored_hash:
785
- result.drifted = True
786
- ts = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S")
787
- backup_path = dest.with_suffix(f"{dest.suffix}.{ts}.bak")
788
- try:
789
- shutil.copy2(dest, backup_path)
790
- result.backed_up = True
791
- result.backup_path = backup_path
792
- except OSError:
793
- result.reason += " (backup failed)"
794
- final_text = injected
773
+ result.migrated = True
774
+ result.reason = "upgraded legacy unfenced file to fenced layout"
775
+
776
+ # Back up only when the user modified the previously fully-managed body
777
+ # (hash drift), mirroring the fenced-merge drift-backup behavior.
778
+ if stored_hash and current_hash != stored_hash:
779
+ result.drifted = True
780
+ ts = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S")
781
+ backup_path = dest.with_suffix(f"{dest.suffix}.{ts}.bak")
795
782
  try:
796
- _atomic_write(dest, final_text)
797
- result.success = True
798
- except OSError as exc:
799
- result.success = False
800
- result.reason += f" write failed: {exc}"
783
+ shutil.copy2(dest, backup_path)
784
+ result.backed_up = True
785
+ result.backup_path = backup_path
786
+ except OSError:
787
+ result.reason += " (backup failed)"
788
+
789
+ final_text = _build_fenced_content(
790
+ metadata_line=meta_prefix.rstrip("\n"),
791
+ start_token=start_token,
792
+ end_token=end_token,
793
+ managed_body=body_after_meta,
794
+ )
795
+ try:
796
+ _atomic_write(dest, final_text)
797
+ result.success = True
798
+ except OSError as exc:
799
+ result.success = False
800
+ result.reason = f"write failed: {exc}"
801
801
 
802
802
  return result
803
803
 
@@ -608,43 +608,53 @@ class TestFenceAwareMerge:
608
608
 
609
609
  # ------------------------------------------------------------------ VC3
610
610
  @pytest.mark.parametrize("ext,start_tok,end_tok", _FENCE_FORMATS)
611
- def test_vc3_phase_b_no_fence_fully_managed_no_regression(
611
+ def test_vc3_legacy_unfenced_upgraded_to_fenced_silently(
612
612
  self, tmp_path, ext: str, start_tok: str, end_tok: str, capsys: pytest.CaptureFixture[str]
613
613
  ) -> None:
614
- """VC3 [INV-T]: Phase B file (metadata, no fence) fully managed + migration notice."""
614
+ """VC3 [INV-T]: legacy unfenced file (metadata, no fence) is silently upgraded
615
+ to the fenced layout — fence markers added, no alarming per-file stderr output,
616
+ and the migration is one-time (idempotent on re-copy)."""
615
617
  src_body = _src_body_for(ext)
616
618
  src = tmp_path / f"tmpl{ext}"
617
619
  src.write_text(src_body, encoding="utf-8")
618
620
  dest = tmp_path / f"dest{ext}"
619
621
 
620
- # Simulate a Phase B install: inject metadata but NO fence
622
+ # Simulate a legacy install: inject metadata but NO fence
621
623
  template_hash = compute_hash(src_body)
622
624
  phase_b_content = inject_metadata(src_body, ext, "1.0.0", template_hash)
623
625
  dest.write_text(phase_b_content, encoding="utf-8")
624
626
 
625
- # Re-copy with Phase C copier
627
+ # Re-copy: migration should complete by adding the fence
626
628
  r = copy_managed_file(src, dest, "1.1.0")
627
- assert r.success, f"Phase B C migration failed: {r.reason}"
629
+ assert r.success, f"legacyfenced migration failed: {r.reason}"
630
+ assert r.migrated, "result must flag the one-time legacy → fenced migration"
628
631
 
629
- # Must have written something (fully managed — no fence added on Phase B migration;
630
- # fence only comes with a full re-install via `mapify init`)
631
- del start_tok, end_tok # Phase B path doesn't add fence tokens by design
632
632
  content = dest.read_text(encoding="utf-8")
633
- assert "MAP-MANAGED" in content, "Metadata must be present after re-copy"
633
+ assert "MAP-MANAGED" in content, "Metadata must be present after migration"
634
+ # The migration must now write the fence markers (the whole point of the fix).
635
+ assert start_tok in content, f"start fence {start_tok!r} missing after migration"
636
+ assert end_tok in content, f"end fence {end_tok!r} missing after migration"
634
637
  # Check key lines of the managed body are present (shebang may be reordered)
635
638
  for line in src_body.splitlines():
636
639
  stripped = line.strip()
637
640
  if stripped and not stripped.startswith("#!"):
638
641
  assert stripped in content, (
639
- f"Body line {stripped!r} missing from re-copied content"
642
+ f"Body line {stripped!r} missing from migrated content"
640
643
  )
641
644
 
642
- # Migration notice must appear on stderr
645
+ # No alarming per-file notice should reach stderr — the upgrade is silent.
643
646
  stderr_out = capsys.readouterr().err
644
- assert "MIGRATION" in stderr_out or "Phase B" in stderr_out or "no fence" in stderr_out.lower(), (
645
- f"Migration notice expected in stderr; got: {stderr_out!r}"
647
+ assert "MIGRATION" not in stderr_out and "Phase B" not in stderr_out, (
648
+ f"legacy upgrade must be silent; got stderr: {stderr_out!r}"
646
649
  )
647
650
 
651
+ # Idempotent: a second copy now finds a proper fence (state == 'found'),
652
+ # so it takes the normal merge path and does NOT re-migrate.
653
+ r2 = copy_managed_file(src, dest, "1.1.0")
654
+ assert r2.success
655
+ assert not r2.migrated, "migration must be one-time, not repeated on every copy"
656
+ assert capsys.readouterr().err == "", "re-copy of a fenced file must be silent"
657
+
648
658
  # ------------------------------------------------------------------ VC4
649
659
  @pytest.mark.parametrize("ext,start_tok,end_tok", _FENCE_FORMATS)
650
660
  def test_vc4_deleted_fence_user_owned_not_overwritten(