mapify-cli 3.18.0__tar.gz → 3.20.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 (425) hide show
  1. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/.claude/hooks/README.md +2 -1
  2. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/PKG-INFO +10 -1
  3. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/README.md +9 -0
  4. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/pyproject.toml +1 -1
  5. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/__init__.py +23 -3
  6. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/config/project_config.py +11 -0
  7. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/config/settings.py +135 -2
  8. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/codex_copier.py +136 -5
  9. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/schemas.py +107 -0
  10. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/actor.md +11 -0
  11. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/monitor.md +16 -0
  12. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +12 -1
  13. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +44 -0
  14. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +4 -0
  15. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/README.md +2 -1
  16. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +61 -0
  17. mapify_cli-3.20.0/src/mapify_cli/templates/hooks/scrub-internal-ids.py +173 -0
  18. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +114 -7
  19. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +437 -14
  20. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +3408 -180
  21. mapify_cli-3.20.0/src/mapify_cli/templates/map/scripts/scrub_internal_ids.py +536 -0
  22. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/escalation-matrix.md +28 -3
  23. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/hook-patterns.md +1 -0
  24. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/settings.json +11 -0
  25. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +57 -9
  26. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +10 -6
  27. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +166 -8
  28. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +2 -0
  29. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +26 -2
  30. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +11 -0
  31. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +16 -0
  32. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +12 -1
  33. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +44 -0
  34. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +4 -0
  35. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +2 -1
  36. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +61 -0
  37. mapify_cli-3.20.0/src/mapify_cli/templates_src/hooks/scrub-internal-ids.py.jinja +173 -0
  38. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +114 -7
  39. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +437 -14
  40. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +3408 -180
  41. mapify_cli-3.20.0/src/mapify_cli/templates_src/map/scripts/scrub_internal_ids.py.jinja +536 -0
  42. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +28 -3
  43. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +1 -0
  44. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/settings.json.jinja +11 -0
  45. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +57 -9
  46. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +10 -6
  47. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +166 -8
  48. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +2 -0
  49. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +26 -2
  50. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/fixtures/claude/escalation-matrix.md +28 -3
  51. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/hooks/test_hook_inventory_smoke.py +7 -0
  52. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/hooks/test_safety_guardrails.py +102 -0
  53. mapify_cli-3.20.0/tests/hooks/test_scrub_internal_ids_hook.py +166 -0
  54. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_artifact_schemas.py +58 -0
  55. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_decomposition.py +230 -0
  56. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_map_orchestrator.py +276 -0
  57. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_map_step_runner.py +2356 -42
  58. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_mapify_cli.py +214 -0
  59. mapify_cli-3.20.0/tests/test_scrub_internal_ids.py +311 -0
  60. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills.py +6 -1
  61. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_template_render.py +152 -4
  62. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_workflow_context_injector.py +139 -0
  63. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/.claude/skills/README.md +0 -0
  64. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/.gitignore +0 -0
  65. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/LICENSE +0 -0
  66. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/_locking.py +0 -0
  67. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/cli_ui.py +0 -0
  68. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/config/__init__.py +0 -0
  69. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/config/mcp.py +0 -0
  70. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/__init__.py +0 -0
  71. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
  72. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/file_copier.py +0 -0
  73. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
  74. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/providers.py +0 -0
  75. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
  76. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/dependency_graph.py +0 -0
  77. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/intent_detector.py +0 -0
  78. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/memory/__init__.py +0 -0
  79. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/memory/capture.py +0 -0
  80. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/memory/digest_schema.py +0 -0
  81. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/memory/finalize.py +0 -0
  82. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/memory/recall.py +0 -0
  83. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/minimality_report.py +0 -0
  84. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/ralph_state.py +0 -0
  85. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/repo_insight.py +0 -0
  86. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/research_eval.py +0 -0
  87. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skill_ir.py +0 -0
  88. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
  89. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  90. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  91. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
  92. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  93. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  94. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  95. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
  96. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/runner.py +0 -0
  97. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
  98. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/.gitignore +0 -0
  99. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
  100. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
  101. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  102. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  103. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
  104. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
  105. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  106. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  107. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
  108. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  109. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
  110. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  111. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/config.toml +0 -0
  112. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
  113. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
  114. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  115. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  116. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  117. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
  118. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
  119. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
  120. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  121. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
  122. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
  123. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
  124. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
  125. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
  126. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
  127. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
  128. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
  129. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
  130. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
  131. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  132. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  133. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  134. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
  135. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  136. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  137. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  138. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  139. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  140. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  141. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  142. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  143. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  144. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
  145. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  146. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  147. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  148. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  149. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  150. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  151. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  152. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/README.md +0 -0
  153. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  154. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  155. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  156. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  157. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  158. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  159. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  160. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  161. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  162. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
  163. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  164. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  165. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
  166. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
  167. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  168. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  169. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  170. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  171. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  172. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  173. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  174. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  175. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  176. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  177. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  178. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  179. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  180. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  181. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
  182. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
  183. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  184. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
  185. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
  186. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  187. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
  188. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  189. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  190. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  191. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  192. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  193. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  194. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
  195. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  196. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
  197. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  198. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
  199. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
  200. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  201. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  202. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  203. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  204. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
  205. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
  206. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
  207. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  208. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
  209. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
  210. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
  211. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
  212. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
  213. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
  214. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
  215. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
  216. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
  217. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
  218. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  219. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  220. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  221. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
  222. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  223. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  224. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  225. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  226. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  227. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  228. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  229. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  230. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  231. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  232. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  233. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  234. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  235. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  236. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  237. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  238. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  239. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  240. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  241. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  242. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  243. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  244. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  245. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  246. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  247. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  248. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  249. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
  250. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  251. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  252. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
  253. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
  254. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  255. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  256. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  257. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  258. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  259. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  260. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  261. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  262. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  263. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  264. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  265. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  266. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  267. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  268. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
  269. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
  270. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  271. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  272. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/token_budget.py +0 -0
  273. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/tool_output_offload.py +0 -0
  274. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/tools/__init__.py +0 -0
  275. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  276. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/verification_recorder.py +0 -0
  277. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/workflow_finalizer.py +0 -0
  278. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/workflow_logger.py +0 -0
  279. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/src/mapify_cli/workflow_state.py +0 -0
  280. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/__init__.py +0 -0
  281. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/conftest.py +0 -0
  282. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/fixtures/codex/config.toml +0 -0
  283. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  284. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/hooks/test_end_of_turn.py +0 -0
  285. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/__init__.py +0 -0
  286. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/blueprint.json +0 -0
  287. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/code_review.md +0 -0
  288. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/plan_handoff.json +0 -0
  289. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/spec.md +0 -0
  290. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
  291. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  292. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/task_plan.md +0 -0
  293. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/fixtures/verification_summary.md +0 -0
  294. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  295. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
  296. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/README.md +0 -0
  297. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  298. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  299. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  300. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  301. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  302. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  303. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  304. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  305. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  306. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  307. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  308. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  309. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  310. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  311. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  312. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  313. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  314. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  315. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  316. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  317. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  318. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  319. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  320. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  321. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  322. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  323. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  324. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  325. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  326. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  327. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  328. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  329. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  330. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  331. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  332. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  333. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  334. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  335. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  336. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  337. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  338. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  339. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  340. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  341. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  342. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  343. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  344. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  345. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  346. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  347. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  348. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  349. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  350. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  351. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  352. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  353. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  354. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  355. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  356. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  357. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  358. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  359. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  360. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  361. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  362. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  363. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  364. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  365. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  366. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  367. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  368. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  369. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_agent_cli_correctness.py +0 -0
  370. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_agent_dispatch_audit.py +0 -0
  371. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_agent_frontmatter.py +0 -0
  372. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_bump_version.py +0 -0
  373. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_compaction_offload_integration.py +0 -0
  374. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_dependency_graph.py +0 -0
  375. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_diagnostics.py +0 -0
  376. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_digest_schema.py +0 -0
  377. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_file_copier.py +0 -0
  378. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_hook_patterns.py +0 -0
  379. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_init_import_graph.py +0 -0
  380. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_intent_detector.py +0 -0
  381. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  382. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_jinja2_dep.py +0 -0
  383. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_locking.py +0 -0
  384. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_managed_file_copier.py +0 -0
  385. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_map_token_meter.py +0 -0
  386. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_map_utils_sanitize.py +0 -0
  387. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_memory_capture.py +0 -0
  388. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_memory_finalize.py +0 -0
  389. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_memory_integration.py +0 -0
  390. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_memory_recall.py +0 -0
  391. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_memory_review_fixes.py +0 -0
  392. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_minimality_report.py +0 -0
  393. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_post_compact_context.py +0 -0
  394. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_prompt_layering.py +0 -0
  395. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_pyyaml_dep.py +0 -0
  396. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_ralph_hooks.py +0 -0
  397. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_ralph_state.py +0 -0
  398. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_repo_insight.py +0 -0
  399. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_research_eval.py +0 -0
  400. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_schemas.py +0 -0
  401. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skill_ir.py +0 -0
  402. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_consistency.py +0 -0
  403. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_aggregator.py +0 -0
  404. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_apply.py +0 -0
  405. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_cli_optimize.py +0 -0
  406. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
  407. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  408. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_fixtures.py +0 -0
  409. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_optimizer.py +0 -0
  410. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  411. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_proposer.py +0 -0
  412. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_runner.py +0 -0
  413. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_schema.py +0 -0
  414. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_skills_eval_viewer.py +0 -0
  415. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_sofa_client.py +0 -0
  416. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_sofa_search.py +0 -0
  417. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_token_budget.py +0 -0
  418. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_tool_output_offload.py +0 -0
  419. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_validate_dependencies.py +0 -0
  420. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_validate_spec_citations.py +0 -0
  421. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_verification_recorder.py +0 -0
  422. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_workflow_finalizer.py +0 -0
  423. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_workflow_gate.py +0 -0
  424. {mapify_cli-3.18.0 → mapify_cli-3.20.0}/tests/test_workflow_logger.py +0 -0
  425. {mapify_cli-3.18.0 → mapify_cli-3.20.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.18.0
3
+ Version: 3.20.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
@@ -274,6 +274,15 @@ mapify init . --sofa # opt-in: enable the map-so-search skill
274
274
 
275
275
  This writes `sofa.enabled: true` to `.map/config.yaml` and adds `.sofa/` to your `.gitignore`. Without the flag, no SOFA code path runs. See the [SOFA usage guide](docs/USAGE.md#stack-overflow-for-agents-sofa).
276
276
 
277
+ **Autonomy posture** (`--autonomy`, claude provider) — **off by default**, opt-in "YOLO-minus-git":
278
+
279
+ ```bash
280
+ mapify init . --autonomy # auto-approve most tools; keep git commit/push for the human
281
+ mapify init . --no-autonomy # remove the autonomy posture
282
+ ```
283
+
284
+ `--autonomy` writes a broad auto-approve allowlist plus a `git commit`/`push` deny into the **per-user, gitignored** `.claude/settings.local.json` (the committed team `.claude/settings.json` stays the secure baseline) and gitignores that file. The git block is enforced by the `safety-guardrails.py` PreToolUse hook (the permission deny alone is bypassable under a broad `Bash(*)` allow). Omit the flag to leave existing local settings untouched on re-init. See the [autonomy usage guide](docs/USAGE.md#autonomy-posture-yolo-minus-git).
285
+
277
286
  </details>
278
287
 
279
288
  ## Documentation
@@ -229,6 +229,15 @@ mapify init . --sofa # opt-in: enable the map-so-search skill
229
229
 
230
230
  This writes `sofa.enabled: true` to `.map/config.yaml` and adds `.sofa/` to your `.gitignore`. Without the flag, no SOFA code path runs. See the [SOFA usage guide](docs/USAGE.md#stack-overflow-for-agents-sofa).
231
231
 
232
+ **Autonomy posture** (`--autonomy`, claude provider) — **off by default**, opt-in "YOLO-minus-git":
233
+
234
+ ```bash
235
+ mapify init . --autonomy # auto-approve most tools; keep git commit/push for the human
236
+ mapify init . --no-autonomy # remove the autonomy posture
237
+ ```
238
+
239
+ `--autonomy` writes a broad auto-approve allowlist plus a `git commit`/`push` deny into the **per-user, gitignored** `.claude/settings.local.json` (the committed team `.claude/settings.json` stays the secure baseline) and gitignores that file. The git block is enforced by the `safety-guardrails.py` PreToolUse hook (the permission deny alone is bypassable under a broad `Bash(*)` allow). Omit the flag to leave existing local settings untouched on re-init. See the [autonomy usage guide](docs/USAGE.md#autonomy-posture-yolo-minus-git).
240
+
232
241
  </details>
233
242
 
234
243
  ## Documentation
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mapify-cli"
3
- version = "3.18.0"
3
+ version = "3.20.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.18.0"
26
+ __version__ = "3.20.0"
27
27
 
28
28
  import os
29
29
  import subprocess
@@ -38,7 +38,7 @@ import typer
38
38
  import httpx
39
39
 
40
40
  try:
41
- import truststore
41
+ import truststore # pyright: ignore[reportMissingImports]
42
42
 
43
43
  HAS_TRUSTSTORE = True
44
44
  except ImportError:
@@ -691,6 +691,18 @@ def init(
691
691
  "See docs/USAGE.md."
692
692
  ),
693
693
  ),
694
+ autonomy: Optional[bool] = typer.Option(
695
+ None,
696
+ "--autonomy/--no-autonomy",
697
+ help=(
698
+ "Opt-in 'YOLO-minus-git' posture (claude provider only): auto-approve "
699
+ "most tools in the per-user, gitignored .claude/settings.local.json "
700
+ "while a PreToolUse hook keeps git commit/push blocked (you run them). "
701
+ "--no-autonomy removes it. Omit to leave existing local settings "
702
+ "untouched. The committed team settings.json stays the secure baseline. "
703
+ "See docs/USAGE.md."
704
+ ),
705
+ ),
694
706
  ):
695
707
  """
696
708
  Initialize a new MAP Framework project.
@@ -739,6 +751,14 @@ def init(
739
751
  )
740
752
  raise typer.Exit(1)
741
753
 
754
+ # Autonomy posture is delivered via .claude/settings.local.json + the Claude
755
+ # safety-guardrails hook, neither of which the codex provider installs.
756
+ if provider == "codex" and autonomy is not None:
757
+ console.print(
758
+ "[yellow]Note:[/yellow] --autonomy/--no-autonomy applies to the claude "
759
+ "provider only; ignored for --provider codex."
760
+ )
761
+
742
762
  # Validate compression policy & threshold only when the user actually
743
763
  # passed the flag — None means "leave existing config alone", which is
744
764
  # the correct behaviour on re-run in an existing project. The canonical
@@ -956,7 +976,7 @@ def init(
956
976
 
957
977
  tracker.add("project-permissions", "Configure project approvals")
958
978
  tracker.start("project-permissions")
959
- create_or_merge_project_settings_local(project_path)
979
+ create_or_merge_project_settings_local(project_path, autonomy=autonomy)
960
980
  tracker.complete("project-permissions", ".claude/settings.local.json")
961
981
 
962
982
  # Initialize git (shared, provider-agnostic)
@@ -122,6 +122,12 @@ class MapConfig:
122
122
  # .map/config.yaml. When enabled, the map-so-search skill is available.
123
123
  sofa_enabled: bool = False
124
124
 
125
+ # Strip MAP-internal workflow IDs (ST-/AC-/VC-/INV-/HC-) from run-changed
126
+ # code at workflow completion (Stop hook `scrub-internal-ids.py`). On by
127
+ # default; set `scrub_internal_ids: false` in .map/config.yaml to opt out
128
+ # and keep the IDs the framework wrote into comments/strings/test names.
129
+ scrub_internal_ids: bool = True
130
+
125
131
 
126
132
  def load_map_config(project_path: Path) -> MapConfig:
127
133
  """Load MAP config from .map/config.yaml with fallback to defaults.
@@ -384,6 +390,11 @@ minimality: lite
384
390
  # Stack Overflow for Agents (SOFA) integration — opt-in, off by default.
385
391
  # Enable via `mapify init --sofa` or uncomment the line below.
386
392
  # sofa.enabled: false
393
+
394
+ # Strip MAP-internal workflow IDs (ST-/AC-/VC-/INV-/HC-) from the code a run
395
+ # changed, at workflow completion (Stop hook). On by default; uncomment and set
396
+ # to false to keep the IDs the framework wrote into comments/strings/test names.
397
+ # scrub_internal_ids: true
387
398
  """
388
399
 
389
400
 
@@ -2,11 +2,76 @@
2
2
 
3
3
  import json
4
4
  from pathlib import Path
5
- from typing import Dict, Any
5
+ from typing import Dict, Any, Optional
6
6
 
7
7
  from mapify_cli.cli_ui import console
8
8
 
9
9
 
10
+ # ---------------------------------------------------------------------------
11
+ # Autonomy posture (opt-in via `mapify init --autonomy`)
12
+ # ---------------------------------------------------------------------------
13
+ #
14
+ # "YOLO-minus-git": auto-approve most tools locally while keeping the human in
15
+ # control of commit/push. This is a *personal* risk preference, so it is written
16
+ # ONLY to the per-user, gitignored .claude/settings.local.json — never to the
17
+ # committed, team-shared .claude/settings.json baseline.
18
+ #
19
+ # The permission-level git deny below is documentation / defense-in-depth: under
20
+ # a broad ``Bash(*)`` allow it is bypassable (``bash -c 'git commit'`` matches as
21
+ # ``bash``). The actual hard block is the ``safety-guardrails.py`` PreToolUse
22
+ # hook, which is gated on the ``mapify.autonomy`` sentinel this module writes.
23
+ _AUTONOMY_ALLOW = [
24
+ "Bash(*)",
25
+ "Read(*)",
26
+ "Edit(*)",
27
+ "Write(*)",
28
+ "MultiEdit(*)",
29
+ "Glob(*)",
30
+ "Grep(*)",
31
+ "LS(*)",
32
+ ]
33
+ _AUTONOMY_DENY = [
34
+ "Bash(git commit:*)",
35
+ "Bash(git push:*)",
36
+ ]
37
+
38
+ _SETTINGS_LOCAL_GITIGNORE_MARKER = "# map:settings-local"
39
+ _SETTINGS_LOCAL_GITIGNORE_BLOCK = (
40
+ "# map:settings-local — per-user Claude Code approvals / autonomy posture; "
41
+ "never commit\n"
42
+ ".claude/settings.local.json\n"
43
+ )
44
+
45
+
46
+ def ensure_settings_local_gitignored(project_path: Path) -> int:
47
+ """Idempotently add ``.claude/settings.local.json`` to the repo-root .gitignore.
48
+
49
+ A personal autonomy posture must not leak into the team via a committed
50
+ settings.local.json. Mirrors ``merge_sofa_gitignore``: the OR-guard skips the
51
+ append whenever our marker OR an active ignore line is already present, so the
52
+ entry is never duplicated regardless of how the user got it there.
53
+
54
+ Returns 1 when the file was created or modified, 0 when already up-to-date.
55
+ """
56
+ gitignore = project_path / ".gitignore"
57
+
58
+ if not gitignore.exists():
59
+ gitignore.write_text(_SETTINGS_LOCAL_GITIGNORE_BLOCK)
60
+ return 1
61
+
62
+ existing = gitignore.read_text()
63
+ ignored_lines = {line.strip() for line in existing.splitlines()}
64
+ if (
65
+ _SETTINGS_LOCAL_GITIGNORE_MARKER in existing
66
+ or ".claude/settings.local.json" in ignored_lines
67
+ ):
68
+ return 0
69
+
70
+ separator = "" if existing.endswith("\n") else "\n"
71
+ gitignore.write_text(existing + separator + _SETTINGS_LOCAL_GITIGNORE_BLOCK)
72
+ return 1
73
+
74
+
10
75
  def configure_global_permissions() -> None:
11
76
  """Configure global Claude Code permissions for read-only commands"""
12
77
  claude_dir = Path.home() / ".claude"
@@ -91,7 +156,9 @@ def configure_global_permissions() -> None:
91
156
  )
92
157
 
93
158
 
94
- def create_or_merge_project_settings_local(project_path: Path) -> None:
159
+ def create_or_merge_project_settings_local(
160
+ project_path: Path, *, autonomy: Optional[bool] = None
161
+ ) -> None:
95
162
  """Create/merge .claude/settings.local.json with safe project allowlist.
96
163
 
97
164
  Claude Code supports per-project approvals via `.claude/settings.local.json`.
@@ -105,6 +172,16 @@ def create_or_merge_project_settings_local(project_path: Path) -> None:
105
172
 
106
173
  We keep this allowlist intentionally narrow and focused on common safe actions
107
174
  for local development workflows.
175
+
176
+ Args:
177
+ project_path: Target project root.
178
+ autonomy: Opt-in "YOLO-minus-git" posture.
179
+ - ``True`` → merge a broad tool allowlist + git commit/push deny and
180
+ write the ``mapify.autonomy`` sentinel (also gitignores the file).
181
+ - ``False`` → remove the autonomy allow/deny entries and the sentinel
182
+ (teardown for ``--no-autonomy``).
183
+ - ``None`` → leave any existing autonomy posture untouched (default on
184
+ re-run, so re-init never silently flips a user's choice).
108
185
  """
109
186
 
110
187
  settings_file = project_path / ".claude" / "settings.local.json"
@@ -167,4 +244,60 @@ def create_or_merge_project_settings_local(project_path: Path) -> None:
167
244
  permissions.setdefault("deny", [])
168
245
  permissions.setdefault("ask", [])
169
246
 
247
+ # Autonomy posture (opt-in). None = leave as-is.
248
+ if autonomy is True:
249
+ _apply_autonomy(existing_settings, permissions)
250
+ elif autonomy is False:
251
+ _remove_autonomy(existing_settings, permissions)
252
+
170
253
  settings_file.write_text(json.dumps(existing_settings, indent=2) + "\n")
254
+
255
+ if autonomy is True:
256
+ ensure_settings_local_gitignored(project_path)
257
+ console.print(
258
+ "[yellow]Autonomy mode:[/yellow] auto-allowing most tools in "
259
+ ".claude/settings.local.json (per-user, gitignored). git commit/push "
260
+ "stay blocked — you run them. The local deny overrides the team baseline."
261
+ )
262
+ elif autonomy is False:
263
+ console.print(
264
+ "[dim]Autonomy mode disabled: removed local broad-allow + git block "
265
+ "from .claude/settings.local.json.[/dim]"
266
+ )
267
+
268
+
269
+ def _apply_autonomy(settings: Dict[str, Any], permissions: Dict[str, Any]) -> None:
270
+ """Add the broad allow + git deny entries and the autonomy sentinel."""
271
+ allow = permissions.setdefault("allow", [])
272
+ for entry in _AUTONOMY_ALLOW:
273
+ if entry not in allow:
274
+ allow.append(entry)
275
+
276
+ deny = permissions.setdefault("deny", [])
277
+ for entry in _AUTONOMY_DENY:
278
+ if entry not in deny:
279
+ deny.append(entry)
280
+
281
+ # Sentinel beside the permissions it governs so posture and permissions
282
+ # cannot drift apart; read by the safety-guardrails.py PreToolUse hook.
283
+ mapify_meta = settings.setdefault("mapify", {})
284
+ if isinstance(mapify_meta, dict):
285
+ mapify_meta["autonomy"] = True
286
+
287
+
288
+ def _remove_autonomy(settings: Dict[str, Any], permissions: Dict[str, Any]) -> None:
289
+ """Remove the autonomy allow/deny entries and the sentinel (teardown)."""
290
+ if isinstance(permissions.get("allow"), list):
291
+ permissions["allow"] = [
292
+ e for e in permissions["allow"] if e not in _AUTONOMY_ALLOW
293
+ ]
294
+ if isinstance(permissions.get("deny"), list):
295
+ permissions["deny"] = [
296
+ e for e in permissions["deny"] if e not in _AUTONOMY_DENY
297
+ ]
298
+
299
+ mapify_meta = settings.get("mapify")
300
+ if isinstance(mapify_meta, dict):
301
+ mapify_meta.pop("autonomy", None)
302
+ if not mapify_meta:
303
+ settings.pop("mapify", None)
@@ -8,8 +8,11 @@ Never touches .claude/.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import json
11
12
  import shutil
13
+ from copy import deepcopy
12
14
  from pathlib import Path
15
+ from typing import Any
13
16
 
14
17
  from mapify_cli.delivery.file_copier import (
15
18
  _extract_requires_block,
@@ -20,7 +23,11 @@ from mapify_cli.delivery.file_copier import (
20
23
  _warn_requires_skills,
21
24
  get_templates_dir,
22
25
  )
23
- from mapify_cli.delivery.managed_file_copier import copy_managed_file
26
+ from mapify_cli.delivery.managed_file_copier import (
27
+ _assert_safe_dest,
28
+ _atomic_write,
29
+ copy_managed_file,
30
+ )
24
31
 
25
32
 
26
33
  def _install_managed_file(
@@ -81,6 +88,129 @@ def _copy_tree(
81
88
 
82
89
 
83
90
  _EXEC_SUFFIXES = frozenset((".py", ".sh"))
91
+ _CODEX_WORKFLOW_GATE_PATH = ".codex/hooks/workflow-gate.py"
92
+
93
+
94
+ def _is_codex_workflow_gate_hook(hook: Any) -> bool:
95
+ """Return True for MAP's managed Codex workflow-gate command hook."""
96
+ if not isinstance(hook, dict):
97
+ return False
98
+ command = hook.get("command")
99
+ return isinstance(command, str) and _CODEX_WORKFLOW_GATE_PATH in command
100
+
101
+
102
+ def _merge_codex_hook_entries(
103
+ existing_entries: Any,
104
+ template_entries: Any,
105
+ ) -> list[Any]:
106
+ """Merge MAP hook entries into existing Codex hook entries.
107
+
108
+ Existing project hooks are preserved. MAP-owned workflow-gate command hooks
109
+ are refreshed from the template and de-duplicated.
110
+ """
111
+ merged_entries: list[Any] = []
112
+ if isinstance(existing_entries, list):
113
+ for raw_entry in deepcopy(existing_entries):
114
+ if not isinstance(raw_entry, dict):
115
+ merged_entries.append(raw_entry)
116
+ continue
117
+
118
+ raw_hooks = raw_entry.get("hooks")
119
+ if not isinstance(raw_hooks, list):
120
+ merged_entries.append(raw_entry)
121
+ continue
122
+
123
+ cleaned_hooks = [
124
+ hook for hook in raw_hooks if not _is_codex_workflow_gate_hook(hook)
125
+ ]
126
+ if not cleaned_hooks and len(cleaned_hooks) != len(raw_hooks):
127
+ continue
128
+
129
+ raw_entry["hooks"] = cleaned_hooks
130
+ merged_entries.append(raw_entry)
131
+
132
+ if not isinstance(template_entries, list):
133
+ return merged_entries
134
+
135
+ for template_entry in template_entries:
136
+ if not isinstance(template_entry, dict):
137
+ if template_entry not in merged_entries:
138
+ merged_entries.append(deepcopy(template_entry))
139
+ continue
140
+
141
+ matcher = template_entry.get("matcher")
142
+ template_hooks = template_entry.get("hooks")
143
+ target = None
144
+ if isinstance(matcher, str) and isinstance(template_hooks, list):
145
+ for entry in merged_entries:
146
+ if (
147
+ isinstance(entry, dict)
148
+ and entry.get("matcher") == matcher
149
+ and isinstance(entry.get("hooks"), list)
150
+ ):
151
+ target = entry
152
+ break
153
+
154
+ if target is None:
155
+ if template_entry not in merged_entries:
156
+ merged_entries.append(deepcopy(template_entry))
157
+ continue
158
+
159
+ assert isinstance(template_hooks, list)
160
+ target_hooks = target["hooks"]
161
+ assert isinstance(target_hooks, list)
162
+ for hook in template_hooks:
163
+ if hook not in target_hooks:
164
+ target_hooks.append(deepcopy(hook))
165
+
166
+ return merged_entries
167
+
168
+
169
+ def _merge_codex_hooks_json(
170
+ existing_data: dict[str, Any] | None,
171
+ template_data: dict[str, Any],
172
+ ) -> dict[str, Any]:
173
+ """Return Codex-valid hooks.json containing only the top-level hooks key."""
174
+ existing_hooks = existing_data.get("hooks") if existing_data else None
175
+ template_hooks = template_data.get("hooks")
176
+
177
+ merged_hooks: dict[str, Any] = (
178
+ deepcopy(existing_hooks) if isinstance(existing_hooks, dict) else {}
179
+ )
180
+
181
+ if isinstance(template_hooks, dict):
182
+ for event_name, template_entries in template_hooks.items():
183
+ merged_hooks[event_name] = _merge_codex_hook_entries(
184
+ merged_hooks.get(event_name),
185
+ template_entries,
186
+ )
187
+
188
+ return {"hooks": merged_hooks}
189
+
190
+
191
+ def _load_json_object(path: Path) -> dict[str, Any] | None:
192
+ try:
193
+ data = json.loads(path.read_text(encoding="utf-8"))
194
+ except (OSError, json.JSONDecodeError):
195
+ return None
196
+ return data if isinstance(data, dict) else None
197
+
198
+
199
+ def _install_codex_hooks_json(src: Path, dst: Path) -> None:
200
+ """Install .codex/hooks.json without MAP metadata and merge project hooks."""
201
+ template_data = _load_json_object(src)
202
+ if template_data is None:
203
+ raise ValueError(f"Invalid Codex hooks template JSON: {src}")
204
+
205
+ dst.parent.mkdir(parents=True, exist_ok=True)
206
+
207
+ existing_data: dict[str, Any] | None = None
208
+ if dst.exists():
209
+ _assert_safe_dest(dst)
210
+ existing_data = _load_json_object(dst)
211
+
212
+ merged = _merge_codex_hooks_json(existing_data, template_data)
213
+ _atomic_write(dst, json.dumps(merged, indent=2, ensure_ascii=False) + "\n")
84
214
 
85
215
 
86
216
  def create_codex_files(project_path: Path) -> dict[str, int]:
@@ -96,8 +226,8 @@ def create_codex_files(project_path: Path) -> dict[str, int]:
96
226
 
97
227
  Watched files (skills, agents, config, AGENTS.md, hooks) are installed
98
228
  fence-aware so a re-install preserves any user content below the fence;
99
- hooks.json is JSON (fully-managed via _map_managed); .map/scripts is
100
- MAP-owned (fenced=False, skip-if-exists).
229
+ hooks.json is merged without MAP metadata because Codex validates top-level
230
+ keys strictly; .map/scripts is MAP-owned (fenced=False, skip-if-exists).
101
231
 
102
232
  Skips .map/scripts/ if the directory already exists.
103
233
  Never creates or modifies any .claude/ path.
@@ -186,12 +316,13 @@ def create_codex_files(project_path: Path) -> dict[str, int]:
186
316
 
187
317
  # ------------------------------------------------------------------
188
318
  # 4. Hooks (hooks.json + hooks/*.py)
189
- # hooks.json is JSON (fully-managed via _map_managed, no fence);
319
+ # hooks.json must remain Codex-schema-valid, so install it with a
320
+ # Codex-specific merge instead of the generic _map_managed JSON copier.
190
321
  # hooks/*.py are watched (fence-aware) with exec bits preserved.
191
322
  # ------------------------------------------------------------------
192
323
  hooks_json_src = codex_templates / "hooks.json"
193
324
  if hooks_json_src.exists():
194
- _install_managed_file(hooks_json_src, codex_dir / "hooks.json", version)
325
+ _install_codex_hooks_json(hooks_json_src, codex_dir / "hooks.json")
195
326
  counts["hooks"] += 1
196
327
 
197
328
  hooks_dir_src = codex_templates / "hooks"
@@ -501,6 +501,13 @@ BLUEPRINT_SCHEMA = {
501
501
  "additionalProperties": True,
502
502
  },
503
503
  },
504
+ # Forward-coverage source-of-truth: the authoritative list of requirement
505
+ # IDs lives in the spec's Requirements Index (the mapify:requirements-index:v1
506
+ # block, parsed by parse_requirements_index in map_step_runner). The
507
+ # decomposition-completeness gate diffs that index against these coverage_map
508
+ # keys. Acceptance criteria are deliberately NOT stored as a blueprint field
509
+ # (the decomposer cannot be trusted to declare the set it is checked against);
510
+ # coverage_map remains a mapping of those spec IDs to owning subtasks only.
504
511
  "coverage_map": {
505
512
  "type": "object",
506
513
  "description": (
@@ -802,10 +809,15 @@ ARTIFACT_MANIFEST_SCHEMA = {
802
809
  "spec": ARTIFACT_STAGE_SCHEMA,
803
810
  "plan": ARTIFACT_STAGE_SCHEMA,
804
811
  "test_contract": ARTIFACT_STAGE_SCHEMA,
812
+ "repro_probe": ARTIFACT_STAGE_SCHEMA,
805
813
  "implementation": ARTIFACT_STAGE_SCHEMA,
806
814
  "review": ARTIFACT_STAGE_SCHEMA,
807
815
  "verification": ARTIFACT_STAGE_SCHEMA,
808
816
  "retry_quarantine": ARTIFACT_STAGE_SCHEMA,
817
+ "flaky_test_triage": ARTIFACT_STAGE_SCHEMA,
818
+ "qualitative_convergence": ARTIFACT_STAGE_SCHEMA,
819
+ "anti_repeat": ARTIFACT_STAGE_SCHEMA,
820
+ "escalation": ARTIFACT_STAGE_SCHEMA,
809
821
  "token_budget": ARTIFACT_STAGE_SCHEMA,
810
822
  "run_health": ARTIFACT_STAGE_SCHEMA,
811
823
  "learn_handoff": ARTIFACT_STAGE_SCHEMA,
@@ -957,6 +969,101 @@ RETRY_QUARANTINE_SCHEMA = {
957
969
  }
958
970
 
959
971
 
972
+ FLAKY_TEST_TRIAGE_EVIDENCE_SCHEMA = {
973
+ "type": "object",
974
+ "properties": {
975
+ "run": {"type": "integer", "minimum": 1},
976
+ "status": {"type": "string", "enum": ["passed", "failed"]},
977
+ "exit_code": {"type": "integer"},
978
+ "summary": {"type": "string"},
979
+ "timed_out": {"type": "boolean"},
980
+ "duration_seconds": {"type": "number", "minimum": 0},
981
+ "stdout_tail": {"type": "string"},
982
+ "stderr_tail": {"type": "string"},
983
+ },
984
+ "required": ["run", "status", "exit_code", "summary"],
985
+ "additionalProperties": False,
986
+ }
987
+
988
+
989
+ FLAKY_TEST_TRIAGE_ENTRY_SCHEMA = {
990
+ "type": "object",
991
+ "properties": {
992
+ "check_id": {"type": "string"},
993
+ "command": {"type": "string"},
994
+ "reason": {"type": "string"},
995
+ "run_count": {"type": "integer", "minimum": 1},
996
+ "pass_count": {"type": "integer", "minimum": 0},
997
+ "fail_count": {"type": "integer", "minimum": 0},
998
+ "outcome_sequence": {
999
+ "type": "array",
1000
+ "items": {"type": "string", "enum": ["passed", "failed"]},
1001
+ "minItems": 1,
1002
+ },
1003
+ "disposition": {
1004
+ "type": "string",
1005
+ "enum": [
1006
+ "deferred_nondeterministic",
1007
+ "deterministic_failure",
1008
+ "not_reproduced",
1009
+ "insufficient_evidence",
1010
+ ],
1011
+ },
1012
+ "recommended_next_action": {"type": "string"},
1013
+ "monitor_verdict_policy": {
1014
+ "type": "string",
1015
+ "enum": ["not_valid_without_explicit_triage"],
1016
+ },
1017
+ "operator_requirements": {
1018
+ "type": "array",
1019
+ "items": {"type": "string"},
1020
+ "minItems": 1,
1021
+ },
1022
+ "evidence": {
1023
+ "type": "array",
1024
+ "items": FLAKY_TEST_TRIAGE_EVIDENCE_SCHEMA,
1025
+ "minItems": 1,
1026
+ },
1027
+ },
1028
+ "required": [
1029
+ "check_id",
1030
+ "command",
1031
+ "reason",
1032
+ "run_count",
1033
+ "pass_count",
1034
+ "fail_count",
1035
+ "outcome_sequence",
1036
+ "disposition",
1037
+ "recommended_next_action",
1038
+ "monitor_verdict_policy",
1039
+ "operator_requirements",
1040
+ "evidence",
1041
+ ],
1042
+ "additionalProperties": False,
1043
+ }
1044
+
1045
+
1046
+ FLAKY_TEST_TRIAGE_SCHEMA = {
1047
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1048
+ "$id": "https://mapframework.dev/schemas/flaky-test-triage.json",
1049
+ "title": "MAP Flaky Test Triage",
1050
+ "description": "Repeated check evidence stored in .map/<branch>/flaky_test_triage.json",
1051
+ "type": "object",
1052
+ "properties": {
1053
+ "schema_version": {"type": "string"},
1054
+ "branch": {"type": "string"},
1055
+ "updated_at": {"type": "string", "format": "date-time"},
1056
+ "triages": {
1057
+ "type": "array",
1058
+ "items": FLAKY_TEST_TRIAGE_ENTRY_SCHEMA,
1059
+ "minItems": 1,
1060
+ },
1061
+ },
1062
+ "required": ["schema_version", "branch", "updated_at", "triages"],
1063
+ "additionalProperties": False,
1064
+ }
1065
+
1066
+
960
1067
  TEST_HANDOFF_SCHEMA = {
961
1068
  "$schema": "https://json-schema.org/draft/2020-12/schema",
962
1069
  "$id": "https://mapframework.dev/schemas/test-handoff.json",
@@ -489,6 +489,16 @@ exhaustive test matrices by default.
489
489
  - [ ] When using training data for unfamiliar patterns, tag with `[training-data]` in Approach section
490
490
  - [ ] Tag verified sources: `[code: path/to/file.py:line]`, `[training-data]`
491
491
 
492
+ ### Qualitative Self-Review Convergence (Opt-In Only)
493
+ - [ ] If the caller explicitly requests self-review convergence, treat this
494
+ checklist run as one bounded pass and return concrete evidence for every
495
+ `clean=true` claim.
496
+ - [ ] `clean` means no critical findings in this pass, not proof of correctness.
497
+ If you find a blocker, report it as a critical finding; do not soften it to
498
+ help the convergence loop finish.
499
+ - [ ] On pass N>1, verify prior critical findings are resolved before looking
500
+ for new regressions.
501
+
492
502
  ### SFT Comfort Zone (Token Discipline)
493
503
  - [ ] Each function/method body stays within ~100 lines (~4000 tokens)
494
504
  - [ ] If a function exceeds this: split into sub-functions with their own inline contracts
@@ -766,6 +776,7 @@ Follow this protocol exactly — do not infer "how seniors write" or add stylist
766
776
  4. **Intent comments**: Add a one-line `# Intent: <why>` comment above any non-obvious logic block. Do NOT comment obvious code.
767
777
  5. **Performance**: Clarity first, optimize only if proven necessary.
768
778
  6. **Imports**: Group by stdlib → third-party → local. One blank line between groups.
779
+ 7. **No internal workflow IDs in comments or strings**: NEVER write MAP-internal workflow identifiers — subtask `ST-001`, acceptance criteria `AC-3`, verification criteria `VC1`, invariants `INV-7`, hard constraints `HC-1` — into shipped code comments or string literals. They are workflow scaffolding, not user-facing documentation. State the *reason* without the ID (`# enforce single-writer invariant`, not `# INV-7 single writer`). The one exception is the transient `test_vc<n>_*` test-naming aid described above: keep it during the run — the framework strips the `vc<n>` segment from shipped tests automatically at completion.
769
780
 
770
781
  ## Error Handling Patterns
771
782