mapify-cli 3.28.0__tar.gz → 3.28.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/PKG-INFO +8 -1
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/README.md +7 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/pyproject.toml +1 -1
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/__init__.py +103 -3
- mapify_cli-3.28.1/src/mapify_cli/_python_guard.py +31 -0
- mapify_cli-3.28.1/src/mapify_cli/python_runtime.py +383 -0
- {mapify_cli-3.28.0/src/mapify_cli/templates → mapify_cli-3.28.1/src/mapify_cli/templates/codex}/hooks/workflow-gate.py +48 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/README.md +21 -2
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/context-meter.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +26 -0
- mapify_cli-3.28.1/src/mapify_cli/templates/hooks/map-memory-capture.py +66 -0
- mapify_cli-3.28.1/src/mapify_cli/templates/hooks/map-memory-endmark.py +66 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/map-memory-finalize.py +27 -0
- mapify_cli-3.28.1/src/mapify_cli/templates/hooks/map-memory-recall.py +74 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/map-statusline.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/map-token-meter.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/post-compact-context.py +27 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +27 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +27 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +27 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/safety-guardrails.py +47 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/scrub-internal-ids.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/workflow-context-injector.py +26 -0
- {mapify_cli-3.28.0/src/mapify_cli/templates/codex → mapify_cli-3.28.1/src/mapify_cli/templates}/hooks/workflow-gate.py +48 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/map_step_runner.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +26 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/hook-patterns.md +76 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-release/SKILL.md +1 -1
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-release/release-reference.md +30 -15
- mapify_cli-3.28.1/src/mapify_cli/templates_src/_partials/python-version-guard.py.jinja +63 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/README.md.jinja +21 -2
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-statusline.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/scrub-internal-ids.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +2 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +1 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +76 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +1 -1
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-release/release-reference.md.jinja +30 -15
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/conftest.py +8 -0
- mapify_cli-3.28.1/tests/test_python_version_requirement.py +608 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_sofa_client.py +40 -10
- mapify_cli-3.28.0/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -39
- mapify_cli-3.28.0/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -39
- mapify_cli-3.28.0/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -47
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/.claude/hooks/README.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/.claude/skills/README.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/.gitignore +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/LICENSE +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/_locking.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/auto_update.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/boundary_quality_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/cli_ui.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/code_map.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/mcp.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/project_config.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/config/settings.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/agent_generator.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/codex_copier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/domain_skill.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/file_copier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/governance_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/providers.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/delivery/template_renderer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/dependency_graph.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/grace_eval/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/grace_eval/schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/grace_eval/sweep.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/install_manifest.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/intent_detector.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/capture.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/digest_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/finalize.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/memory/recall.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/minimality_eval.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/minimality_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/parallelism_observability.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/ralph_state.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/repo_insight.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/research_eval.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/research_eval_compare.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/schemas.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/scope_classifier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skill_ir.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/aggregator.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/assertions.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/proposer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/bundle.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/dispatcher.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/eval_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/gates.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/judge.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/repeated.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/trajectory/seeding.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/skills_eval/viewer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/.gitignore +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/CLAUDE.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/actor.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/evaluator.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/monitor.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/predictor.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/reflector.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/research-agent.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/evaluator.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/predictor.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/config.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/hooks.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-review/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-review/adversarial-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-review/review-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/codex/skills/map-upgrade/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/classify_scope.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/scrub_internal_ids.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/scripts/wayfind_runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/host-paths.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/rules/learned/README.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/settings.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/README.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-architecture/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-auto/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-auto/auto-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-plan/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-prd-review/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-review/adversarial-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-upgrade/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-wayfind/SKILL.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/map-wayfind/wayfind-reference.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates/workflow-rules.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/_partials/auto-update-preflight.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/_partials/manual-upgrade-flow.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/actor.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/monitor.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/evaluator.toml.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/predictor.toml.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-review/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-review/adversarial-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-review/review-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/codex/skills/map-upgrade/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/classify_scope.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/scrub_internal_ids.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/scripts/wayfind_runner.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-architecture/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-auto/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-auto/auto-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-prd-review/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-review/adversarial-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-upgrade/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-wayfind/SKILL.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/map-wayfind/wayfind-reference.md.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/token_budget.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/tool_output_offload.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/tools/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/tools/validate_dependencies.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/update_install.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/update_state.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/update_versions.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/verification_recorder.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/workflow_finalizer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/workflow_logger.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/src/mapify_cli/workflow_state.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/_fake_task_tool.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/fixtures/claude/escalation-matrix.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/fixtures/codex/config.toml +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/fixtures/wave_blueprints.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_detect_clarification_triggers.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_end_of_turn.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_hook_inventory_smoke.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_safety_guardrails.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/hooks/test_scrub_internal_ids_hook.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/code_review.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/plan_handoff.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/spec.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/step_state_initialized.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/task_plan.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/fixtures/verification_summary.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/test_e2e_artifact_contracts.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/integration/test_e2e_claude_sdk.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/README.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/hidden/test_kvparse_full.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/src/kvparse.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_false_success/repo/tests/test_kvparse_basic.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_cli_correctness.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_dispatch_audit.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_frontmatter.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_agent_memory.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_approval_hold.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_artifact_schemas.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_auto_update.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_boundary_quality_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_bump_version.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_classify_scope_script.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_code_map.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_compaction_offload_integration.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_concurrent_dispatch_harness.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_context_usefulness.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_cross_ai_config.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_decomposition.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_dependency_graph.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_diagnostics.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_digest_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_domain_skill.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_file_copier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_governance_attack_fixtures.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_governance_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_grace_eval_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_grace_eval_sweep.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_hook_patterns.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_init_import_graph.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_install_manifest.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_intent_detector.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_inv1_no_anthropic_optimize.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_jinja2_dep.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_locking.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_managed_file_copier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_auto.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_orchestrator.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_step_runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_token_meter.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_map_utils_sanitize.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_mapify_cli.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_capture.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_finalize.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_integration.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_recall.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_memory_review_fixes.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_minimality_eval.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_minimality_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_parallelism_observability.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_post_compact_context.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_preset_commands.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_project_config.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_prompt_layering.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_prompt_profile_commands.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_pyyaml_dep.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_ralph_hooks.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_ralph_state.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_repo_insight.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_research_eval.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_research_eval_compare.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_review_verdict_ledger.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_schemas.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_scope_classifier.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_scrub_internal_ids.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_settings_deny_globs.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_shell_json_pipes.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skill_ir.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_consistency.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_aggregator.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_apply.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_cli_optimize.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_dispatcher_env.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_fixtures.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_optimizer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_optimizer_isolation.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_proposer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_bundle.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_cli.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_gates.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_judge.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_repeated.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_report.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_trajectory_schema.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_skills_eval_viewer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_slice5b_leak_guards.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_sofa_search.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_statusline.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_template_render.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_token_budget.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_tool_output_offload.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_update_install.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_update_state.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_update_versions.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_validate_dependencies.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_validate_spec_citations.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_verification_recorder.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wave_eval_harness.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wave_fixtures.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wave_parallel_harness.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_wayfind_runner.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_context_injector.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_finalizer.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_gate.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_logger.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_workflow_state.py +0 -0
- {mapify_cli-3.28.0 → mapify_cli-3.28.1}/tests/test_worktree_isolation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mapify-cli
|
|
3
|
-
Version: 3.28.
|
|
3
|
+
Version: 3.28.1
|
|
4
4
|
Summary: MAP Framework installer - Modular Agentic Planner for Claude Code
|
|
5
5
|
Project-URL: Homepage, https://github.com/azalio/map-framework
|
|
6
6
|
Project-URL: Repository, https://github.com/azalio/map-framework.git
|
|
@@ -87,6 +87,11 @@ uv tool install mapify-cli
|
|
|
87
87
|
pip install mapify-cli
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
Requires Python 3.11+, and `python3` on your `PATH` must be that interpreter — the
|
|
91
|
+
installed hooks and `.map/scripts/` runners execute through a `#!/usr/bin/env
|
|
92
|
+
python3` shebang, not through the interpreter that ran `mapify`. `mapify init`
|
|
93
|
+
checks it up front and tells you what to fix ([details](docs/INSTALL.md#why-python3-on-path-matters)).
|
|
94
|
+
|
|
90
95
|
**2. Initialize your project**
|
|
91
96
|
|
|
92
97
|
Claude Code is the default provider:
|
|
@@ -301,6 +306,8 @@ mapify init . --no-autonomy # remove the autonomy posture
|
|
|
301
306
|
## Trouble?
|
|
302
307
|
|
|
303
308
|
- **Command not found** → Run `mapify init` in your project first.
|
|
309
|
+
- **`init` stops on a Python version** → `python3` on your `PATH` is older than 3.11; the hooks run under it. Install 3.11+ (`brew install python@3.12` / `uv python install 3.12`), then `mapify check`. To install anyway, pass `--skip-python-check` or set `MAPIFY_SKIP_PYTHON_CHECK=1` — hooks stay non-functional until `python3` is upgraded ([details](docs/INSTALL.md#why-python3-on-path-matters)).
|
|
310
|
+
- **A hook printed "MAP requires Python 3.11 or newer"** → same cause, detected at run time; the message names the interpreter it ran under. Context hooks report and let the session continue; the two PreToolUse gates (`safety-guardrails.py`, `workflow-gate.py`) deny the tool call instead of allowing it unguarded, so fix `python3` in another terminal to unblock.
|
|
304
311
|
- **Agent errors** → Check `.claude/agents/` has all shipped agent `.md` files, or run `mapify doctor`.
|
|
305
312
|
- **Poor output on a complex task** → Start with `/map-plan` and feed `/map-efficient` the approved plan instead of asking it to infer the architecture.
|
|
306
313
|
- [More help →](docs/INSTALL.md#troubleshooting)
|
|
@@ -42,6 +42,11 @@ uv tool install mapify-cli
|
|
|
42
42
|
pip install mapify-cli
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
Requires Python 3.11+, and `python3` on your `PATH` must be that interpreter — the
|
|
46
|
+
installed hooks and `.map/scripts/` runners execute through a `#!/usr/bin/env
|
|
47
|
+
python3` shebang, not through the interpreter that ran `mapify`. `mapify init`
|
|
48
|
+
checks it up front and tells you what to fix ([details](docs/INSTALL.md#why-python3-on-path-matters)).
|
|
49
|
+
|
|
45
50
|
**2. Initialize your project**
|
|
46
51
|
|
|
47
52
|
Claude Code is the default provider:
|
|
@@ -256,6 +261,8 @@ mapify init . --no-autonomy # remove the autonomy posture
|
|
|
256
261
|
## Trouble?
|
|
257
262
|
|
|
258
263
|
- **Command not found** → Run `mapify init` in your project first.
|
|
264
|
+
- **`init` stops on a Python version** → `python3` on your `PATH` is older than 3.11; the hooks run under it. Install 3.11+ (`brew install python@3.12` / `uv python install 3.12`), then `mapify check`. To install anyway, pass `--skip-python-check` or set `MAPIFY_SKIP_PYTHON_CHECK=1` — hooks stay non-functional until `python3` is upgraded ([details](docs/INSTALL.md#why-python3-on-path-matters)).
|
|
265
|
+
- **A hook printed "MAP requires Python 3.11 or newer"** → same cause, detected at run time; the message names the interpreter it ran under. Context hooks report and let the session continue; the two PreToolUse gates (`safety-guardrails.py`, `workflow-gate.py`) deny the tool call instead of allowing it unguarded, so fix `python3` in another terminal to unblock.
|
|
259
266
|
- **Agent errors** → Check `.claude/agents/` has all shipped agent `.md` files, or run `mapify doctor`.
|
|
260
267
|
- **Poor output on a complex task** → Start with `/map-plan` and feed `/map-efficient` the approved plan instead of asking it to infer the architecture.
|
|
261
268
|
- [More help →](docs/INSTALL.md#troubleshooting)
|
|
@@ -23,8 +23,12 @@ Or install globally:
|
|
|
23
23
|
mapify check
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
|
-
__version__ = "3.28.
|
|
26
|
+
__version__ = "3.28.1"
|
|
27
27
|
|
|
28
|
+
# MUST stay the first import: it turns "this interpreter is older than 3.11" into
|
|
29
|
+
# a message that says so, instead of the ImportError raised by `from datetime
|
|
30
|
+
# import UTC` a few lines below. See mapify_cli/_python_guard.py.
|
|
31
|
+
from . import _python_guard # noqa: F401, I001 (import order is load-order here)
|
|
28
32
|
import contextlib
|
|
29
33
|
import functools
|
|
30
34
|
import inspect
|
|
@@ -290,6 +294,37 @@ def check_mcp_server(server: str) -> bool:
|
|
|
290
294
|
return server in build_standard_mcp_servers()
|
|
291
295
|
|
|
292
296
|
|
|
297
|
+
def check_hook_python_version(*, skip: bool = False, warn_only: bool = False) -> bool:
|
|
298
|
+
"""Gate on the ``python3`` that shipped hooks and .map/scripts runners will use.
|
|
299
|
+
|
|
300
|
+
Every installed hook and runner carries a ``#!/usr/bin/env python3`` shebang, so
|
|
301
|
+
they execute under PATH's ``python3`` -- not under the interpreter running
|
|
302
|
+
``mapify`` (typically a uv-managed 3.12/3.13). On a stock macOS PATH that is
|
|
303
|
+
Python 3.9, where every one of them fails at import. Surfacing it here is the
|
|
304
|
+
difference between a named cause and an ``ImportError`` an hour later.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
skip: Bypass the check (``--skip-python-check``). ``MAPIFY_SKIP_PYTHON_CHECK``
|
|
308
|
+
has the same effect.
|
|
309
|
+
warn_only: Print the problem but return True, so an updater-driven refresh
|
|
310
|
+
of an already-installed project is never blocked by it.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
True when installation may proceed.
|
|
314
|
+
"""
|
|
315
|
+
from mapify_cli.python_runtime import check_hook_python
|
|
316
|
+
|
|
317
|
+
problem = check_hook_python(skip=skip)
|
|
318
|
+
if problem is None:
|
|
319
|
+
return True
|
|
320
|
+
|
|
321
|
+
label = "Warning" if warn_only else "Error"
|
|
322
|
+
color = "yellow" if warn_only else "red"
|
|
323
|
+
console.print(f"[{color}]{label}:[/{color}] {problem}")
|
|
324
|
+
console.print()
|
|
325
|
+
return warn_only
|
|
326
|
+
|
|
327
|
+
|
|
293
328
|
def is_debug_enabled(debug_flag: bool | None = None) -> bool:
|
|
294
329
|
"""
|
|
295
330
|
Check if debug mode is enabled via CLI flag or environment variable.
|
|
@@ -1137,6 +1172,18 @@ def init(
|
|
|
1137
1172
|
"Enabled by default; omit to preserve an existing project choice."
|
|
1138
1173
|
),
|
|
1139
1174
|
),
|
|
1175
|
+
skip_python_check: bool = typer.Option(
|
|
1176
|
+
False,
|
|
1177
|
+
"--skip-python-check",
|
|
1178
|
+
help=(
|
|
1179
|
+
"Install even when the `python3` on PATH is older than 3.11. Shipped "
|
|
1180
|
+
"hooks and .map/scripts/ runners use that interpreter via their "
|
|
1181
|
+
"shebang: context hooks stay broken, and the blocking PreToolUse "
|
|
1182
|
+
"gates (safety-guardrails.py, workflow-gate.py) deny every matched "
|
|
1183
|
+
"tool call until it is upgraded. Equivalent to "
|
|
1184
|
+
"MAPIFY_SKIP_PYTHON_CHECK=1."
|
|
1185
|
+
),
|
|
1186
|
+
),
|
|
1140
1187
|
refresh_existing: bool = typer.Option(
|
|
1141
1188
|
False,
|
|
1142
1189
|
"--refresh-existing",
|
|
@@ -1178,8 +1225,6 @@ def init(
|
|
|
1178
1225
|
show_banner()
|
|
1179
1226
|
|
|
1180
1227
|
requested_project_name = project_name
|
|
1181
|
-
if not refresh_existing:
|
|
1182
|
-
_start_init_workflow_logger(requested_project_name, mcp, debug)
|
|
1183
1228
|
|
|
1184
1229
|
# Validate provider
|
|
1185
1230
|
valid_providers = ("claude", "codex")
|
|
@@ -1190,6 +1235,20 @@ def init(
|
|
|
1190
1235
|
)
|
|
1191
1236
|
raise typer.Exit(1)
|
|
1192
1237
|
|
|
1238
|
+
# Gate on PATH's python3 before writing anything: it is what runs the hooks and
|
|
1239
|
+
# .map/scripts/ runners we are about to install. A refresh is an updater-owned
|
|
1240
|
+
# replay of an existing install, so there it warns instead of hard-stopping.
|
|
1241
|
+
if not check_hook_python_version(
|
|
1242
|
+
skip=skip_python_check, warn_only=refresh_existing
|
|
1243
|
+
):
|
|
1244
|
+
raise typer.Exit(1)
|
|
1245
|
+
|
|
1246
|
+
# Only now start diagnostics: a rejected init must not leave a workflow log
|
|
1247
|
+
# behind in the current directory (the gate above writes nothing, and
|
|
1248
|
+
# --debug must not be the one exception).
|
|
1249
|
+
if not refresh_existing:
|
|
1250
|
+
_start_init_workflow_logger(requested_project_name, mcp, debug)
|
|
1251
|
+
|
|
1193
1252
|
if refresh_existing and project_name != ".":
|
|
1194
1253
|
console.print(
|
|
1195
1254
|
"[red]Error:[/red] --refresh-existing can only refresh the current "
|
|
@@ -1777,6 +1836,22 @@ def check(debug: bool = typer.Option(False, "--debug", help="Enable debug loggin
|
|
|
1777
1836
|
tracker.error(tool, "not found")
|
|
1778
1837
|
results[tool] = False
|
|
1779
1838
|
|
|
1839
|
+
# PATH's python3 executes every shipped hook and .map/scripts/ runner via their
|
|
1840
|
+
# shebang, so its version belongs in the readiness check next to git/claude.
|
|
1841
|
+
from mapify_cli.python_runtime import (
|
|
1842
|
+
detect_hook_interpreter,
|
|
1843
|
+
minimum_python_str,
|
|
1844
|
+
remediation_lines,
|
|
1845
|
+
)
|
|
1846
|
+
|
|
1847
|
+
tracker.add("python", f"python3 on PATH (>= {minimum_python_str()})")
|
|
1848
|
+
interpreter = detect_hook_interpreter()
|
|
1849
|
+
results["python"] = interpreter.satisfies_minimum
|
|
1850
|
+
if interpreter.satisfies_minimum:
|
|
1851
|
+
tracker.complete("python", interpreter.summary)
|
|
1852
|
+
else:
|
|
1853
|
+
tracker.error("python", interpreter.summary)
|
|
1854
|
+
|
|
1780
1855
|
health = get_project_health(Path.cwd())
|
|
1781
1856
|
|
|
1782
1857
|
tracker.add("project", "Detect MAP project")
|
|
@@ -1808,6 +1883,13 @@ def check(debug: bool = typer.Option(False, "--debug", help="Enable debug loggin
|
|
|
1808
1883
|
)
|
|
1809
1884
|
else:
|
|
1810
1885
|
console.print("[yellow]MAP environment needs attention:[/yellow]")
|
|
1886
|
+
if not results.get("python"):
|
|
1887
|
+
console.print(
|
|
1888
|
+
f" • Upgrade python3 to {minimum_python_str()}+ — every shipped "
|
|
1889
|
+
"hook and .map/scripts/ runner executes under it:"
|
|
1890
|
+
)
|
|
1891
|
+
for line in remediation_lines():
|
|
1892
|
+
console.print(f" {line}")
|
|
1811
1893
|
if not results.get("git"):
|
|
1812
1894
|
console.print(" • Install git: https://git-scm.com/downloads")
|
|
1813
1895
|
if detected == "codex" and not results.get("codex"):
|
|
@@ -1855,6 +1937,15 @@ def doctor(debug: bool = typer.Option(False, "--debug", help="Enable debug loggi
|
|
|
1855
1937
|
else:
|
|
1856
1938
|
tracker.error(tool_name, "not found")
|
|
1857
1939
|
|
|
1940
|
+
from mapify_cli.python_runtime import detect_hook_interpreter, minimum_python_str
|
|
1941
|
+
|
|
1942
|
+
interpreter = detect_hook_interpreter()
|
|
1943
|
+
tracker.add("python", f"python3 on PATH (>= {minimum_python_str()})")
|
|
1944
|
+
if interpreter.satisfies_minimum:
|
|
1945
|
+
tracker.complete("python", interpreter.summary)
|
|
1946
|
+
else:
|
|
1947
|
+
tracker.error("python", interpreter.summary)
|
|
1948
|
+
|
|
1858
1949
|
tracker.add("project", "MAP project structure")
|
|
1859
1950
|
if detected == "codex":
|
|
1860
1951
|
codex_dir = project_path / ".codex"
|
|
@@ -1915,6 +2006,15 @@ def doctor(debug: bool = typer.Option(False, "--debug", help="Enable debug loggi
|
|
|
1915
2006
|
details.add_column("Check")
|
|
1916
2007
|
details.add_column("Status")
|
|
1917
2008
|
details.add_column("Details")
|
|
2009
|
+
details.add_row(
|
|
2010
|
+
"Hook interpreter",
|
|
2011
|
+
(
|
|
2012
|
+
f"Python {interpreter.version_str}"
|
|
2013
|
+
if interpreter.satisfies_minimum
|
|
2014
|
+
else f"needs >= {minimum_python_str()}"
|
|
2015
|
+
),
|
|
2016
|
+
f"{interpreter.summary} runs every hook and .map/scripts/ runner",
|
|
2017
|
+
)
|
|
1918
2018
|
details.add_row(
|
|
1919
2019
|
"Project",
|
|
1920
2020
|
"OK" if health["initialized"] else "Needs init",
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Report an unsupported interpreter by name, not as an ``ImportError``.
|
|
2
|
+
|
|
3
|
+
``mapify_cli`` uses Python 3.11+ constructs (``datetime.UTC``, PEP 604 unions in
|
|
4
|
+
evaluated annotations). ``pyproject.toml`` declares ``requires-python = ">=3.11"``,
|
|
5
|
+
which stops every PEP-517-aware installer -- but not ``python3 -m mapify_cli`` from
|
|
6
|
+
a source clone, nor an install forced with ``--ignore-requires-python``. Without
|
|
7
|
+
this module those paths die on ``ImportError: cannot import name 'UTC' from
|
|
8
|
+
'datetime'``, which never mentions a Python version.
|
|
9
|
+
|
|
10
|
+
``mapify_cli/__init__.py`` imports this module BEFORE any 3.11-only import, so the
|
|
11
|
+
check runs first. Everything here must stay parsable and runnable on old
|
|
12
|
+
interpreters: no PEP 604 unions, no ``datetime.UTC``, no walrus in a comprehension.
|
|
13
|
+
|
|
14
|
+
The version floor is duplicated here on purpose (importing
|
|
15
|
+
:mod:`mapify_cli.python_runtime` would itself have to be version-safe);
|
|
16
|
+
``tests/test_python_version_requirement.py`` asserts every copy agrees.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import sys
|
|
20
|
+
|
|
21
|
+
# UP036 is suppressed on purpose: the project targets 3.11, but this check exists
|
|
22
|
+
# precisely for interpreters older than the target.
|
|
23
|
+
if sys.version_info < (3, 11): # noqa: UP036
|
|
24
|
+
sys.stderr.write(
|
|
25
|
+
f"mapify requires Python 3.11 or newer, but {sys.executable} is "
|
|
26
|
+
f"Python {sys.version_info[0]}.{sys.version_info[1]}.\n"
|
|
27
|
+
"Install Python 3.11+ (brew install python@3.12, uv python install 3.12,\n"
|
|
28
|
+
"or pyenv install), then re-install mapify with that interpreter --\n"
|
|
29
|
+
"for example: uv tool install --python 3.12 mapify-cli\n"
|
|
30
|
+
)
|
|
31
|
+
raise SystemExit(1)
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"""Detect the ``python3`` interpreter that shipped hooks and scripts will use.
|
|
2
|
+
|
|
3
|
+
MAP ships every hook (``.claude/hooks/``, ``.codex/hooks/``) and every
|
|
4
|
+
``.map/scripts/`` runner with a ``#!/usr/bin/env python3`` shebang. The installed
|
|
5
|
+
framework therefore runs under whatever ``python3`` resolves to on the user's
|
|
6
|
+
PATH -- **not** under the interpreter that runs ``mapify`` (which is typically a
|
|
7
|
+
uv-managed 3.12/3.13 when installed via ``uvx`` / ``uv tool install``).
|
|
8
|
+
|
|
9
|
+
Those shipped files use Python 3.11+ constructs (``datetime.UTC``, PEP 604
|
|
10
|
+
unions in evaluated annotations), so a stock macOS ``/usr/bin/python3`` (3.9)
|
|
11
|
+
makes every hook fail at import time with ``ImportError: cannot import name
|
|
12
|
+
'UTC' from 'datetime'`` -- a message that says nothing about a Python version
|
|
13
|
+
requirement. ``pyproject.toml`` declares ``requires-python = ">=3.11"``, but that
|
|
14
|
+
constrains only the installer, never the interpreter the hooks pick up at
|
|
15
|
+
runtime.
|
|
16
|
+
|
|
17
|
+
This module turns that deferred, cryptic failure into an install-time gate:
|
|
18
|
+
|
|
19
|
+
* :func:`detect_hook_interpreter` resolves ``python3`` exactly the way a shebang
|
|
20
|
+
does (``PATH`` lookup) and reports its version.
|
|
21
|
+
* :func:`format_problem` renders an actionable message naming the required
|
|
22
|
+
version, the resolved interpreter, and how to fix it -- or ``None`` when the
|
|
23
|
+
interpreter is fine.
|
|
24
|
+
|
|
25
|
+
The shipped executables carry the matching runtime half of this contract: a
|
|
26
|
+
version guard rendered from
|
|
27
|
+
``templates_src/_partials/python-version-guard.py.jinja`` that exits with the
|
|
28
|
+
same explanation instead of an ``ImportError`` traceback.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import os
|
|
34
|
+
import re
|
|
35
|
+
import shutil
|
|
36
|
+
import subprocess
|
|
37
|
+
import sys
|
|
38
|
+
from collections.abc import Mapping
|
|
39
|
+
from dataclasses import dataclass
|
|
40
|
+
from pathlib import Path
|
|
41
|
+
from typing import Final
|
|
42
|
+
|
|
43
|
+
# Minimum interpreter version for every shipped hook and .map/scripts runner.
|
|
44
|
+
# Keep in sync with pyproject.toml ``requires-python`` and with
|
|
45
|
+
# templates_src/_partials/python-version-guard.py.jinja.
|
|
46
|
+
MINIMUM_PYTHON: Final[tuple[int, int]] = (3, 11)
|
|
47
|
+
|
|
48
|
+
#: Escape hatch for CI and for users who knowingly install before fixing PATH.
|
|
49
|
+
SKIP_ENV_VAR: Final[str] = "MAPIFY_SKIP_PYTHON_CHECK"
|
|
50
|
+
|
|
51
|
+
#: Command a shebang resolves; parameterised only so tests can probe a fake.
|
|
52
|
+
DEFAULT_COMMAND: Final[str] = "python3"
|
|
53
|
+
|
|
54
|
+
_TRUTHY: Final[frozenset[str]] = frozenset({"1", "true", "yes", "on"})
|
|
55
|
+
|
|
56
|
+
# Printed by the probe; kept Python-2-parsable so even a bizarre ``python3`` on
|
|
57
|
+
# PATH produces a parsable line rather than a SyntaxError we cannot explain.
|
|
58
|
+
_VERSION_PROBE: Final[str] = (
|
|
59
|
+
"import sys; sys.stdout.write('%d.%d.%d' % sys.version_info[:3])"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
_VERSION_RE: Final[re.Pattern[str]] = re.compile(r"(\d+)\.(\d+)\.(\d+)")
|
|
63
|
+
|
|
64
|
+
_PROBE_TIMEOUT_SECONDS: Final[float] = 5.0
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def minimum_python_str() -> str:
|
|
68
|
+
"""Return the minimum version as ``"3.11"``."""
|
|
69
|
+
return f"{MINIMUM_PYTHON[0]}.{MINIMUM_PYTHON[1]}"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass(frozen=True)
|
|
73
|
+
class InterpreterInfo:
|
|
74
|
+
"""What the shebang-resolved ``python3`` on PATH turned out to be.
|
|
75
|
+
|
|
76
|
+
Attributes:
|
|
77
|
+
command: The command that was resolved (normally ``python3``).
|
|
78
|
+
executable: Absolute path ``PATH`` lookup produced, or ``None`` when the
|
|
79
|
+
command is not on ``PATH`` at all.
|
|
80
|
+
version: ``(major, minor, micro)`` when the version could be read, else
|
|
81
|
+
``None``.
|
|
82
|
+
detection_error: Why the version is unknown (not on PATH, probe failed,
|
|
83
|
+
unparsable output). ``None`` when :attr:`version` is populated.
|
|
84
|
+
shadowed: Path to a nearer ``python3`` that was deliberately ignored
|
|
85
|
+
because it lives in the environment running ``mapify`` (see
|
|
86
|
+
:func:`_own_environment_bin_dirs`). ``None`` when nothing was skipped.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
command: str = DEFAULT_COMMAND
|
|
90
|
+
executable: str | None = None
|
|
91
|
+
version: tuple[int, int, int] | None = None
|
|
92
|
+
detection_error: str | None = None
|
|
93
|
+
shadowed: str | None = None
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def found(self) -> bool:
|
|
97
|
+
"""True when the command was resolvable on ``PATH``."""
|
|
98
|
+
return self.executable is not None
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def satisfies_minimum(self) -> bool:
|
|
102
|
+
"""True only when a version was read AND it meets :data:`MINIMUM_PYTHON`.
|
|
103
|
+
|
|
104
|
+
An unknown version is never treated as satisfying the floor: if we could
|
|
105
|
+
not run the interpreter, the hooks cannot either.
|
|
106
|
+
"""
|
|
107
|
+
return self.version is not None and self.version[:2] >= MINIMUM_PYTHON
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def version_str(self) -> str:
|
|
111
|
+
"""Version as ``"3.9.6"``, or ``"unknown"`` when detection failed."""
|
|
112
|
+
if self.version is None:
|
|
113
|
+
return "unknown"
|
|
114
|
+
return ".".join(str(part) for part in self.version)
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def summary(self) -> str:
|
|
118
|
+
"""One-line description suitable for a status table."""
|
|
119
|
+
if not self.found:
|
|
120
|
+
return f"{self.command} not found on PATH"
|
|
121
|
+
if self.version is None:
|
|
122
|
+
return f"{self.executable} (version unknown)"
|
|
123
|
+
return f"{self.executable} (Python {self.version_str})"
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _parse_version(text: str) -> tuple[int, int, int] | None:
|
|
127
|
+
match = _VERSION_RE.search(text)
|
|
128
|
+
if match is None:
|
|
129
|
+
return None
|
|
130
|
+
major, minor, micro = (int(part) for part in match.groups())
|
|
131
|
+
return (major, minor, micro)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _first_line(text: str) -> str:
|
|
135
|
+
for line in text.splitlines():
|
|
136
|
+
stripped = line.strip()
|
|
137
|
+
if stripped:
|
|
138
|
+
return stripped
|
|
139
|
+
return ""
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _resolve_path(entry: str) -> Path:
|
|
143
|
+
try:
|
|
144
|
+
return Path(entry).resolve()
|
|
145
|
+
except OSError: # pragma: no cover - unreadable PATH entry
|
|
146
|
+
return Path(entry)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _own_environment_bin_dirs() -> set[Path]:
|
|
150
|
+
"""Directories belonging to the environment that runs ``mapify`` itself.
|
|
151
|
+
|
|
152
|
+
``uvx mapify init`` (the documented install path) runs from an *ephemeral* uv
|
|
153
|
+
environment whose ``bin`` is prepended to PATH -- with a modern ``python3`` in
|
|
154
|
+
it. That interpreter disappears when the command exits, so it is exactly the
|
|
155
|
+
wrong thing to judge: the hooks installed by this run are launched later, by
|
|
156
|
+
Claude Code, from a shell that never sees it. Same for ``uv run`` / an
|
|
157
|
+
activated venv. Skip these directories so the check answers "what will an
|
|
158
|
+
independent shell resolve?".
|
|
159
|
+
|
|
160
|
+
Only a *virtual* environment is skipped (``sys.prefix != sys.base_prefix``).
|
|
161
|
+
When mapify runs from a plain system/Homebrew install, its own interpreter is
|
|
162
|
+
a legitimate PATH-visible ``python3`` that hooks will resolve too, so nothing
|
|
163
|
+
is excluded and the check stays a straight ``which`` lookup.
|
|
164
|
+
"""
|
|
165
|
+
if sys.prefix == getattr(sys, "base_prefix", sys.prefix):
|
|
166
|
+
return set()
|
|
167
|
+
candidates: set[Path] = set()
|
|
168
|
+
if sys.executable:
|
|
169
|
+
candidates.add(_resolve_path(sys.executable).parent)
|
|
170
|
+
if sys.prefix:
|
|
171
|
+
candidates.add(_resolve_path(sys.prefix) / "bin")
|
|
172
|
+
candidates.add(_resolve_path(sys.prefix) / "Scripts")
|
|
173
|
+
return candidates
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _path_outside_own_environment(raw_path: str | None = None) -> str:
|
|
177
|
+
"""Return PATH with the running environment's bin directories removed.
|
|
178
|
+
|
|
179
|
+
Empty entries are preserved: POSIX ``execvp`` (and therefore
|
|
180
|
+
``#!/usr/bin/env python3``) reads an empty ``PATH`` entry as the current
|
|
181
|
+
directory, and :func:`shutil.which` follows the same rule. Dropping them
|
|
182
|
+
would let this check approve a *later* interpreter while the installed hooks
|
|
183
|
+
keep resolving the ``./python3`` next to them. An empty entry is filtered
|
|
184
|
+
only when the current directory *is* one of our own environment bin
|
|
185
|
+
directories, which is what :func:`_resolve_path` reports for it.
|
|
186
|
+
"""
|
|
187
|
+
source = os.environ.get("PATH", os.defpath) if raw_path is None else raw_path
|
|
188
|
+
own = _own_environment_bin_dirs()
|
|
189
|
+
kept = [
|
|
190
|
+
entry for entry in source.split(os.pathsep) if _resolve_path(entry) not in own
|
|
191
|
+
]
|
|
192
|
+
return os.pathsep.join(kept)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _resolve_shebang_interpreter(command: str) -> tuple[str | None, str | None]:
|
|
196
|
+
"""Resolve *command* as an independent shell would.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
``(executable, shadowed)``. *shadowed* is the nearer match that was
|
|
200
|
+
ignored because it belongs to this process's own environment, or ``None``.
|
|
201
|
+
When PATH offers nothing outside that environment, its own interpreter is
|
|
202
|
+
returned as *executable* (better a real verdict than none).
|
|
203
|
+
"""
|
|
204
|
+
nearest = shutil.which(command)
|
|
205
|
+
outside = shutil.which(command, path=_path_outside_own_environment())
|
|
206
|
+
if outside is None:
|
|
207
|
+
return nearest, None
|
|
208
|
+
if nearest is not None and _resolve_path(nearest) == _resolve_path(outside):
|
|
209
|
+
return outside, None
|
|
210
|
+
return outside, nearest
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def detect_hook_interpreter(command: str = DEFAULT_COMMAND) -> InterpreterInfo:
|
|
214
|
+
"""Resolve *command* the way a ``#!/usr/bin/env`` shebang does and read its version.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
command: Interpreter command to resolve on ``PATH``.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
An :class:`InterpreterInfo`. Never raises: every failure mode (absent
|
|
221
|
+
command, unrunnable interpreter, timeout, unparsable output) is reported
|
|
222
|
+
through :attr:`InterpreterInfo.detection_error`.
|
|
223
|
+
"""
|
|
224
|
+
executable, shadowed = _resolve_shebang_interpreter(command)
|
|
225
|
+
if executable is None:
|
|
226
|
+
return InterpreterInfo(
|
|
227
|
+
command=command,
|
|
228
|
+
detection_error=f"{command} was not found on PATH",
|
|
229
|
+
shadowed=shadowed,
|
|
230
|
+
)
|
|
231
|
+
version, error = _probe_version(executable)
|
|
232
|
+
return InterpreterInfo(
|
|
233
|
+
command=command,
|
|
234
|
+
executable=executable,
|
|
235
|
+
version=version,
|
|
236
|
+
detection_error=error,
|
|
237
|
+
shadowed=shadowed,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _probe_version(executable: str) -> tuple[tuple[int, int, int] | None, str | None]:
|
|
242
|
+
"""Return ``(version, detection_error)`` for *executable*; exactly one is set."""
|
|
243
|
+
# Fast path: the resolved interpreter IS the one running mapify, so its version
|
|
244
|
+
# is already known and no subprocess is needed.
|
|
245
|
+
try:
|
|
246
|
+
if sys.executable and os.path.samefile(executable, sys.executable):
|
|
247
|
+
return (
|
|
248
|
+
sys.version_info[0],
|
|
249
|
+
sys.version_info[1],
|
|
250
|
+
sys.version_info[2],
|
|
251
|
+
), None
|
|
252
|
+
except OSError:
|
|
253
|
+
pass
|
|
254
|
+
|
|
255
|
+
try:
|
|
256
|
+
proc = subprocess.run(
|
|
257
|
+
[executable, "-c", _VERSION_PROBE],
|
|
258
|
+
capture_output=True,
|
|
259
|
+
text=True,
|
|
260
|
+
timeout=_PROBE_TIMEOUT_SECONDS,
|
|
261
|
+
check=False,
|
|
262
|
+
)
|
|
263
|
+
except subprocess.TimeoutExpired:
|
|
264
|
+
return None, (
|
|
265
|
+
f"{executable} did not respond within {_PROBE_TIMEOUT_SECONDS:.0f}s "
|
|
266
|
+
"(on macOS a /usr/bin/python3 stub can block on the Xcode Command "
|
|
267
|
+
"Line Tools prompt)"
|
|
268
|
+
)
|
|
269
|
+
except OSError as exc:
|
|
270
|
+
return None, f"{executable} could not be executed: {exc}"
|
|
271
|
+
|
|
272
|
+
if proc.returncode != 0:
|
|
273
|
+
detail = _first_line(proc.stderr) or f"exit code {proc.returncode}"
|
|
274
|
+
return None, f"{executable} failed the version probe: {detail}"
|
|
275
|
+
|
|
276
|
+
version = _parse_version(proc.stdout)
|
|
277
|
+
if version is None:
|
|
278
|
+
return None, (
|
|
279
|
+
f"{executable} printed an unparsable version: "
|
|
280
|
+
f"{_first_line(proc.stdout)!r}"
|
|
281
|
+
)
|
|
282
|
+
return version, None
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def skip_requested(env: Mapping[str, str] | None = None) -> bool:
|
|
286
|
+
"""True when :data:`SKIP_ENV_VAR` opts out of the check."""
|
|
287
|
+
source: Mapping[str, str] = os.environ if env is None else env
|
|
288
|
+
return source.get(SKIP_ENV_VAR, "").strip().lower() in _TRUTHY
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def remediation_lines() -> list[str]:
|
|
292
|
+
"""Actionable, copy-pasteable ways to get a new enough ``python3`` on PATH."""
|
|
293
|
+
minimum = minimum_python_str()
|
|
294
|
+
return [
|
|
295
|
+
f" Homebrew (macOS): brew install python@3.12 # or newer than {minimum}",
|
|
296
|
+
" uv: uv python install 3.12",
|
|
297
|
+
" pyenv: pyenv install 3.12 && pyenv global 3.12",
|
|
298
|
+
" Then confirm: python3 --version",
|
|
299
|
+
]
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def format_problem(info: InterpreterInfo) -> str | None:
|
|
303
|
+
"""Render an actionable message for a failing interpreter, else ``None``.
|
|
304
|
+
|
|
305
|
+
Args:
|
|
306
|
+
info: Result of :func:`detect_hook_interpreter`.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
Plain text (no rich markup, no square brackets so callers can print it
|
|
310
|
+
through ``rich`` unescaped) describing the problem and the fix, or
|
|
311
|
+
``None`` when *info* satisfies :data:`MINIMUM_PYTHON`.
|
|
312
|
+
"""
|
|
313
|
+
if info.satisfies_minimum:
|
|
314
|
+
return None
|
|
315
|
+
|
|
316
|
+
minimum = minimum_python_str()
|
|
317
|
+
if not info.found:
|
|
318
|
+
headline = (
|
|
319
|
+
f"{info.command} was not found on PATH, so MAP hooks and "
|
|
320
|
+
f".map/scripts/ runners cannot start."
|
|
321
|
+
)
|
|
322
|
+
elif info.version is None:
|
|
323
|
+
headline = (
|
|
324
|
+
f"could not determine the {info.command} version: "
|
|
325
|
+
f"{info.detection_error}."
|
|
326
|
+
)
|
|
327
|
+
else:
|
|
328
|
+
headline = (
|
|
329
|
+
f"{info.command} on PATH is {info.summary}, "
|
|
330
|
+
f"but MAP needs Python {minimum} or newer."
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
lines = [
|
|
334
|
+
headline,
|
|
335
|
+
"",
|
|
336
|
+
(
|
|
337
|
+
"Every shipped hook and .map/scripts/ runner starts with "
|
|
338
|
+
"#!/usr/bin/env python3, so they all run under this interpreter -- not "
|
|
339
|
+
f"under the one running mapify. On Python older than {minimum} they "
|
|
340
|
+
"fail at import (for example: cannot import name 'UTC' from 'datetime')."
|
|
341
|
+
),
|
|
342
|
+
]
|
|
343
|
+
if info.shadowed:
|
|
344
|
+
lines += [
|
|
345
|
+
"",
|
|
346
|
+
(
|
|
347
|
+
f"Note: {info.shadowed} was skipped -- it belongs to the "
|
|
348
|
+
"environment running mapify (uvx/uv run/venv), which is gone by "
|
|
349
|
+
"the time Claude Code launches a hook."
|
|
350
|
+
),
|
|
351
|
+
]
|
|
352
|
+
lines += [
|
|
353
|
+
"",
|
|
354
|
+
f"Install Python {minimum}+ and make sure python3 resolves to it:",
|
|
355
|
+
*remediation_lines(),
|
|
356
|
+
"",
|
|
357
|
+
(
|
|
358
|
+
f"To install anyway, pass --skip-python-check or set {SKIP_ENV_VAR}=1; "
|
|
359
|
+
"context hooks will stay broken and the blocking PreToolUse gates "
|
|
360
|
+
"(safety-guardrails.py, workflow-gate.py) will deny every matched "
|
|
361
|
+
"tool call until python3 is upgraded."
|
|
362
|
+
),
|
|
363
|
+
]
|
|
364
|
+
return "\n".join(lines)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def check_hook_python(
|
|
368
|
+
*, skip: bool = False, command: str = DEFAULT_COMMAND
|
|
369
|
+
) -> str | None:
|
|
370
|
+
"""Detect the hook interpreter and return a problem message, or ``None``.
|
|
371
|
+
|
|
372
|
+
Args:
|
|
373
|
+
skip: When True (CLI flag), skip detection entirely and report no
|
|
374
|
+
problem. :data:`SKIP_ENV_VAR` has the same effect.
|
|
375
|
+
command: Interpreter command to resolve.
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
The message from :func:`format_problem`, or ``None`` when the
|
|
379
|
+
interpreter is acceptable or the check was skipped.
|
|
380
|
+
"""
|
|
381
|
+
if skip or skip_requested():
|
|
382
|
+
return None
|
|
383
|
+
return format_problem(detect_hook_interpreter(command))
|