mapify-cli 3.18.0__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.18.0 → mapify_cli-3.19.0}/PKG-INFO +10 -1
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/README.md +9 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/pyproject.toml +1 -1
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/__init__.py +23 -3
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/config/settings.py +135 -2
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/codex_copier.py +136 -5
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/schemas.py +107 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/actor.md +10 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/monitor.md +16 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +12 -1
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +44 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +4 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +61 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +114 -7
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +437 -14
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +3408 -180
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/escalation-matrix.md +28 -3
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +57 -9
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +10 -6
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +166 -8
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +2 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +26 -2
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +10 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +16 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +12 -1
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +44 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +4 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +61 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +114 -7
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +437 -14
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +3408 -180
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +28 -3
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +57 -9
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +10 -6
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +166 -8
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +2 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +26 -2
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/fixtures/claude/escalation-matrix.md +28 -3
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/hooks/test_safety_guardrails.py +102 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_artifact_schemas.py +58 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_decomposition.py +230 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_map_orchestrator.py +276 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_map_step_runner.py +2356 -42
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_mapify_cli.py +214 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills.py +6 -1
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_template_render.py +152 -4
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_workflow_context_injector.py +139 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/.claude/hooks/README.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/.claude/skills/README.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/.gitignore +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/LICENSE +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/_locking.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/cli_ui.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/config/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/config/mcp.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/config/project_config.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/file_copier.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/providers.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/dependency_graph.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/intent_detector.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/memory/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/memory/capture.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/memory/digest_schema.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/memory/finalize.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/memory/recall.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/minimality_report.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/ralph_state.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/repo_insight.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/research_eval.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skill_ir.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/runner.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/.gitignore +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/config.toml +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-understand/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/README.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/settings.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/README.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/map-understand/SKILL.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/codex/skills/map-understand/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/map-understand/SKILL.md.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/token_budget.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/tool_output_offload.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/tools/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/verification_recorder.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/workflow_finalizer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/workflow_logger.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/workflow_state.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/conftest.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/fixtures/codex/config.toml +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/hooks/test_end_of_turn.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/hooks/test_hook_inventory_smoke.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/blueprint.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/code_review.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/plan_handoff.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/spec.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/task_plan.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/fixtures/verification_summary.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/README.md +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
- {mapify_cli-3.18.0 → 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.18.0 → mapify_cli-3.19.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_agent_cli_correctness.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_agent_dispatch_audit.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_agent_frontmatter.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_bump_version.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_compaction_offload_integration.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_dependency_graph.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_diagnostics.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_digest_schema.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_file_copier.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_hook_patterns.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_init_import_graph.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_intent_detector.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_jinja2_dep.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_locking.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_managed_file_copier.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_map_token_meter.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_map_utils_sanitize.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_memory_capture.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_memory_finalize.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_memory_integration.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_memory_recall.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_memory_review_fixes.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_minimality_report.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_post_compact_context.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_prompt_layering.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_pyyaml_dep.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_ralph_hooks.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_ralph_state.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_repo_insight.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_research_eval.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_schemas.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skill_ir.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_consistency.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_aggregator.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_apply.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_cli_optimize.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_fixtures.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_optimizer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_proposer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_runner.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_schema.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_skills_eval_viewer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_sofa_client.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_sofa_search.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_token_budget.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_tool_output_offload.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_validate_dependencies.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_validate_spec_citations.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_verification_recorder.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_workflow_finalizer.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_workflow_gate.py +0 -0
- {mapify_cli-3.18.0 → mapify_cli-3.19.0}/tests/test_workflow_logger.py +0 -0
- {mapify_cli-3.18.0 → 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
|
|
@@ -274,6 +274,15 @@ mapify init . --sofa # opt-in: enable the map-so-search skill
|
|
|
274
274
|
|
|
275
275
|
This writes `sofa.enabled: true` to `.map/config.yaml` and adds `.sofa/` to your `.gitignore`. Without the flag, no SOFA code path runs. See the [SOFA usage guide](docs/USAGE.md#stack-overflow-for-agents-sofa).
|
|
276
276
|
|
|
277
|
+
**Autonomy posture** (`--autonomy`, claude provider) — **off by default**, opt-in "YOLO-minus-git":
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
mapify init . --autonomy # auto-approve most tools; keep git commit/push for the human
|
|
281
|
+
mapify init . --no-autonomy # remove the autonomy posture
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
`--autonomy` writes a broad auto-approve allowlist plus a `git commit`/`push` deny into the **per-user, gitignored** `.claude/settings.local.json` (the committed team `.claude/settings.json` stays the secure baseline) and gitignores that file. The git block is enforced by the `safety-guardrails.py` PreToolUse hook (the permission deny alone is bypassable under a broad `Bash(*)` allow). Omit the flag to leave existing local settings untouched on re-init. See the [autonomy usage guide](docs/USAGE.md#autonomy-posture-yolo-minus-git).
|
|
285
|
+
|
|
277
286
|
</details>
|
|
278
287
|
|
|
279
288
|
## Documentation
|
|
@@ -229,6 +229,15 @@ mapify init . --sofa # opt-in: enable the map-so-search skill
|
|
|
229
229
|
|
|
230
230
|
This writes `sofa.enabled: true` to `.map/config.yaml` and adds `.sofa/` to your `.gitignore`. Without the flag, no SOFA code path runs. See the [SOFA usage guide](docs/USAGE.md#stack-overflow-for-agents-sofa).
|
|
231
231
|
|
|
232
|
+
**Autonomy posture** (`--autonomy`, claude provider) — **off by default**, opt-in "YOLO-minus-git":
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
mapify init . --autonomy # auto-approve most tools; keep git commit/push for the human
|
|
236
|
+
mapify init . --no-autonomy # remove the autonomy posture
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`--autonomy` writes a broad auto-approve allowlist plus a `git commit`/`push` deny into the **per-user, gitignored** `.claude/settings.local.json` (the committed team `.claude/settings.json` stays the secure baseline) and gitignores that file. The git block is enforced by the `safety-guardrails.py` PreToolUse hook (the permission deny alone is bypassable under a broad `Bash(*)` allow). Omit the flag to leave existing local settings untouched on re-init. See the [autonomy usage guide](docs/USAGE.md#autonomy-posture-yolo-minus-git).
|
|
240
|
+
|
|
232
241
|
</details>
|
|
233
242
|
|
|
234
243
|
## Documentation
|
|
@@ -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)
|
|
@@ -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"
|
|
@@ -501,6 +501,13 @@ BLUEPRINT_SCHEMA = {
|
|
|
501
501
|
"additionalProperties": True,
|
|
502
502
|
},
|
|
503
503
|
},
|
|
504
|
+
# Forward-coverage source-of-truth: the authoritative list of requirement
|
|
505
|
+
# IDs lives in the spec's Requirements Index (the mapify:requirements-index:v1
|
|
506
|
+
# block, parsed by parse_requirements_index in map_step_runner). The
|
|
507
|
+
# decomposition-completeness gate diffs that index against these coverage_map
|
|
508
|
+
# keys. Acceptance criteria are deliberately NOT stored as a blueprint field
|
|
509
|
+
# (the decomposer cannot be trusted to declare the set it is checked against);
|
|
510
|
+
# coverage_map remains a mapping of those spec IDs to owning subtasks only.
|
|
504
511
|
"coverage_map": {
|
|
505
512
|
"type": "object",
|
|
506
513
|
"description": (
|
|
@@ -802,10 +809,15 @@ ARTIFACT_MANIFEST_SCHEMA = {
|
|
|
802
809
|
"spec": ARTIFACT_STAGE_SCHEMA,
|
|
803
810
|
"plan": ARTIFACT_STAGE_SCHEMA,
|
|
804
811
|
"test_contract": ARTIFACT_STAGE_SCHEMA,
|
|
812
|
+
"repro_probe": ARTIFACT_STAGE_SCHEMA,
|
|
805
813
|
"implementation": ARTIFACT_STAGE_SCHEMA,
|
|
806
814
|
"review": ARTIFACT_STAGE_SCHEMA,
|
|
807
815
|
"verification": ARTIFACT_STAGE_SCHEMA,
|
|
808
816
|
"retry_quarantine": ARTIFACT_STAGE_SCHEMA,
|
|
817
|
+
"flaky_test_triage": ARTIFACT_STAGE_SCHEMA,
|
|
818
|
+
"qualitative_convergence": ARTIFACT_STAGE_SCHEMA,
|
|
819
|
+
"anti_repeat": ARTIFACT_STAGE_SCHEMA,
|
|
820
|
+
"escalation": ARTIFACT_STAGE_SCHEMA,
|
|
809
821
|
"token_budget": ARTIFACT_STAGE_SCHEMA,
|
|
810
822
|
"run_health": ARTIFACT_STAGE_SCHEMA,
|
|
811
823
|
"learn_handoff": ARTIFACT_STAGE_SCHEMA,
|
|
@@ -957,6 +969,101 @@ RETRY_QUARANTINE_SCHEMA = {
|
|
|
957
969
|
}
|
|
958
970
|
|
|
959
971
|
|
|
972
|
+
FLAKY_TEST_TRIAGE_EVIDENCE_SCHEMA = {
|
|
973
|
+
"type": "object",
|
|
974
|
+
"properties": {
|
|
975
|
+
"run": {"type": "integer", "minimum": 1},
|
|
976
|
+
"status": {"type": "string", "enum": ["passed", "failed"]},
|
|
977
|
+
"exit_code": {"type": "integer"},
|
|
978
|
+
"summary": {"type": "string"},
|
|
979
|
+
"timed_out": {"type": "boolean"},
|
|
980
|
+
"duration_seconds": {"type": "number", "minimum": 0},
|
|
981
|
+
"stdout_tail": {"type": "string"},
|
|
982
|
+
"stderr_tail": {"type": "string"},
|
|
983
|
+
},
|
|
984
|
+
"required": ["run", "status", "exit_code", "summary"],
|
|
985
|
+
"additionalProperties": False,
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
FLAKY_TEST_TRIAGE_ENTRY_SCHEMA = {
|
|
990
|
+
"type": "object",
|
|
991
|
+
"properties": {
|
|
992
|
+
"check_id": {"type": "string"},
|
|
993
|
+
"command": {"type": "string"},
|
|
994
|
+
"reason": {"type": "string"},
|
|
995
|
+
"run_count": {"type": "integer", "minimum": 1},
|
|
996
|
+
"pass_count": {"type": "integer", "minimum": 0},
|
|
997
|
+
"fail_count": {"type": "integer", "minimum": 0},
|
|
998
|
+
"outcome_sequence": {
|
|
999
|
+
"type": "array",
|
|
1000
|
+
"items": {"type": "string", "enum": ["passed", "failed"]},
|
|
1001
|
+
"minItems": 1,
|
|
1002
|
+
},
|
|
1003
|
+
"disposition": {
|
|
1004
|
+
"type": "string",
|
|
1005
|
+
"enum": [
|
|
1006
|
+
"deferred_nondeterministic",
|
|
1007
|
+
"deterministic_failure",
|
|
1008
|
+
"not_reproduced",
|
|
1009
|
+
"insufficient_evidence",
|
|
1010
|
+
],
|
|
1011
|
+
},
|
|
1012
|
+
"recommended_next_action": {"type": "string"},
|
|
1013
|
+
"monitor_verdict_policy": {
|
|
1014
|
+
"type": "string",
|
|
1015
|
+
"enum": ["not_valid_without_explicit_triage"],
|
|
1016
|
+
},
|
|
1017
|
+
"operator_requirements": {
|
|
1018
|
+
"type": "array",
|
|
1019
|
+
"items": {"type": "string"},
|
|
1020
|
+
"minItems": 1,
|
|
1021
|
+
},
|
|
1022
|
+
"evidence": {
|
|
1023
|
+
"type": "array",
|
|
1024
|
+
"items": FLAKY_TEST_TRIAGE_EVIDENCE_SCHEMA,
|
|
1025
|
+
"minItems": 1,
|
|
1026
|
+
},
|
|
1027
|
+
},
|
|
1028
|
+
"required": [
|
|
1029
|
+
"check_id",
|
|
1030
|
+
"command",
|
|
1031
|
+
"reason",
|
|
1032
|
+
"run_count",
|
|
1033
|
+
"pass_count",
|
|
1034
|
+
"fail_count",
|
|
1035
|
+
"outcome_sequence",
|
|
1036
|
+
"disposition",
|
|
1037
|
+
"recommended_next_action",
|
|
1038
|
+
"monitor_verdict_policy",
|
|
1039
|
+
"operator_requirements",
|
|
1040
|
+
"evidence",
|
|
1041
|
+
],
|
|
1042
|
+
"additionalProperties": False,
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
|
|
1046
|
+
FLAKY_TEST_TRIAGE_SCHEMA = {
|
|
1047
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1048
|
+
"$id": "https://mapframework.dev/schemas/flaky-test-triage.json",
|
|
1049
|
+
"title": "MAP Flaky Test Triage",
|
|
1050
|
+
"description": "Repeated check evidence stored in .map/<branch>/flaky_test_triage.json",
|
|
1051
|
+
"type": "object",
|
|
1052
|
+
"properties": {
|
|
1053
|
+
"schema_version": {"type": "string"},
|
|
1054
|
+
"branch": {"type": "string"},
|
|
1055
|
+
"updated_at": {"type": "string", "format": "date-time"},
|
|
1056
|
+
"triages": {
|
|
1057
|
+
"type": "array",
|
|
1058
|
+
"items": FLAKY_TEST_TRIAGE_ENTRY_SCHEMA,
|
|
1059
|
+
"minItems": 1,
|
|
1060
|
+
},
|
|
1061
|
+
},
|
|
1062
|
+
"required": ["schema_version", "branch", "updated_at", "triages"],
|
|
1063
|
+
"additionalProperties": False,
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
|
|
960
1067
|
TEST_HANDOFF_SCHEMA = {
|
|
961
1068
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
962
1069
|
"$id": "https://mapframework.dev/schemas/test-handoff.json",
|
|
@@ -489,6 +489,16 @@ exhaustive test matrices by default.
|
|
|
489
489
|
- [ ] When using training data for unfamiliar patterns, tag with `[training-data]` in Approach section
|
|
490
490
|
- [ ] Tag verified sources: `[code: path/to/file.py:line]`, `[training-data]`
|
|
491
491
|
|
|
492
|
+
### Qualitative Self-Review Convergence (Opt-In Only)
|
|
493
|
+
- [ ] If the caller explicitly requests self-review convergence, treat this
|
|
494
|
+
checklist run as one bounded pass and return concrete evidence for every
|
|
495
|
+
`clean=true` claim.
|
|
496
|
+
- [ ] `clean` means no critical findings in this pass, not proof of correctness.
|
|
497
|
+
If you find a blocker, report it as a critical finding; do not soften it to
|
|
498
|
+
help the convergence loop finish.
|
|
499
|
+
- [ ] On pass N>1, verify prior critical findings are resolved before looking
|
|
500
|
+
for new regressions.
|
|
501
|
+
|
|
492
502
|
### SFT Comfort Zone (Token Discipline)
|
|
493
503
|
- [ ] Each function/method body stays within ~100 lines (~4000 tokens)
|
|
494
504
|
- [ ] If a function exceeds this: split into sub-functions with their own inline contracts
|
|
@@ -467,6 +467,22 @@ IF {{feedback}} contains previous review findings:
|
|
|
467
467
|
}
|
|
468
468
|
```
|
|
469
469
|
|
|
470
|
+
### Qualitative Convergence Passes (Opt-In Only)
|
|
471
|
+
|
|
472
|
+
When the caller explicitly marks this subtask/gate for qualitative convergence,
|
|
473
|
+
your current review is one pass in a bounded sequence. The caller records each
|
|
474
|
+
pass with `record_qualitative_convergence`; you must make the pass auditable:
|
|
475
|
+
|
|
476
|
+
- `clean` means **no critical findings for this gate**, not globally defect-free.
|
|
477
|
+
- A clean pass must still cite evidence (`path:line`, test command, or artifact)
|
|
478
|
+
for the contract slices you checked.
|
|
479
|
+
- A non-clean pass must list concrete critical findings; do not emit
|
|
480
|
+
`clean=true` with findings or `clean=false` with no blocker.
|
|
481
|
+
- On pass N>1, first verify the prior pass's critical findings are resolved and
|
|
482
|
+
that the fix did not introduce regressions; then perform the normal review.
|
|
483
|
+
- Do not soften critical findings to help the run converge. If the max-pass cap
|
|
484
|
+
is reached, the caller escalates instead of treating the gate as passed.
|
|
485
|
+
|
|
470
486
|
### Disputed Findings Protocol
|
|
471
487
|
|
|
472
488
|
```
|
{mapify_cli-3.18.0 → mapify_cli-3.19.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md
RENAMED
|
@@ -44,7 +44,9 @@ These constraints apply before any write-capable step:
|
|
|
44
44
|
sidecar artifacts: `record_test_baseline`, `save_research`, `load_research`,
|
|
45
45
|
`build_context_block`, `detect_truncated_agent_output`,
|
|
46
46
|
`detect_actor_files_changed_mismatch`, `detect_symbol_blast_radius`,
|
|
47
|
-
`detect_cross_subtask_regression_risk`, `
|
|
47
|
+
`detect_cross_subtask_regression_risk`, `run_flaky_test_triage`,
|
|
48
|
+
`record_flaky_test_triage`,
|
|
49
|
+
`validate_flaky_test_triage`, `write_run_health_report`.
|
|
48
50
|
|
|
49
51
|
## Argument Handling
|
|
50
52
|
|
|
@@ -239,6 +241,15 @@ python3 .map/scripts/map_orchestrator.py monitor_failed --feedback "$MONITOR_FEE
|
|
|
239
241
|
Write a durable `.map/<branch>/code-review-N.md` with exact issues and then fix
|
|
240
242
|
the current subtask. Do not advance until Monitor passes.
|
|
241
243
|
|
|
244
|
+
If the failure is inconsistent across repeated identical check runs, record the
|
|
245
|
+
run evidence with `run_flaky_test_triage` (or `record_flaky_test_triage` if the
|
|
246
|
+
repeated runs were already collected) and validate
|
|
247
|
+
`flaky_test_triage.json` before reporting `deferred_nondeterministic`. This is
|
|
248
|
+
not a passing gate: do not weaken, skip, or delete the check, and do not return
|
|
249
|
+
a silent green. After validation, close with
|
|
250
|
+
`python3 .map/scripts/map_orchestrator.py defer_flaky_subtask "$SUBTASK_ID" --check-id "<check-id>"`,
|
|
251
|
+
not `validate_step 2.4 --recommendation proceed`.
|
|
252
|
+
|
|
242
253
|
On a clean pass, run the regression gate and record the subtask:
|
|
243
254
|
|
|
244
255
|
```bash
|