mapify-cli 3.19.0__tar.gz → 3.21.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 (456) hide show
  1. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/.claude/hooks/README.md +2 -1
  2. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/PKG-INFO +1 -1
  3. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/pyproject.toml +1 -1
  4. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/__init__.py +13 -1
  5. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/config/project_config.py +288 -0
  6. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/file_copier.py +97 -0
  7. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/providers.py +10 -0
  8. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/dependency_graph.py +315 -1
  9. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/minimality_report.py +1 -1
  10. mapify_cli-3.21.0/src/mapify_cli/parallelism_observability.py +293 -0
  11. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/actor.md +1 -0
  12. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/monitor.md +32 -0
  13. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/AGENTS.md +1 -0
  14. mapify_cli-3.21.0/src/mapify_cli/templates/codex/agents/evaluator.toml +271 -0
  15. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/agents/monitor.toml +13 -0
  16. mapify_cli-3.21.0/src/mapify_cli/templates/codex/agents/predictor.toml +423 -0
  17. {mapify_cli-3.19.0/tests/fixtures → mapify_cli-3.21.0/src/mapify_cli/templates}/codex/config.toml +8 -0
  18. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +16 -4
  19. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +127 -12
  20. mapify_cli-3.21.0/src/mapify_cli/templates/codex/skills/map-review/SKILL.md +361 -0
  21. mapify_cli-3.21.0/src/mapify_cli/templates/codex/skills/map-review/adversarial-reference.md +218 -0
  22. mapify_cli-3.21.0/src/mapify_cli/templates/codex/skills/map-review/review-reference.md +360 -0
  23. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/README.md +2 -1
  24. mapify_cli-3.21.0/src/mapify_cli/templates/hooks/map-statusline.py +189 -0
  25. mapify_cli-3.21.0/src/mapify_cli/templates/hooks/scrub-internal-ids.py +173 -0
  26. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +80 -2
  27. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +533 -14
  28. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +9476 -4950
  29. mapify_cli-3.21.0/src/mapify_cli/templates/map/scripts/scrub_internal_ids.py +536 -0
  30. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +69 -6
  31. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/hook-patterns.md +1 -0
  32. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/settings.json +11 -0
  33. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +14 -17
  34. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +219 -8
  35. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +11 -5
  36. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +15 -42
  37. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +77 -2
  38. mapify_cli-3.21.0/src/mapify_cli/templates/skills/map-review/adversarial-reference.md +148 -0
  39. mapify_cli-3.21.0/src/mapify_cli/templates/skills/map-review/review-reference.md +127 -0
  40. mapify_cli-3.21.0/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +247 -0
  41. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +1 -0
  42. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +32 -0
  43. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +1 -0
  44. mapify_cli-3.21.0/src/mapify_cli/templates_src/codex/agents/evaluator.toml.jinja +271 -0
  45. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +13 -0
  46. mapify_cli-3.21.0/src/mapify_cli/templates_src/codex/agents/predictor.toml.jinja +423 -0
  47. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +8 -0
  48. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +16 -4
  49. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +127 -12
  50. mapify_cli-3.21.0/src/mapify_cli/templates_src/codex/skills/map-review/SKILL.md.jinja +361 -0
  51. mapify_cli-3.21.0/src/mapify_cli/templates_src/codex/skills/map-review/adversarial-reference.md.jinja +218 -0
  52. mapify_cli-3.21.0/src/mapify_cli/templates_src/codex/skills/map-review/review-reference.md.jinja +360 -0
  53. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +2 -1
  54. mapify_cli-3.21.0/src/mapify_cli/templates_src/hooks/map-statusline.py.jinja +189 -0
  55. mapify_cli-3.21.0/src/mapify_cli/templates_src/hooks/scrub-internal-ids.py.jinja +173 -0
  56. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +80 -2
  57. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +533 -14
  58. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +9476 -4950
  59. mapify_cli-3.21.0/src/mapify_cli/templates_src/map/scripts/scrub_internal_ids.py.jinja +536 -0
  60. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +69 -6
  61. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +1 -0
  62. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/settings.json.jinja +11 -0
  63. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +14 -17
  64. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +219 -8
  65. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +11 -5
  66. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +15 -42
  67. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +77 -2
  68. mapify_cli-3.21.0/src/mapify_cli/templates_src/skills/map-review/adversarial-reference.md.jinja +148 -0
  69. mapify_cli-3.21.0/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +127 -0
  70. mapify_cli-3.21.0/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +247 -0
  71. mapify_cli-3.21.0/tests/_fake_task_tool.py +107 -0
  72. {mapify_cli-3.19.0/src/mapify_cli/templates → mapify_cli-3.21.0/tests/fixtures}/codex/config.toml +8 -0
  73. mapify_cli-3.21.0/tests/fixtures/wave_blueprints.py +393 -0
  74. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/hooks/test_hook_inventory_smoke.py +7 -0
  75. mapify_cli-3.21.0/tests/hooks/test_scrub_internal_ids_hook.py +166 -0
  76. mapify_cli-3.21.0/tests/test_concurrent_dispatch_harness.py +717 -0
  77. mapify_cli-3.21.0/tests/test_cross_ai_config.py +72 -0
  78. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_dependency_graph.py +211 -1
  79. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_map_orchestrator.py +1428 -0
  80. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_map_step_runner.py +2972 -3
  81. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_map_token_meter.py +207 -0
  82. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_mapify_cli.py +62 -5
  83. mapify_cli-3.21.0/tests/test_parallelism_observability.py +575 -0
  84. mapify_cli-3.21.0/tests/test_project_config.py +442 -0
  85. mapify_cli-3.21.0/tests/test_scrub_internal_ids.py +311 -0
  86. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills.py +34 -5
  87. mapify_cli-3.21.0/tests/test_slice5b_leak_guards.py +575 -0
  88. mapify_cli-3.21.0/tests/test_statusline.py +354 -0
  89. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_validate_spec_citations.py +100 -0
  90. mapify_cli-3.21.0/tests/test_wave_eval_harness.py +233 -0
  91. mapify_cli-3.21.0/tests/test_wave_fixtures.py +214 -0
  92. mapify_cli-3.21.0/tests/test_wave_parallel_harness.py +348 -0
  93. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_workflow_context_injector.py +208 -0
  94. mapify_cli-3.21.0/tests/test_worktree_isolation.py +696 -0
  95. mapify_cli-3.19.0/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -69
  96. mapify_cli-3.19.0/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -134
  97. mapify_cli-3.19.0/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -69
  98. mapify_cli-3.19.0/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -134
  99. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/.claude/skills/README.md +0 -0
  100. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/.gitignore +0 -0
  101. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/LICENSE +0 -0
  102. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/README.md +0 -0
  103. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/_locking.py +0 -0
  104. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/cli_ui.py +0 -0
  105. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/config/__init__.py +0 -0
  106. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/config/mcp.py +0 -0
  107. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/config/settings.py +0 -0
  108. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/__init__.py +0 -0
  109. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
  110. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/codex_copier.py +0 -0
  111. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
  112. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
  113. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/intent_detector.py +0 -0
  114. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/memory/__init__.py +0 -0
  115. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/memory/capture.py +0 -0
  116. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/memory/digest_schema.py +0 -0
  117. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/memory/finalize.py +0 -0
  118. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/memory/recall.py +0 -0
  119. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/ralph_state.py +0 -0
  120. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/repo_insight.py +0 -0
  121. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/research_eval.py +0 -0
  122. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/schemas.py +0 -0
  123. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skill_ir.py +0 -0
  124. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
  125. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  126. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  127. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
  128. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  129. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  130. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  131. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
  132. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/runner.py +0 -0
  133. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
  134. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/.gitignore +0 -0
  135. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
  136. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
  137. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  138. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  139. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
  140. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
  141. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  142. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  143. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  144. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  145. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
  146. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
  147. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  148. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  149. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  150. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
  151. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
  152. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
  153. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
  154. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  155. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
  156. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
  157. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
  158. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
  159. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
  160. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
  161. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
  162. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
  163. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
  164. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +0 -0
  165. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
  166. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  167. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  168. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  169. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  170. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  171. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  172. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  173. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  174. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  175. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  176. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  177. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  178. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
  179. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
  180. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  181. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  182. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  183. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  184. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  185. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  186. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  187. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/README.md +0 -0
  188. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  189. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  190. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
  191. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  192. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  193. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  194. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  195. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  196. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  197. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  198. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
  199. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  200. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  201. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  202. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  203. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  204. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  205. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  206. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  207. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  208. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  209. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  210. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  211. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  212. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  213. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  214. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  215. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
  216. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  217. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
  218. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
  219. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  220. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
  221. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  222. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  223. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  224. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  225. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  226. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  227. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  228. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  229. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
  230. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  231. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  232. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  233. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  234. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
  235. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
  236. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
  237. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
  238. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  239. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
  240. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
  241. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
  242. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
  243. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
  244. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
  245. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
  246. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
  247. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
  248. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +0 -0
  249. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
  250. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  251. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  252. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  253. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  254. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  255. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  256. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  257. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  258. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  259. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  260. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  261. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  262. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
  263. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  264. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  265. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  266. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  267. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  268. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  269. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  270. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  271. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  272. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  273. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  274. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
  275. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  276. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  277. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  278. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  279. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  280. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  281. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  282. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
  283. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  284. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  285. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  286. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  287. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  288. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  289. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  290. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  291. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  292. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  293. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  294. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  295. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  296. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  297. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  298. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  299. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
  300. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  301. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  302. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/token_budget.py +0 -0
  303. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/tool_output_offload.py +0 -0
  304. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/tools/__init__.py +0 -0
  305. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  306. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/verification_recorder.py +0 -0
  307. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/workflow_finalizer.py +0 -0
  308. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/workflow_logger.py +0 -0
  309. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/src/mapify_cli/workflow_state.py +0 -0
  310. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/__init__.py +0 -0
  311. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/conftest.py +0 -0
  312. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/fixtures/claude/escalation-matrix.md +0 -0
  313. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  314. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/hooks/test_end_of_turn.py +0 -0
  315. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/hooks/test_safety_guardrails.py +0 -0
  316. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/__init__.py +0 -0
  317. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/blueprint.json +0 -0
  318. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/code_review.md +0 -0
  319. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/plan_handoff.json +0 -0
  320. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/spec.md +0 -0
  321. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
  322. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  323. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/task_plan.md +0 -0
  324. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/fixtures/verification_summary.md +0 -0
  325. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  326. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
  327. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/README.md +0 -0
  328. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  329. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  330. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  331. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  332. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  333. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  334. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  335. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  336. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  337. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  338. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  339. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  340. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  341. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  342. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  343. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  344. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  345. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  346. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  347. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  348. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  349. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  350. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  351. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  352. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  353. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  354. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  355. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  356. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  357. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  358. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  359. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  360. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  361. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  362. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  363. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  364. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  365. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  366. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  367. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  368. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  369. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  370. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  371. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  372. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  373. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  374. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  375. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  376. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  377. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  378. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  379. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  380. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  381. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  382. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  383. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  384. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  385. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  386. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  387. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  388. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  389. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  390. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  391. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  392. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  393. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  394. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  395. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  396. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  397. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  398. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  399. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  400. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_agent_cli_correctness.py +0 -0
  401. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_agent_dispatch_audit.py +0 -0
  402. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_agent_frontmatter.py +0 -0
  403. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_artifact_schemas.py +0 -0
  404. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_bump_version.py +0 -0
  405. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_compaction_offload_integration.py +0 -0
  406. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_decomposition.py +0 -0
  407. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_diagnostics.py +0 -0
  408. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_digest_schema.py +0 -0
  409. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_file_copier.py +0 -0
  410. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_hook_patterns.py +0 -0
  411. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_init_import_graph.py +0 -0
  412. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_intent_detector.py +0 -0
  413. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  414. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_jinja2_dep.py +0 -0
  415. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_locking.py +0 -0
  416. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_managed_file_copier.py +0 -0
  417. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_map_utils_sanitize.py +0 -0
  418. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_memory_capture.py +0 -0
  419. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_memory_finalize.py +0 -0
  420. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_memory_integration.py +0 -0
  421. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_memory_recall.py +0 -0
  422. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_memory_review_fixes.py +0 -0
  423. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_minimality_report.py +0 -0
  424. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_post_compact_context.py +0 -0
  425. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_prompt_layering.py +0 -0
  426. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_pyyaml_dep.py +0 -0
  427. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_ralph_hooks.py +0 -0
  428. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_ralph_state.py +0 -0
  429. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_repo_insight.py +0 -0
  430. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_research_eval.py +0 -0
  431. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_schemas.py +0 -0
  432. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skill_ir.py +0 -0
  433. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_consistency.py +0 -0
  434. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_aggregator.py +0 -0
  435. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_apply.py +0 -0
  436. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_cli_optimize.py +0 -0
  437. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
  438. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  439. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_fixtures.py +0 -0
  440. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_optimizer.py +0 -0
  441. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  442. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_proposer.py +0 -0
  443. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_runner.py +0 -0
  444. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_schema.py +0 -0
  445. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_skills_eval_viewer.py +0 -0
  446. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_sofa_client.py +0 -0
  447. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_sofa_search.py +0 -0
  448. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_template_render.py +0 -0
  449. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_token_budget.py +0 -0
  450. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_tool_output_offload.py +0 -0
  451. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_validate_dependencies.py +0 -0
  452. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_verification_recorder.py +0 -0
  453. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_workflow_finalizer.py +0 -0
  454. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_workflow_gate.py +0 -0
  455. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_workflow_logger.py +0 -0
  456. {mapify_cli-3.19.0 → mapify_cli-3.21.0}/tests/test_workflow_state.py +0 -0
@@ -86,7 +86,7 @@ documented per event in the official Claude Code docs.
86
86
 
87
87
  ## Hook inventory
88
88
 
89
- All 15 hooks (14 `.py` + `end-of-turn.sh`) are classified against the
89
+ All 16 hooks (15 `.py` + `end-of-turn.sh`) are classified against the
90
90
  `MAP_INVOKED_BY` recursion-guard contract. **REQUIRE_GUARD** hooks early-exit
91
91
  when MAP spawns a nested subprocess; **FORBID_GUARD** hooks must always fire
92
92
  and may not carry the guard. Full contract and per-hook rationale:
@@ -107,6 +107,7 @@ classification is enforced by `scripts/lint-hooks.py` (in `make lint` /
107
107
  | `pre-compact-save-transcript.py` | `PreCompact` | No | REQUIRE_GUARD | Save full conversation transcript |
108
108
  | `detect-clarification-triggers.py` | `UserPromptSubmit` | No | REQUIRE_GUARD | Detect "ask if unclear" + async/durability language |
109
109
  | `end-of-turn.sh` | `Stop` | No | REQUIRE_GUARD | Auto-fix lint/format silently |
110
+ | `scrub-internal-ids.py` | `Stop` | No | REQUIRE_GUARD | On `WORKFLOW_COMPLETE`, strip leaked `ST-`/`AC-`/`VC-`/`INV-`/`HC-` IDs from run-changed code and commit the cleanup (gated, runs once) |
110
111
  | `map-memory-capture.py` | `Stop` | No | REQUIRE_GUARD | Append per-turn scratch WAL record (cross-session memory) |
111
112
  | `map-memory-endmark.py` | `SessionEnd` | No | REQUIRE_GUARD | Best-effort 'ended' marker for the session WAL |
112
113
  | `map-memory-finalize.py` | `SessionStart` | No | REQUIRE_GUARD | Finalize prior dirty session scratches into digests (claude -p) |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapify-cli
3
- Version: 3.19.0
3
+ Version: 3.21.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.19.0"
3
+ version = "3.21.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.19.0"
26
+ __version__ = "3.21.0"
27
27
 
28
28
  import os
29
29
  import subprocess
@@ -933,6 +933,18 @@ def init(
933
933
  total_claude = sum(claude_counts.values())
934
934
  tracker.complete("create-claude", f"{total_claude} files")
935
935
 
936
+ # Surface the non-destructive statusline decision so the user knows
937
+ # whether the context status row was wired or their own was preserved.
938
+ if claude_counts.get("statusline"):
939
+ console.print(
940
+ "[dim]· Context statusline → .claude/settings.local.json "
941
+ "(remove the statusLine key there to disable)[/dim]"
942
+ )
943
+ else:
944
+ console.print(
945
+ "[dim]· Existing statusLine detected — MAP statusline not wired[/dim]"
946
+ )
947
+
936
948
  # Create default .map/config.yaml (project-level settings)
937
949
  tracker.add("map-config", "Create .map/config.yaml")
938
950
  tracker.start("map-config")
@@ -17,6 +17,14 @@ logger = logging.getLogger(__name__)
17
17
 
18
18
  VALID_MINIMALITY = frozenset({"off", "lite", "full", "ultra"})
19
19
  VALID_PROMPT_LAYERING = frozenset({"docs_first", "stable_first"})
20
+ VALID_WORKTREE_ISOLATION = frozenset({"off", "auto", "required"})
21
+ VALID_WAVE_MODE = frozenset({"off", "auto", "on"})
22
+
23
+ # Cross-AI peer review (#288): external AI CLI runtimes map-review can dispatch
24
+ # to. Keep in sync with CROSS_AI_RUNTIMES in the rendered step runner
25
+ # (map_step_runner.py) — the runner owns the per-runtime invocation adapters;
26
+ # this set only gates the config value so a typo falls back to the default.
27
+ VALID_CROSS_AI_RUNTIMES = frozenset({"claude", "codex", "gemini", "opencode"})
20
28
 
21
29
 
22
30
  @dataclass
@@ -122,6 +130,133 @@ class MapConfig:
122
130
  # .map/config.yaml. When enabled, the map-so-search skill is available.
123
131
  sofa_enabled: bool = False
124
132
 
133
+ # Strip MAP-internal workflow IDs (ST-/AC-/VC-/INV-/HC-) from run-changed
134
+ # code at workflow completion (Stop hook `scrub-internal-ids.py`). On by
135
+ # default; set `scrub_internal_ids: false` in .map/config.yaml to opt out
136
+ # and keep the IDs the framework wrote into comments/strings/test names.
137
+ scrub_internal_ids: bool = True
138
+
139
+ # Cross-AI peer review (#288) — opt-in, OFF by default. When enabled AND the
140
+ # operator passes `map-review --cross-ai <runtime>`, the review is dispatched
141
+ # to an INDEPENDENT external AI CLI (codex/gemini/claude/opencode) for a
142
+ # second opinion. This is a DOUBLE-CONSENT gate: the per-run flag is the
143
+ # explicit egress consent (your diff/code is sent to an external vendor), and
144
+ # `review.cross_ai.enabled` is the org-level kill-switch — both must be true.
145
+ # Dotted YAML keys `review.cross_ai.{enabled,runtime,timeout_seconds}` alias
146
+ # to these snake_case fields (see load_map_config).
147
+ review_cross_ai_enabled: bool = False
148
+ # Default external runtime used when `--cross-ai` is passed without an
149
+ # explicit runtime name. Validated against VALID_CROSS_AI_RUNTIMES.
150
+ review_cross_ai_runtime: str = "codex"
151
+ # Per-dispatch timeout (seconds) for the external CLI subprocess. A real
152
+ # review can take minutes; default 180 balances latency against hangs.
153
+ review_cross_ai_timeout_seconds: int = 180
154
+
155
+ # Per-subtask git worktree isolation (#284) — opt-in, OFF by default. When
156
+ # enabled, `/map-efficient` runs each subtask's Actor inside a dedicated git
157
+ # worktree (stored OUT of the working tree, under the repo's common git dir),
158
+ # then atomically squash-merges the result into the working branch ONLY after
159
+ # the configured `verification_checks` pass IN the worktree (pre-merge gate).
160
+ # A rejected attempt (Monitor/Evaluator fail) discards the worktree, so the
161
+ # working branch is never touched by a bad attempt. This is a TOP-LEVEL
162
+ # filesystem concern, deliberately NOT nested under review/sofa. Dotted YAML
163
+ # key `worktree.isolation` aliases to this snake_case field (see
164
+ # load_map_config). The step runner owns the lifecycle + safety guards.
165
+ # Enum values:
166
+ # "off" — never create worktrees; sequential execution always.
167
+ # "auto" — create per-subtask worktrees when a parallel color-group
168
+ # dispatches; degrade to sequential with a loud warning when git
169
+ # worktrees are unavailable (non-git repo, shallow clone, etc.).
170
+ # default ON (Slice 6); disable via MAP_EFFICIENT_SEQUENTIAL_ONLY=1
171
+ # or set `worktree.isolation: off` in .map/config.yaml.
172
+ # "required" — hard-fail before parallel dispatch if worktrees are unavailable.
173
+ # Backward compat: YAML boolean `false` migrates to `"off"`, `true` to
174
+ # `"required"` in load_map_config.
175
+ worktree_isolation: str = "auto"
176
+ # Bulk-deletion guard threshold: the per-subtask merge refuses when the
177
+ # worktree branch deletes MORE than this many files vs the base commit
178
+ # (catches `rm -rf` / hallucinated mass deletion before it reaches the
179
+ # working branch). 0 disables the guard. Dotted YAML key
180
+ # `worktree.max_deletions`.
181
+ worktree_max_deletions: int = 50
182
+
183
+ # Parallel wave execution mode (#303, Slice 0 scaffolding — no behavior change
184
+ # until Slice 3/5 promote the wave-loop to default). Controls whether
185
+ # `/map-efficient` routes multi-subtask waves through the parallel wave
186
+ # coordinator or the sequential single-subtask walker.
187
+ # Enum values:
188
+ # "auto" — (default) engage the wave-loop when the color-group has >=2
189
+ # independent subtasks AND worktree.isolation != "off"; degrade to
190
+ # sequential otherwise. Slice 0: behaves as sequential everywhere
191
+ # (the wave-loop promotion and concurrent dispatch land in Slice 3/5).
192
+ # "off" — always sequential; the legacy walker; instant rollback escape hatch.
193
+ # "on" — always attempt parallel dispatch (reserved for Slice 5/6; same as
194
+ # "auto" until the concurrent-dispatch step lands).
195
+ # Dotted YAML key `execution.wave_mode` aliases to this field. YAML 1.1 parses
196
+ # bare `off`/`on` as booleans — load_map_config migrates them to strings.
197
+ execution_wave_mode: str = "auto"
198
+
199
+ # Maximum number of concurrent Actor workers in a parallel wave dispatch (#303
200
+ # Slice 5b). Range 1–8; out-of-range values are clamped by clamp_max_actors().
201
+ # Non-int / bool values fall back to the default 4 (see clamp_max_actors).
202
+ # Dotted YAML key: `execution.max_actors`.
203
+ # DORMANT in Slice 5a — parsed and validated but no execution path reads it yet.
204
+ max_actors: int = 4
205
+
206
+ # When True, a single worker that crashes with a transient error in a parallel
207
+ # wave will be retried once before the wave is aborted. Pairs with max_actors
208
+ # in Slice 5b concurrent dispatch. Dotted YAML key: `execution.retry_degraded_once`.
209
+ # DORMANT in Slice 5a — parsed and validated but no execution path reads it yet.
210
+ retry_degraded_once: bool = False
211
+
212
+ # Enable same-turn concurrent Actor dispatch in a parallel wave (#303 Slice 5b).
213
+ # default ON (Slice 6); disable via MAP_EFFICIENT_SEQUENTIAL_ONLY=1 (global
214
+ # kill-switch) or set `execution.concurrent_dispatch: false` in .map/config.yaml.
215
+ # Dotted YAML alias: `execution.concurrent_dispatch`.
216
+ # YAML 1.1 bare off/on arrive as Python bool, which matches this field type —
217
+ # no coercion needed (unlike the string enum fields).
218
+ concurrent_dispatch: bool = True
219
+
220
+ # Bounded retry cap for whole-wave rollback/restart in Slice 5b (#303).
221
+ # Range 1–10; values outside the range are clamped by clamp_max_wave_retries().
222
+ # Non-int / bool values fall back to the default 3.
223
+ # Dotted YAML alias: `execution.max_wave_retries`.
224
+ # DORMANT in 5b.0 — consumed by ST-006's rollback path; no execution path reads
225
+ # it yet.
226
+ max_wave_retries: int = 3
227
+
228
+
229
+ def clamp_max_actors(n: object) -> int:
230
+ """Clamp max_actors to the valid range [1, 8], or return the default 4.
231
+
232
+ Non-int values (including bool, str, None) return the default 4.
233
+ int values are clamped: below 1 → 1, above 8 → 8.
234
+
235
+ Note: bool is explicitly excluded (isinstance(True, int) is True in Python)
236
+ because a YAML boolean arriving here is a misconfiguration, not an int.
237
+ The floor is 1, NOT the default 4 — a valid-but-low int (e.g. 0) is clamped
238
+ to 1 (minimum legal value), while a non-int/bool/None falls back to 4.
239
+ """
240
+ if isinstance(n, bool) or not isinstance(n, int):
241
+ return 4
242
+ return max(1, min(8, n))
243
+
244
+
245
+ def clamp_max_wave_retries(n: object) -> int:
246
+ """Clamp max_wave_retries to the valid range [1, 10], or return the default 3.
247
+
248
+ Non-int values (including bool, str, None) return the default 3.
249
+ int values are clamped: below 1 → 1, above 10 → 10.
250
+
251
+ Note: bool is explicitly excluded (isinstance(True, int) is True in Python)
252
+ because a YAML boolean arriving here is a misconfiguration, not an int.
253
+ The floor is 1 — a valid-but-low int (e.g. 0) is clamped to 1 (minimum
254
+ legal value), while a non-int/bool/None falls back to the default 3.
255
+ """
256
+ if isinstance(n, bool) or not isinstance(n, int):
257
+ return 3
258
+ return max(1, min(10, n))
259
+
125
260
 
126
261
  def load_map_config(project_path: Path) -> MapConfig:
127
262
  """Load MAP config from .map/config.yaml with fallback to defaults.
@@ -181,6 +316,38 @@ def load_map_config(project_path: Path) -> MapConfig:
181
316
  if isinstance(data, dict) and "sofa.enabled" in data and "sofa_enabled" not in data:
182
317
  data["sofa_enabled"] = data.pop("sofa.enabled")
183
318
 
319
+ # Cross-AI peer review (#288): dotted hierarchical YAML keys
320
+ # `review.cross_ai.*` alias to flat snake_case dataclass fields. Without
321
+ # this the toggles are silent dead fields (load logs "unknown key" and
322
+ # the defaults stand even when the YAML sets them).
323
+ for dotted, field_name in (
324
+ ("review.cross_ai.enabled", "review_cross_ai_enabled"),
325
+ ("review.cross_ai.runtime", "review_cross_ai_runtime"),
326
+ ("review.cross_ai.timeout_seconds", "review_cross_ai_timeout_seconds"),
327
+ ("worktree.isolation", "worktree_isolation"),
328
+ ("worktree.max_deletions", "worktree_max_deletions"),
329
+ ("execution.wave_mode", "execution_wave_mode"),
330
+ ("execution.max_actors", "max_actors"),
331
+ ("execution.retry_degraded_once", "retry_degraded_once"),
332
+ ("execution.concurrent_dispatch", "concurrent_dispatch"),
333
+ ("execution.max_wave_retries", "max_wave_retries"),
334
+ ):
335
+ if dotted in data and field_name not in data:
336
+ data[field_name] = data.pop(dotted)
337
+
338
+ # Backward compat: worktree_isolation was a bool field; YAML `false`/`true`
339
+ # (and YAML 1.1 `off`/`on`) arrive as Python booleans. Migrate to the new
340
+ # enum string before the type-check loop (which expects str).
341
+ if isinstance(data.get("worktree_isolation"), bool):
342
+ data["worktree_isolation"] = (
343
+ "required" if data["worktree_isolation"] else "off"
344
+ )
345
+
346
+ # YAML 1.1 parses bare `off`/`on` as booleans for execution.wave_mode too.
347
+ # Coerce back to strings: False->"off", True->"on".
348
+ if isinstance(data.get("execution_wave_mode"), bool):
349
+ data["execution_wave_mode"] = "on" if data["execution_wave_mode"] else "off"
350
+
184
351
  # YAML 1.1 parses bare ``off``/``on`` as booleans, so ``minimality: off``
185
352
  # — the documented opt-out from the lite default (#183) — arrives as bool
186
353
  # ``False``. Coerce it back to the string level before the type-check loop;
@@ -256,6 +423,61 @@ def load_map_config(project_path: Path) -> MapConfig:
256
423
  )
257
424
  cfg.prompt_layering = "docs_first"
258
425
 
426
+ if cfg.review_cross_ai_runtime not in VALID_CROSS_AI_RUNTIMES:
427
+ logger.warning(
428
+ "Invalid review_cross_ai_runtime %r in %s (expected one of %s). "
429
+ "Using default 'codex'.",
430
+ cfg.review_cross_ai_runtime,
431
+ config_file,
432
+ ", ".join(sorted(VALID_CROSS_AI_RUNTIMES)),
433
+ )
434
+ cfg.review_cross_ai_runtime = "codex"
435
+
436
+ if cfg.review_cross_ai_timeout_seconds <= 0:
437
+ logger.warning(
438
+ "review_cross_ai_timeout_seconds must be > 0 in %s "
439
+ "(got %d). Using default 180.",
440
+ config_file,
441
+ cfg.review_cross_ai_timeout_seconds,
442
+ )
443
+ cfg.review_cross_ai_timeout_seconds = 180
444
+
445
+ if cfg.worktree_max_deletions < 0:
446
+ logger.warning(
447
+ "worktree_max_deletions must be >= 0 in %s "
448
+ "(got %d). Using default 50.",
449
+ config_file,
450
+ cfg.worktree_max_deletions,
451
+ )
452
+ cfg.worktree_max_deletions = 50
453
+
454
+ if cfg.worktree_isolation not in VALID_WORKTREE_ISOLATION:
455
+ logger.warning(
456
+ "Invalid worktree_isolation %r in %s (expected one of %s). "
457
+ "Using default 'off'.",
458
+ cfg.worktree_isolation,
459
+ config_file,
460
+ ", ".join(sorted(VALID_WORKTREE_ISOLATION)),
461
+ )
462
+ cfg.worktree_isolation = "off"
463
+
464
+ if cfg.execution_wave_mode not in VALID_WAVE_MODE:
465
+ logger.warning(
466
+ "Invalid execution_wave_mode %r in %s (expected one of %s). "
467
+ "Using default 'auto'.",
468
+ cfg.execution_wave_mode,
469
+ config_file,
470
+ ", ".join(sorted(VALID_WAVE_MODE)),
471
+ )
472
+ cfg.execution_wave_mode = "auto"
473
+
474
+ # Clamp max_actors to [1, 8]; non-int/bool → default 4.
475
+ # retry_degraded_once and concurrent_dispatch are plain bools handled by
476
+ # the generic type-check loop.
477
+ cfg.max_actors = clamp_max_actors(cfg.max_actors)
478
+ # Clamp max_wave_retries to [1, 10]; non-int/bool → default 3.
479
+ cfg.max_wave_retries = clamp_max_wave_retries(cfg.max_wave_retries)
480
+
259
481
  return cfg
260
482
 
261
483
  except yaml.YAMLError as e:
@@ -384,6 +606,72 @@ minimality: lite
384
606
  # Stack Overflow for Agents (SOFA) integration — opt-in, off by default.
385
607
  # Enable via `mapify init --sofa` or uncomment the line below.
386
608
  # sofa.enabled: false
609
+
610
+ # Cross-AI peer review (#288) — opt-in, OFF by default. When enabled AND you run
611
+ # `map-review --cross-ai <runtime>`, the review is dispatched to an INDEPENDENT
612
+ # external AI CLI (codex/gemini/claude/opencode) for a second opinion. DOUBLE
613
+ # CONSENT: your diff/code is sent to an external vendor, so BOTH the per-run flag
614
+ # AND `review.cross_ai.enabled: true` are required. Returned findings always
615
+ # enter context behind an EXTERNAL UNTRUSTED REFERENCE boundary (quote, never
616
+ # execute, verify against source).
617
+ # review.cross_ai.enabled: false
618
+ # review.cross_ai.runtime: codex # default target: claude|codex|gemini|opencode
619
+ # review.cross_ai.timeout_seconds: 180
620
+
621
+ # Per-subtask git worktree isolation (#284). Controls filesystem isolation for
622
+ # each Actor run in `/map-efficient`. Enum values:
623
+ # off — never create worktrees; sequential execution always.
624
+ # auto — (DEFAULT, Slice 6) create per-subtask worktrees when a parallel
625
+ # color-group dispatches; degrade gracefully to sequential when git
626
+ # worktrees are unavailable (non-git repo, shallow clone, etc.).
627
+ # required — hard-fail before dispatch if worktrees are unavailable (first-party
628
+ # repos that must never degrade silently).
629
+ # When on (auto/required), each Actor runs inside a dedicated git worktree stored
630
+ # under the repo's .git common dir and is squash-merged back ONLY after
631
+ # verification_checks pass. A rejected attempt is discarded — the working branch
632
+ # is never touched by a bad Actor attempt.
633
+ # OFF-RAMPS: set worktree.isolation: off (per-repo opt-out) OR set env
634
+ # MAP_EFFICIENT_SEQUENTIAL_ONLY=1 (global kill-switch — forces full legacy path).
635
+ # Backward compat: the old boolean `false`/`true` still works (migrates to off/required).
636
+ # worktree.isolation: auto # default ON (Slice 6); use off to revert
637
+ # worktree.max_deletions: 50 # refuse a merge deleting more than N files (0 = off)
638
+
639
+ # Parallel wave execution mode (#303). Controls whether `/map-efficient` routes
640
+ # multi-subtask waves through the parallel coordinator or the sequential walker.
641
+ # auto — (default) engage the wave-loop when >=2 independent subtasks AND
642
+ # worktree.isolation != off; otherwise sequential.
643
+ # off — always sequential; instant rollback escape hatch.
644
+ # on — always attempt parallel (same as auto in Slice 6).
645
+ # execution.wave_mode: auto
646
+
647
+ # Concurrent Actor limit for parallel wave dispatch (#303 Slice 5b).
648
+ # Valid range 1–8; values outside the range are clamped (0→1, 9→8).
649
+ # Non-int / bool values fall back to the default 4.
650
+ # execution.max_actors: 4
651
+
652
+ # Retry a crashed worker once before aborting the wave (Slice 5b).
653
+ # execution.retry_degraded_once: false
654
+
655
+ # Enable same-turn concurrent Actor dispatch (#303 Slice 6). DEFAULT True.
656
+ # YAML 1.1 bare off/on arrive as bool.
657
+ # OFF-RAMPS: set false here (per-repo opt-out) OR MAP_EFFICIENT_SEQUENTIAL_ONLY=1 (global).
658
+ # execution.concurrent_dispatch: true # default ON (Slice 6); use false to revert
659
+
660
+ # Bounded retry cap for whole-wave rollback/restart (#303 Slice 5b).
661
+ # Valid range 1–10; values outside the range are clamped (0→1, 99→10).
662
+ # Non-int / bool values fall back to the default 3.
663
+ # execution.max_wave_retries: 3
664
+
665
+ # Global kill-switch (Slice 6 off-ramp). Forces the FULL legacy sequential path
666
+ # regardless of any config — no wave-loop, no worktrees, no concurrent dispatch.
667
+ # Byte-identical to pre-5a legacy behavior. Set as an environment variable:
668
+ # export MAP_EFFICIENT_SEQUENTIAL_ONLY=1 # or true/yes/y/on
669
+ # Unset (or empty / "0" / "false") to restore default parallel behavior.
670
+
671
+ # Strip MAP-internal workflow IDs (ST-/AC-/VC-/INV-/HC-) from the code a run
672
+ # changed, at workflow completion (Stop hook). On by default; uncomment and set
673
+ # to false to keep the IDs the framework wrote into comments/strings/test names.
674
+ # scrub_internal_ids: true
387
675
  """
388
676
 
389
677
 
@@ -6,6 +6,7 @@ import importlib.util
6
6
  import json
7
7
  import os
8
8
  import shutil
9
+ from dataclasses import dataclass
9
10
  from pathlib import Path
10
11
  from typing import List
11
12
 
@@ -623,6 +624,102 @@ def create_config_files(
623
624
  return count
624
625
 
625
626
 
627
+ @dataclass
628
+ class StatuslineResult:
629
+ """Outcome of :func:`ensure_map_statusline`.
630
+
631
+ ``wired`` is True only when a fresh ``statusLine`` entry was written.
632
+ ``reason`` is ``"wired"`` on success, or ``"existing:<scope>"`` when an
633
+ existing status line in the ``user`` / ``project`` / ``local`` scope was
634
+ detected and left untouched.
635
+ """
636
+
637
+ wired: bool
638
+ reason: str
639
+ settings_path: Path | None = None
640
+
641
+
642
+ def _read_json_object(path: Path) -> dict | None:
643
+ """Return a parsed JSON object, or None if missing/unreadable/not an object."""
644
+ try:
645
+ data = json.loads(path.read_text(encoding="utf-8"))
646
+ except (OSError, ValueError):
647
+ return None
648
+ return data if isinstance(data, dict) else None
649
+
650
+
651
+ def _has_status_line(path: Path) -> bool:
652
+ """True when *path* is a settings JSON that already defines a ``statusLine``."""
653
+ obj = _read_json_object(path)
654
+ return bool(obj and obj.get("statusLine"))
655
+
656
+
657
+ def ensure_map_statusline(
658
+ project_path: Path,
659
+ *,
660
+ home: Path | None = None,
661
+ ) -> StatuslineResult:
662
+ """Non-destructively wire the MAP context status line.
663
+
664
+ Claude Code's ``statusLine`` setting fully owns the status row, so MAP must
665
+ never overwrite a status line the user already configured. This detects an
666
+ existing ``statusLine`` in every scope MAP must respect — highest precedence
667
+ first —
668
+
669
+ * ``<project>/.claude/settings.local.json`` (project-local overrides)
670
+ * ``<project>/.claude/settings.json`` (project, MAP-managed)
671
+ * ``~/.claude/settings.json`` (user global)
672
+
673
+ and, only when NONE is present, merges a ``statusLine`` entry pointing at the
674
+ installed ``map-statusline.py`` hook into ``.claude/settings.local.json``.
675
+
676
+ ``settings.local.json`` is deliberately chosen over the MAP-managed
677
+ ``settings.json``: it is user-owned and never re-rendered by the managed
678
+ copier, so the injection introduces no template drift and creates no ``.bak``
679
+ churn on upgrade. The merge preserves any pre-existing keys in that file, and
680
+ the operation is idempotent — a second ``mapify init`` detects MAP's own
681
+ entry and skips.
682
+
683
+ Args:
684
+ project_path: Root of the target project.
685
+ home: Override for the user home directory (test seam). Defaults to
686
+ ``Path.home()``.
687
+
688
+ Returns:
689
+ StatuslineResult describing whether a status line was wired or skipped.
690
+ """
691
+ home_dir = home if home is not None else Path.home()
692
+ claude_dir = project_path / ".claude"
693
+ scope_paths = {
694
+ "local": claude_dir / "settings.local.json",
695
+ "project": claude_dir / "settings.json",
696
+ "user": home_dir / ".claude" / "settings.json",
697
+ }
698
+
699
+ # Highest-precedence scope first so the reported scope is the one that would
700
+ # actually win at runtime.
701
+ for scope in ("local", "project", "user"):
702
+ if _has_status_line(scope_paths[scope]):
703
+ return StatuslineResult(wired=False, reason=f"existing:{scope}")
704
+
705
+ local_settings = scope_paths["local"]
706
+ hook_path = claude_dir / "hooks" / "map-statusline.py"
707
+ # Absolute, quoted path: settings.local.json is machine-local, and quoting
708
+ # keeps the shell-invoked command correct when the project path has spaces.
709
+ command = f'"{hook_path}"'
710
+
711
+ settings = _read_json_object(local_settings) or {}
712
+ settings["statusLine"] = {"type": "command", "command": command}
713
+
714
+ claude_dir.mkdir(parents=True, exist_ok=True)
715
+ local_settings.write_text(
716
+ json.dumps(settings, indent=2) + "\n", encoding="utf-8"
717
+ )
718
+ return StatuslineResult(
719
+ wired=True, reason="wired", settings_path=local_settings
720
+ )
721
+
722
+
626
723
  def create_rules_dir(
627
724
  project_path: Path,
628
725
  drift_report: DriftReport | None = None,
@@ -14,6 +14,7 @@ from mapify_cli.delivery.file_copier import (
14
14
  create_config_files,
15
15
  create_map_tools,
16
16
  create_rules_dir,
17
+ ensure_map_statusline,
17
18
  )
18
19
 
19
20
 
@@ -53,6 +54,10 @@ class ClaudeProvider(BaseProvider):
53
54
  ) -> dict[str, int]:
54
55
  """Install Claude Code MAP files into target project."""
55
56
  servers = mcp_servers or []
57
+ # Statusline wiring is a Claude-only resource decision and stays inside
58
+ # this provider so it never leaks into the Codex install path. It is
59
+ # non-destructive: skips when the user already configured a statusLine.
60
+ statusline = ensure_map_statusline(project_path)
56
61
  return {
57
62
  "agents": create_agent_files(project_path, servers),
58
63
  "commands": create_command_files(project_path),
@@ -62,6 +67,7 @@ class ClaudeProvider(BaseProvider):
62
67
  "hooks": create_hook_files(project_path),
63
68
  "configs": create_config_files(project_path),
64
69
  "rules": create_rules_dir(project_path),
70
+ "statusline": 1 if statusline.wired else 0,
65
71
  }
66
72
 
67
73
 
@@ -83,6 +89,10 @@ class CodexProvider(BaseProvider):
83
89
  Returns:
84
90
  Mapping of category name to number of files created.
85
91
  """
92
+ # Codex configures agents via TOML, not MCP JSON: the interface
93
+ # parameter is accepted for BaseProvider conformance but intentionally
94
+ # unused. `del` documents that and satisfies reportUnusedParameter.
95
+ del mcp_servers
86
96
  # Deferred to avoid circular import (codex_copier imports from file_copier)
87
97
  from mapify_cli.delivery.codex_copier import create_codex_files
88
98