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.
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/PKG-INFO +14 -4
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/README.md +12 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/pyproject.toml +8 -2
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/__init__.py +23 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/mcp.py +0 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/project_config.py +48 -5
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/settings.py +135 -2
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/codex_copier.py +136 -5
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/schemas.py +111 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/.gitignore +3 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/actor.md +10 -37
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +4 -2
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/monitor.md +16 -88
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +16 -2
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +92 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +26 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/post-compact-context.py +28 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +35 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +61 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +114 -7
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +456 -14
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +3775 -263
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/escalation-matrix.md +28 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +57 -9
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +14 -8
- mapify_cli-3.19.0/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +500 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +25 -3
- mapify_cli-3.19.0/src/mapify_cli/templates/skills/map-plan/plan-reference.md +176 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/.gitignore.jinja +3 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +10 -37
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +4 -2
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +16 -88
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +16 -2
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +26 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +28 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +35 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +61 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +114 -7
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +456 -14
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +3775 -263
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +28 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +57 -9
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +14 -8
- mapify_cli-3.19.0/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +500 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +25 -3
- mapify_cli-3.19.0/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +176 -0
- mapify_cli-3.19.0/src/mapify_cli/tool_output_offload.py +524 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/fixtures/claude/escalation-matrix.md +28 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_safety_guardrails.py +102 -0
- mapify_cli-3.19.0/tests/test_agent_dispatch_audit.py +92 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_artifact_schemas.py +82 -0
- mapify_cli-3.19.0/tests/test_compaction_offload_integration.py +145 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_decomposition.py +248 -3
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_orchestrator.py +276 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_step_runner.py +2677 -18
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_mapify_cli.py +217 -3
- mapify_cli-3.19.0/tests/test_prompt_layering.py +248 -0
- mapify_cli-3.19.0/tests/test_pyyaml_dep.py +95 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills.py +228 -1
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_template_render.py +152 -4
- mapify_cli-3.19.0/tests/test_tool_output_offload.py +338 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_context_injector.py +139 -0
- mapify_cli-3.17.1/src/mapify_cli/templates/agents/debate-arbiter.md +0 -953
- mapify_cli-3.17.1/src/mapify_cli/templates/agents/synthesizer.md +0 -1066
- mapify_cli-3.17.1/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -259
- mapify_cli-3.17.1/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -104
- mapify_cli-3.17.1/src/mapify_cli/templates_src/agents/debate-arbiter.md.jinja +0 -953
- mapify_cli-3.17.1/src/mapify_cli/templates_src/agents/synthesizer.md.jinja +0 -1066
- mapify_cli-3.17.1/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -259
- mapify_cli-3.17.1/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -104
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/.claude/hooks/README.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/.claude/skills/README.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/.gitignore +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/LICENSE +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/_locking.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/cli_ui.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/config/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/file_copier.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/providers.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/dependency_graph.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/intent_detector.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/capture.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/digest_schema.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/finalize.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/memory/recall.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/minimality_report.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/ralph_state.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/repo_insight.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/research_eval.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skill_ir.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/runner.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/config.toml +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/README.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/settings.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/README.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/token_budget.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/tools/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/verification_recorder.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/workflow_finalizer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/workflow_logger.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/src/mapify_cli/workflow_state.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/conftest.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/fixtures/codex/config.toml +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_end_of_turn.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/hooks/test_hook_inventory_smoke.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/__init__.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/blueprint.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/code_review.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/plan_handoff.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/spec.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/task_plan.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/fixtures/verification_summary.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/README.md +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_agent_cli_correctness.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_agent_frontmatter.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_bump_version.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_dependency_graph.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_diagnostics.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_digest_schema.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_file_copier.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_hook_patterns.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_init_import_graph.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_intent_detector.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_jinja2_dep.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_locking.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_managed_file_copier.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_token_meter.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_map_utils_sanitize.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_capture.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_finalize.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_integration.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_recall.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_memory_review_fixes.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_minimality_report.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_post_compact_context.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_ralph_hooks.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_ralph_state.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_repo_insight.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_research_eval.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_schemas.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skill_ir.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_consistency.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_aggregator.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_apply.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_cli_optimize.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_fixtures.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_optimizer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_proposer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_runner.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_schema.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_skills_eval_viewer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_sofa_client.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_sofa_search.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_token_budget.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_validate_dependencies.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_validate_spec_citations.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_verification_recorder.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_finalizer.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_gate.py +0 -0
- {mapify_cli-3.17.1 → mapify_cli-3.19.0}/tests/test_workflow_logger.py +0 -0
- {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.
|
|
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 #
|
|
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
|
|
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 #
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
83
|
-
#
|
|
84
|
-
|
|
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 '
|
|
242
|
+
"Using default 'lite'.",
|
|
220
243
|
cfg.minimality,
|
|
221
244
|
config_file,
|
|
222
245
|
", ".join(sorted(VALID_MINIMALITY)),
|
|
223
246
|
)
|
|
224
|
-
cfg.minimality = "
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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"
|