mapify-cli 3.17.1__tar.gz → 3.19.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 (427) hide show
  1. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/PKG-INFO +14 -4
  2. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/README.md +12 -3
  3. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/pyproject.toml +8 -2
  4. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/__init__.py +23 -3
  5. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/mcp.py +0 -3
  6. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/project_config.py +48 -5
  7. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/settings.py +135 -2
  8. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/codex_copier.py +136 -5
  9. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/schemas.py +111 -0
  10. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/.gitignore +3 -0
  11. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/actor.md +10 -37
  12. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +4 -2
  13. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/monitor.md +16 -88
  14. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +16 -2
  15. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +92 -0
  16. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +26 -3
  17. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/post-compact-context.py +28 -0
  18. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +35 -0
  19. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +61 -0
  20. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +114 -7
  21. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +456 -14
  22. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +3775 -263
  23. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/escalation-matrix.md +28 -3
  24. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +57 -9
  25. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +14 -8
  26. mapify_cli-3.19.0/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +500 -0
  27. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +25 -3
  28. mapify_cli-3.19.0/src/mapify_cli/templates/skills/map-plan/plan-reference.md +176 -0
  29. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/.gitignore.jinja +3 -0
  30. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +10 -37
  31. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +4 -2
  32. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +16 -88
  33. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +16 -2
  34. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +92 -0
  35. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +26 -3
  36. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +28 -0
  37. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +35 -0
  38. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +61 -0
  39. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +114 -7
  40. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +456 -14
  41. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +3775 -263
  42. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +28 -3
  43. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +57 -9
  44. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +14 -8
  45. mapify_cli-3.19.0/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +500 -0
  46. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +25 -3
  47. mapify_cli-3.19.0/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +176 -0
  48. mapify_cli-3.19.0/src/mapify_cli/tool_output_offload.py +524 -0
  49. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/fixtures/claude/escalation-matrix.md +28 -3
  50. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_safety_guardrails.py +102 -0
  51. mapify_cli-3.19.0/tests/test_agent_dispatch_audit.py +92 -0
  52. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_artifact_schemas.py +82 -0
  53. mapify_cli-3.19.0/tests/test_compaction_offload_integration.py +145 -0
  54. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_decomposition.py +248 -3
  55. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_orchestrator.py +276 -0
  56. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_step_runner.py +2677 -18
  57. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_mapify_cli.py +217 -3
  58. mapify_cli-3.19.0/tests/test_prompt_layering.py +248 -0
  59. mapify_cli-3.19.0/tests/test_pyyaml_dep.py +95 -0
  60. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills.py +228 -1
  61. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_template_render.py +152 -4
  62. mapify_cli-3.19.0/tests/test_tool_output_offload.py +338 -0
  63. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_context_injector.py +139 -0
  64. mapify_cli-3.17.1/src/mapify_cli/templates/agents/debate-arbiter.md +0 -953
  65. mapify_cli-3.17.1/src/mapify_cli/templates/agents/synthesizer.md +0 -1066
  66. mapify_cli-3.17.1/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -259
  67. mapify_cli-3.17.1/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -104
  68. mapify_cli-3.17.1/src/mapify_cli/templates_src/agents/debate-arbiter.md.jinja +0 -953
  69. mapify_cli-3.17.1/src/mapify_cli/templates_src/agents/synthesizer.md.jinja +0 -1066
  70. mapify_cli-3.17.1/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -259
  71. mapify_cli-3.17.1/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -104
  72. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/.claude/hooks/README.md +0 -0
  73. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/.claude/skills/README.md +0 -0
  74. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/.gitignore +0 -0
  75. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/LICENSE +0 -0
  76. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/_locking.py +0 -0
  77. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/cli_ui.py +0 -0
  78. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/__init__.py +0 -0
  79. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/__init__.py +0 -0
  80. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
  81. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/file_copier.py +0 -0
  82. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
  83. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/providers.py +0 -0
  84. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
  85. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/dependency_graph.py +0 -0
  86. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/intent_detector.py +0 -0
  87. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/__init__.py +0 -0
  88. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/capture.py +0 -0
  89. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/digest_schema.py +0 -0
  90. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/finalize.py +0 -0
  91. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/recall.py +0 -0
  92. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/minimality_report.py +0 -0
  93. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/ralph_state.py +0 -0
  94. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/repo_insight.py +0 -0
  95. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/research_eval.py +0 -0
  96. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skill_ir.py +0 -0
  97. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
  98. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  99. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  100. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
  101. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  102. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  103. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  104. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
  105. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/runner.py +0 -0
  106. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
  107. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
  108. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  109. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  110. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
  111. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
  112. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  113. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  114. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
  115. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  116. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
  117. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  118. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/config.toml +0 -0
  119. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
  120. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
  121. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  122. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  123. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  124. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
  125. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/README.md +0 -0
  126. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
  127. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
  128. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  129. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
  130. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
  131. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
  132. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
  133. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
  134. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
  135. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
  136. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
  137. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  138. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  139. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  140. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
  141. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  142. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  143. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  144. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  145. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  146. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  147. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  148. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  149. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  150. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
  151. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
  152. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  153. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  154. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  155. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  156. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  157. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  158. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  159. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/settings.json +0 -0
  160. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/README.md +0 -0
  161. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  162. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  163. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  164. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  165. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  166. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  167. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  168. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  169. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  170. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
  171. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  172. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  173. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
  174. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
  175. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  176. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  177. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  178. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  179. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  180. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  181. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  182. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  183. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  184. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  185. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  186. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  187. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  188. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  189. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
  190. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
  191. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  192. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
  193. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  194. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  195. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  196. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  197. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  198. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  199. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  200. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
  201. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  202. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
  203. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  204. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
  205. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
  206. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  207. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  208. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  209. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  210. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
  211. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
  212. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
  213. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
  214. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  215. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
  216. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
  217. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
  218. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
  219. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
  220. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
  221. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
  222. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
  223. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  224. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  225. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  226. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
  227. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  228. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  229. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  230. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  231. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  232. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  233. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  234. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  235. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  236. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
  237. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  238. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  239. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  240. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  241. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  242. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  243. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  244. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  245. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
  246. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  247. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  248. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  249. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  250. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  251. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  252. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  253. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  254. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  255. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  256. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
  257. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  258. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  259. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
  260. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
  261. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  262. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  263. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  264. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  265. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  266. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  267. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  268. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  269. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  270. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  271. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  272. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  273. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  274. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  275. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
  276. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
  277. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  278. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  279. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/token_budget.py +0 -0
  280. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/tools/__init__.py +0 -0
  281. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  282. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/verification_recorder.py +0 -0
  283. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/workflow_finalizer.py +0 -0
  284. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/workflow_logger.py +0 -0
  285. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/workflow_state.py +0 -0
  286. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/__init__.py +0 -0
  287. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/conftest.py +0 -0
  288. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/fixtures/codex/config.toml +0 -0
  289. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  290. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_end_of_turn.py +0 -0
  291. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_hook_inventory_smoke.py +0 -0
  292. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/__init__.py +0 -0
  293. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/blueprint.json +0 -0
  294. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/code_review.md +0 -0
  295. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/plan_handoff.json +0 -0
  296. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/spec.md +0 -0
  297. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
  298. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  299. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/task_plan.md +0 -0
  300. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/verification_summary.md +0 -0
  301. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  302. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
  303. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/README.md +0 -0
  304. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  305. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  306. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  307. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  308. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  309. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  310. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  311. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  312. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  313. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  314. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  315. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  316. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  317. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  318. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  319. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  320. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  321. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  322. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  323. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  324. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  325. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  326. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  327. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  328. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  329. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  330. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  331. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  332. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  333. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  334. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  335. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  336. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  337. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  338. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  339. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  340. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  341. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  342. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  343. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  344. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  345. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  346. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  347. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  348. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  349. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  350. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  351. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  352. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  353. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  354. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  355. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  356. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  357. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  358. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  359. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  360. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  361. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  362. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  363. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  364. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  365. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  366. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  367. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  368. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  369. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  370. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  371. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  372. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  373. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  374. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  375. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  376. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_agent_cli_correctness.py +0 -0
  377. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_agent_frontmatter.py +0 -0
  378. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_bump_version.py +0 -0
  379. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_dependency_graph.py +0 -0
  380. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_diagnostics.py +0 -0
  381. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_digest_schema.py +0 -0
  382. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_file_copier.py +0 -0
  383. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_hook_patterns.py +0 -0
  384. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_init_import_graph.py +0 -0
  385. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_intent_detector.py +0 -0
  386. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  387. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_jinja2_dep.py +0 -0
  388. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_locking.py +0 -0
  389. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_managed_file_copier.py +0 -0
  390. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_token_meter.py +0 -0
  391. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_utils_sanitize.py +0 -0
  392. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_capture.py +0 -0
  393. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_finalize.py +0 -0
  394. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_integration.py +0 -0
  395. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_recall.py +0 -0
  396. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_review_fixes.py +0 -0
  397. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_minimality_report.py +0 -0
  398. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_post_compact_context.py +0 -0
  399. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_ralph_hooks.py +0 -0
  400. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_ralph_state.py +0 -0
  401. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_repo_insight.py +0 -0
  402. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_research_eval.py +0 -0
  403. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_schemas.py +0 -0
  404. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skill_ir.py +0 -0
  405. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_consistency.py +0 -0
  406. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_aggregator.py +0 -0
  407. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_apply.py +0 -0
  408. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_cli_optimize.py +0 -0
  409. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
  410. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  411. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_fixtures.py +0 -0
  412. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_optimizer.py +0 -0
  413. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  414. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_proposer.py +0 -0
  415. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_runner.py +0 -0
  416. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_schema.py +0 -0
  417. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_viewer.py +0 -0
  418. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_sofa_client.py +0 -0
  419. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_sofa_search.py +0 -0
  420. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_token_budget.py +0 -0
  421. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_validate_dependencies.py +0 -0
  422. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_validate_spec_citations.py +0 -0
  423. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_verification_recorder.py +0 -0
  424. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_finalizer.py +0 -0
  425. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_gate.py +0 -0
  426. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_logger.py +0 -0
  427. {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_state.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapify-cli
3
- Version: 3.17.1
3
+ Version: 3.19.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
@@ -11,6 +11,7 @@ Requires-Python: >=3.11
11
11
  Requires-Dist: httpx>=0.25.0
12
12
  Requires-Dist: jinja2<4,>=3.1
13
13
  Requires-Dist: platformdirs>=4.0.0
14
+ Requires-Dist: pyyaml>=6.0.0
14
15
  Requires-Dist: questionary>=2.0.0
15
16
  Requires-Dist: readchar>=4.0.0
16
17
  Requires-Dist: rich>=13.0.0
@@ -249,10 +250,10 @@ MAP is inspired by the [MAP cognitive architecture](https://github.com/Shanka123
249
250
 
250
251
  ```yaml
251
252
  # .map/config.yaml
252
- minimality: lite # new installs default to lite; existing repos without the key stay off
253
+ minimality: lite # default for ALL projects incl. keyless configs (#183); set 'off' to opt out
253
254
  ```
254
255
 
255
- Allowed values: `off`, `lite`, `full`, `ultra`. Phase 1 ships conservative `lite` defaults: Actor prefers the fewest moving parts, Monitor blocks scope drift only when it affects required behavior, and Evaluator scores simplicity without letting it hide missing required work. `/map-review` also adds an advisory what-to-delete lens when minimality is not `off`; its `net: -N` estimate is informational, not a gate. In `full`/`ultra`, the decomposer may place speculative omissions in `blueprint.deferred_yagni`; those items must be shown during plan approval and can be restored before execution with `python3 .map/scripts/map_orchestrator.py restore_deferred_yagni YG-NNN`. Maintainers can inspect local rollout readiness with `mapify minimality-report --json`, which compares complete `off` and opt-in run-health samples before considering the Phase 3 default flip, reports missing sample gaps and cohort branch names, lists the next telemetry actions, and emits a candidate-only `manual_review_gate` with opt-in branches plus a clarity/underscope checklist before promotion.
256
+ Allowed values: `off`, `lite`, `full`, `ultra`. The global default is `lite` (Phase 3 flip, #183 — keyless configs included; set `off` to opt out). `lite` is conservative: Actor prefers the fewest moving parts, Monitor blocks scope drift only when it affects required behavior, and Evaluator scores simplicity without letting it hide missing required work. `/map-review` also adds an advisory what-to-delete lens when minimality is not `off`; its `net: -N` estimate is informational, not a gate. In `full`/`ultra`, the decomposer may place speculative omissions in `blueprint.deferred_yagni`; those items must be shown during plan approval and can be restored before execution with `python3 .map/scripts/map_orchestrator.py restore_deferred_yagni YG-NNN`. Maintainers can still inspect local rollout telemetry with `mapify minimality-report --json`, which compares complete `off` and opt-in run-health cohorts, reports sample gaps and cohort branch names, lists next telemetry actions, and emits a candidate-only `manual_review_gate` with opt-in branches plus a clarity/underscope checklist.
256
257
 
257
258
  **Context-compression policy** (controls the `/compact` nudge; default `never` — opt-in):
258
259
 
@@ -263,7 +264,7 @@ mapify init . --compression aggressive # nudge at 0.4 x threshold
263
264
  mapify init . --compression-threshold 250000 # Opus 1M / 50+ subtask plans
264
265
  ```
265
266
 
266
- Actor and reviewer prompts always carry the full bundled context — context-block truncation was removed. If the conversation grows beyond your model's window, opt into `/compact` via `--compression auto` or trigger it manually. See [docs/USAGE.md#context-budget-policy](docs/USAGE.md).
267
+ Actor and reviewer prompts always carry the full bundled context — context-block truncation was removed. If the conversation grows beyond your model's window, opt into `/compact` via `--compression auto` or trigger it manually. When a policy other than `never` is active, MAP also offloads large tool outputs (grep/test/file-read results) to `.map/<branch>/compacted/` before `/compact` drops them, so a dropped output is re-read from its sidecar instead of re-running broad discovery (these sidecars can hold secrets — they are `0o600` and self-ignored from git; never push `.map/`). See [docs/USAGE.md#context-budget-policy](docs/USAGE.md).
267
268
 
268
269
  **Stack Overflow for Agents (SOFA)** read-only prior-art search — **off by default**, no network or credentials unless you enable it:
269
270
 
@@ -273,6 +274,15 @@ mapify init . --sofa # opt-in: enable the map-so-search skill
273
274
 
274
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).
275
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
+
276
286
  </details>
277
287
 
278
288
  ## Documentation
@@ -205,10 +205,10 @@ MAP is inspired by the [MAP cognitive architecture](https://github.com/Shanka123
205
205
 
206
206
  ```yaml
207
207
  # .map/config.yaml
208
- minimality: lite # new installs default to lite; existing repos without the key stay off
208
+ minimality: lite # default for ALL projects incl. keyless configs (#183); set 'off' to opt out
209
209
  ```
210
210
 
211
- Allowed values: `off`, `lite`, `full`, `ultra`. Phase 1 ships conservative `lite` defaults: Actor prefers the fewest moving parts, Monitor blocks scope drift only when it affects required behavior, and Evaluator scores simplicity without letting it hide missing required work. `/map-review` also adds an advisory what-to-delete lens when minimality is not `off`; its `net: -N` estimate is informational, not a gate. In `full`/`ultra`, the decomposer may place speculative omissions in `blueprint.deferred_yagni`; those items must be shown during plan approval and can be restored before execution with `python3 .map/scripts/map_orchestrator.py restore_deferred_yagni YG-NNN`. Maintainers can inspect local rollout readiness with `mapify minimality-report --json`, which compares complete `off` and opt-in run-health samples before considering the Phase 3 default flip, reports missing sample gaps and cohort branch names, lists the next telemetry actions, and emits a candidate-only `manual_review_gate` with opt-in branches plus a clarity/underscope checklist before promotion.
211
+ Allowed values: `off`, `lite`, `full`, `ultra`. The global default is `lite` (Phase 3 flip, #183 — keyless configs included; set `off` to opt out). `lite` is conservative: Actor prefers the fewest moving parts, Monitor blocks scope drift only when it affects required behavior, and Evaluator scores simplicity without letting it hide missing required work. `/map-review` also adds an advisory what-to-delete lens when minimality is not `off`; its `net: -N` estimate is informational, not a gate. In `full`/`ultra`, the decomposer may place speculative omissions in `blueprint.deferred_yagni`; those items must be shown during plan approval and can be restored before execution with `python3 .map/scripts/map_orchestrator.py restore_deferred_yagni YG-NNN`. Maintainers can still inspect local rollout telemetry with `mapify minimality-report --json`, which compares complete `off` and opt-in run-health cohorts, reports sample gaps and cohort branch names, lists next telemetry actions, and emits a candidate-only `manual_review_gate` with opt-in branches plus a clarity/underscope checklist.
212
212
 
213
213
  **Context-compression policy** (controls the `/compact` nudge; default `never` — opt-in):
214
214
 
@@ -219,7 +219,7 @@ mapify init . --compression aggressive # nudge at 0.4 x threshold
219
219
  mapify init . --compression-threshold 250000 # Opus 1M / 50+ subtask plans
220
220
  ```
221
221
 
222
- Actor and reviewer prompts always carry the full bundled context — context-block truncation was removed. If the conversation grows beyond your model's window, opt into `/compact` via `--compression auto` or trigger it manually. See [docs/USAGE.md#context-budget-policy](docs/USAGE.md).
222
+ Actor and reviewer prompts always carry the full bundled context — context-block truncation was removed. If the conversation grows beyond your model's window, opt into `/compact` via `--compression auto` or trigger it manually. When a policy other than `never` is active, MAP also offloads large tool outputs (grep/test/file-read results) to `.map/<branch>/compacted/` before `/compact` drops them, so a dropped output is re-read from its sidecar instead of re-running broad discovery (these sidecars can hold secrets — they are `0o600` and self-ignored from git; never push `.map/`). See [docs/USAGE.md#context-budget-policy](docs/USAGE.md).
223
223
 
224
224
  **Stack Overflow for Agents (SOFA)** read-only prior-art search — **off by default**, no network or credentials unless you enable it:
225
225
 
@@ -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.17.1"
3
+ version = "3.19.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"
@@ -12,7 +12,13 @@ dependencies = [
12
12
  "jinja2>=3.1,<4",
13
13
  "platformdirs>=4.0.0",
14
14
  "readchar>=4.0.0",
15
- "questionary>=2.0.0"
15
+ "questionary>=2.0.0",
16
+ # mapify is a config-driven CLI: project_config.py loads .map/config.yaml via
17
+ # PyYAML on every config-dependent path (minimality-report, init overrides).
18
+ # It MUST be a hard runtime dep — a normal install (uv tool / pipx / pip
19
+ # without dev/test extras) otherwise ships without yaml, hits ImportError,
20
+ # and silently falls back to default config, ignoring the user's settings (#245).
21
+ "pyyaml>=6.0.0"
16
22
  ]
17
23
 
18
24
  [project.optional-dependencies]
@@ -23,7 +23,7 @@ Or install globally:
23
23
  mapify check
24
24
  """
25
25
 
26
- __version__ = "3.17.1"
26
+ __version__ = "3.19.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)
@@ -23,8 +23,6 @@ def create_mcp_config(project_path: Path, mcp_servers: List[str]) -> None:
23
23
  "evaluator": [],
24
24
  "reflector": [],
25
25
  "documentation-reviewer": [],
26
- "debate-arbiter": [],
27
- "synthesizer": [],
28
26
  "research-agent": [],
29
27
  "final-verifier": [],
30
28
  },
@@ -62,7 +60,6 @@ def create_mcp_config(project_path: Path, mcp_servers: List[str]) -> None:
62
60
  "monitor",
63
61
  "evaluator",
64
62
  "reflector",
65
- "debate-arbiter",
66
63
  ]:
67
64
  if agent in config["agent_mcp_mappings"]:
68
65
  config["agent_mcp_mappings"][agent].append("sequential-thinking")
@@ -16,6 +16,7 @@ except ImportError:
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
18
  VALID_MINIMALITY = frozenset({"off", "lite", "full", "ultra"})
19
+ VALID_PROMPT_LAYERING = frozenset({"docs_first", "stable_first"})
19
20
 
20
21
 
21
22
  @dataclass
@@ -79,9 +80,22 @@ class MapConfig:
79
80
  # Language preference for agent responses
80
81
  language: str = ""
81
82
 
82
- # Minimality doctrine intensity. Existing projects that have no config key
83
- # stay off; new generated configs opt into lite explicitly.
84
- minimality: str = "off"
83
+ # Minimality doctrine intensity. Phase 3 (#183) flipped the global default
84
+ # off -> lite after the promotion gate (`mapify minimality-report`) reached
85
+ # `candidate` and the manual review gate passed: projects with no config key
86
+ # now default to `lite` (advisory complexity-lens; no behavior/verdict gating).
87
+ minimality: str = "lite"
88
+
89
+ # Agent-prompt layering for repeated same-workflow dispatches (#231).
90
+ # "docs_first" (default) = variable <documents> first, stable contract
91
+ # last — optimized for recency / "lost-in-the-middle".
92
+ # "stable_first" = stable contract first, variable <documents> last — a
93
+ # byte-identical prefix across same-role dispatches. Resolved
94
+ # cache-neutral at the Claude Code Task layer (the harness owns
95
+ # cache_control and the seam is mid-block), but NOT a behavior
96
+ # no-op: it changes token order / attention. Kept opt-in; never
97
+ # remapped to docs_first. See docs/ARCHITECTURE.md (#231).
98
+ prompt_layering: str = "docs_first"
85
99
 
86
100
  # Context compression policy (see docs/context-compression-plan.md)
87
101
  # "never" = never inject /compact nudge (default — user opts in by
@@ -167,6 +181,15 @@ def load_map_config(project_path: Path) -> MapConfig:
167
181
  if isinstance(data, dict) and "sofa.enabled" in data and "sofa_enabled" not in data:
168
182
  data["sofa_enabled"] = data.pop("sofa.enabled")
169
183
 
184
+ # YAML 1.1 parses bare ``off``/``on`` as booleans, so ``minimality: off``
185
+ # — the documented opt-out from the lite default (#183) — arrives as bool
186
+ # ``False``. Coerce it back to the string level before the type-check loop;
187
+ # otherwise the str field rejects the bool and silently falls back to the
188
+ # lite default, breaking opt-out. ``False`` -> ``"off"`` (valid opt-out);
189
+ # ``True`` -> ``"on"`` (not a real level -> rejected -> lite fallback).
190
+ if isinstance(data, dict) and isinstance(data.get("minimality"), bool):
191
+ data["minimality"] = "off" if data["minimality"] is False else "on"
192
+
170
193
  # Map YAML keys to MapConfig fields, filtering out unrecognized keys
171
194
  # and validating types against dataclass field annotations
172
195
  defaults = MapConfig()
@@ -216,12 +239,22 @@ def load_map_config(project_path: Path) -> MapConfig:
216
239
  if cfg.minimality not in VALID_MINIMALITY:
217
240
  logger.warning(
218
241
  "Invalid minimality %r in %s (expected one of %s). "
219
- "Using default 'off'.",
242
+ "Using default 'lite'.",
220
243
  cfg.minimality,
221
244
  config_file,
222
245
  ", ".join(sorted(VALID_MINIMALITY)),
223
246
  )
224
- cfg.minimality = "off"
247
+ cfg.minimality = "lite"
248
+
249
+ if cfg.prompt_layering not in VALID_PROMPT_LAYERING:
250
+ logger.warning(
251
+ "Invalid prompt_layering %r in %s (expected one of %s). "
252
+ "Using default 'docs_first'.",
253
+ cfg.prompt_layering,
254
+ config_file,
255
+ ", ".join(sorted(VALID_PROMPT_LAYERING)),
256
+ )
257
+ cfg.prompt_layering = "docs_first"
225
258
 
226
259
  return cfg
227
260
 
@@ -317,6 +350,16 @@ profile: full
317
350
  # Allowed: off, lite, full, ultra
318
351
  minimality: lite
319
352
 
353
+ # Agent-prompt layering for repeated same-workflow dispatches (#231).
354
+ # "docs_first" (default) orders the variable <documents> first and the stable
355
+ # task/instructions/expected_output contract last — best for recency/attention.
356
+ # "stable_first" puts the stable contract first (byte-identical prefix across
357
+ # same-role dispatches). Resolved cache-neutral at the Claude Code Task layer
358
+ # (harness owns cache_control; the seam is mid-block) but it still changes token
359
+ # order/attention, so it is kept opt-in — see docs/ARCHITECTURE.md (#231).
360
+ # Allowed: docs_first, stable_first
361
+ # prompt_layering: docs_first
362
+
320
363
  # Context compression policy. Default is "never" — the /compact nudge is
321
364
  # opt-in. Uncomment and switch to "auto" or "aggressive" if you want the
322
365
  # meter to interrupt long workflows and ask Claude to compact.
@@ -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"