claude-dev-env 2.16.0 → 2.18.0
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.
- package/.agents/agents/AGENTS.md +6 -0
- package/.agents/skills/AGENTS.md +34 -35
- package/.agents/skills/_shared/pr-loop/AGENTS.md +22 -15
- package/.agents/skills/_shared/pr-loop/portable-driver.md +6 -7
- package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +2 -2
- package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +1 -1
- package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +25 -16
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +1 -5
- package/.agents/skills/autoconverge/reference/convergence-gates.md +31 -0
- package/.agents/skills/autoconverge/reference/convergence.md +8 -10
- package/.agents/skills/autoconverge/reference/gotchas.md +1 -1
- package/.agents/skills/autoconverge/reference/stop-conditions.md +1 -1
- package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +1 -1
- package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +1 -1
- package/.agents/skills/autoconverge/workflow/converge.mjs +3 -3
- package/.agents/skills/cert-classification-rule/SKILL.md +224 -0
- package/.agents/skills/cert-classification-rule/scripts/resort_cert_folders.py +158 -0
- package/.agents/skills/eli5/SKILL.md +128 -0
- package/.agents/skills/eli5/reference/task-seeds.md +11 -0
- package/.agents/skills/fresh-branch/scripts/test_create_fresh_branch.py +2 -3
- package/.agents/skills/name-by-capability-audit/SKILL.md +67 -0
- package/.agents/skills/name-by-capability-audit/reference/fetch-commands.md +29 -0
- package/.agents/skills/name-by-capability-audit/reference/offense-examples.md +32 -0
- package/.agents/skills/name-by-capability-audit/reference/report-template.md +29 -0
- package/.agents/skills/name-by-capability-audit/reference/rule-checklist.md +38 -0
- package/.agents/skills/name-by-capability-audit/reference/task-seeds.md +9 -0
- package/.agents/skills/orchestrator/SKILL.md +6 -4
- package/.agents/skills/orchestrator-refresh/SKILL.md +9 -5
- package/.agents/skills/pr-cleanup/SKILL.md +99 -0
- package/.agents/skills/prototype/reference/honest-limitations.md +1 -1
- package/.agents/skills/prototype/reference/promotion-tasks.md +1 -1
- package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +2 -2
- package/.agents/skills/prototype/workflows/promotion.md +2 -2
- package/.agents/skills/review-router/SKILL.md +51 -0
- package/.agents/skills/review-router/reference/route-policy.json +7 -0
- package/.agents/skills/review-router/reference/task-seeds.md +1 -0
- package/.agents/skills/review-router/scripts/conftest.py +4 -0
- package/.agents/skills/review-router/scripts/review_router.py +50 -0
- package/.agents/skills/review-router/scripts/review_router_cli.py +211 -0
- package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +1 -0
- package/.agents/skills/review-router/scripts/review_router_constants/config/__init__.py +0 -0
- package/.agents/skills/review-router/scripts/review_router_constants/config/constants.py +13 -0
- package/.agents/skills/review-router/scripts/test_review_router.py +23 -0
- package/.agents/skills/review-router/scripts/test_review_router_cli.py +47 -0
- package/.agents/skills/review-tier/SKILL.md +56 -0
- package/.agents/skills/review-tier/reference/task-seeds.md +1 -0
- package/.agents/skills/review-tier/reference/tier-policy.json +9 -0
- package/.agents/skills/review-tier/scripts/conftest.py +4 -0
- package/.agents/skills/review-tier/scripts/review_tier.py +332 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +1 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/config/__init__.py +0 -0
- package/.agents/skills/review-tier/scripts/review_tier_constants/config/constants.py +29 -0
- package/.agents/skills/review-tier/scripts/test_generation.py +171 -0
- package/.agents/skills/review-tier/scripts/test_review_tier.py +33 -0
- package/.agents/skills/session-log/SKILL.md +1 -1
- package/.agents/skills/shared-extraction-audit/SKILL.md +160 -0
- package/.agents/skills/shared-extraction-audit/reference/examples.md +46 -0
- package/.agents/skills/shared-extraction-audit/reference/offense-taxonomy.md +100 -0
- package/.agents/skills/source-command-logifix/SKILL.md +29 -0
- package/.agents/skills/source-command-sr-loop/SKILL.md +58 -0
- package/.agents/skills/team-advisor/SKILL.md +5 -5
- package/.agents/skills-archived/AGENTS.md +45 -0
- package/.agents/{skills → skills-archived}/anthropic-plan/AGENTS.md +1 -1
- package/.agents/{skills → skills-archived}/bugteam/scripts/reflow_skill_md.py +3 -3
- package/.agents/{skills → skills-archived}/codex-review/test_skill_scaffold.py +1 -1
- package/.agents/{skills → skills-archived}/copilot-finding-triage/SKILL.md +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/SKILL.md +6 -6
- package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/AGENTS.md +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/constants.py +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/reference/multi-pr-orchestration.md +1 -1
- package/.agents/{skills → skills-archived}/pr-converge/reference/per-tick.md +3 -3
- package/.agents/{skills → skills-archived}/pr-converge/scripts/reflow_skill_md.py +2 -2
- package/.agents/{skills → skills-archived}/pr-converge/test_portable_pacer_gate.py +6 -2
- package/.agents/{skills → skills-archived}/pr-converge/workflows/schedule-wakeup-loop.md +1 -1
- package/.agents/{skills → skills-archived}/split-pr/reference/proposal-format.md +1 -1
- package/AGENTS.md +34 -58
- package/_shared/AGENTS.md +2 -0
- package/_shared/advisor/AGENTS.md +5 -5
- package/_shared/advisor/advisor-protocol.md +54 -31
- package/_shared/advisor/reference/advisor-block.md +5 -1
- package/_shared/advisor/reference/consult-format.md +1 -1
- package/_shared/advisor/reference/identity.md +28 -0
- package/_shared/advisor/reference/lifecycle.md +8 -1
- package/_shared/advisor/reference/sol-rung.md +14 -9
- package/_shared/advisor/reference/spawn-walk-log.md +6 -5
- package/_shared/advisor/reference/third-party-bind.md +6 -7
- package/_shared/advisor/reference/warm-up.md +9 -2
- package/_shared/advisor/scripts/codex_sol_advisor.py +66 -11
- package/_shared/advisor/scripts/config/advisor_scripts_constants/advisor_route_constants.py +9 -0
- package/_shared/advisor/scripts/config/advisor_scripts_constants/model_tier_run_validator_constants.py +16 -4
- package/_shared/advisor/scripts/config/advisor_scripts_constants/sol_advisor_constants.py +11 -10
- package/_shared/advisor/scripts/model_tier_run_validator.py +50 -23
- package/_shared/advisor/scripts/tests/test_codex_sol_advisor.py +108 -3
- package/_shared/advisor/scripts/tests/test_model_tier_run_validator.py +171 -82
- package/_shared/advisor/scripts/tests/test_tier_model_ids.py +43 -0
- package/_shared/advisor/scripts/tier_model_ids.py +75 -7
- package/_shared/pr-loop/audit-reply-template.md +4 -0
- package/_shared/pr-loop/fix-protocol.md +7 -6
- package/_shared/pr-loop/gh-payloads.md +8 -6
- package/_shared/pr-loop/precatch-rubric.md +6 -5
- package/_shared/pr-loop/scripts/AGENTS.md +15 -0
- package/_shared/pr-loop/scripts/_pr_converge_path_setup.py +38 -0
- package/_shared/pr-loop/scripts/check_bugbot_ci.py +279 -0
- package/_shared/pr-loop/scripts/check_convergence.py +923 -0
- package/_shared/pr-loop/scripts/check_convergence_availability.py +275 -0
- package/_shared/pr-loop/scripts/check_convergence_gates.py +279 -0
- package/_shared/pr-loop/scripts/check_convergence_thread_gates.py +219 -0
- package/_shared/pr-loop/scripts/check_pending_reviews.py +154 -0
- package/_shared/pr-loop/scripts/codex_down_classifier.py +98 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +1 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/AGENTS.md +18 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/__init__.py +1 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/classifier_constants.py +35 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +82 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/findings_constants.py +18 -0
- package/_shared/pr-loop/scripts/codex_review_scripts_constants/run_constants.py +53 -0
- package/_shared/pr-loop/scripts/codex_usage_probe.py +570 -0
- package/_shared/pr-loop/scripts/conftest.py +43 -0
- package/_shared/pr-loop/scripts/fetch_copilot_reviews.py +134 -0
- package/_shared/pr-loop/scripts/fixtures/auth_failure_synthetic.txt +1 -0
- package/_shared/pr-loop/scripts/fixtures/config_load_failure_v0.125.0.txt +1 -0
- package/_shared/pr-loop/scripts/fixtures/freeform_findings_v0.144.3.txt +6 -0
- package/_shared/pr-loop/scripts/fixtures/model_rejection_v0.125.0.jsonl +5 -0
- package/_shared/pr-loop/scripts/fixtures/structured_findings.txt +13 -0
- package/_shared/pr-loop/scripts/fixtures/success_stream_v0.144.3.jsonl +6 -0
- package/_shared/pr-loop/scripts/fixtures/unknown_failure_synthetic.txt +1 -0
- package/_shared/pr-loop/scripts/fixtures/usage_limit_synthetic.txt +1 -0
- package/_shared/pr-loop/scripts/parse_codex_findings.py +207 -0
- package/_shared/pr-loop/scripts/post_fix_reply.py +168 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +1 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/AGENTS.md +18 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/__init__.py +0 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +70 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/pr_converge_constants.py +118 -0
- package/_shared/pr-loop/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +13 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/.claude/CLAUDE.md +1 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/AGENTS.md +26 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/__init__.py +0 -0
- package/_shared/pr-loop/scripts/pr_converge_skill_constants/constants.py +69 -0
- package/_shared/pr-loop/scripts/run_codex_review.py +609 -0
- package/_shared/pr-loop/scripts/test__pr_converge_path_setup.py +30 -0
- package/_shared/pr-loop/scripts/test_check_bugbot_ci.py +312 -0
- package/_shared/pr-loop/scripts/test_check_convergence.py +438 -0
- package/_shared/pr-loop/scripts/test_check_convergence_availability.py +391 -0
- package/_shared/pr-loop/scripts/test_check_convergence_codex.py +517 -0
- package/_shared/pr-loop/scripts/test_check_convergence_contract.py +400 -0
- package/_shared/pr-loop/scripts/test_check_convergence_fixture.py +179 -0
- package/_shared/pr-loop/scripts/test_check_convergence_gates.py +84 -0
- package/_shared/pr-loop/scripts/test_check_convergence_thread_gates.py +99 -0
- package/_shared/pr-loop/scripts/test_codex_down_classifier.py +143 -0
- package/_shared/pr-loop/scripts/test_codex_usage_probe.py +683 -0
- package/_shared/pr-loop/scripts/test_parse_codex_findings.py +130 -0
- package/_shared/pr-loop/scripts/test_run_codex_review.py +969 -0
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +1 -1
- package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +1 -1
- package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +1 -1
- package/_shared/pr-loop/state-schema.md +20 -28
- package/_shared/pr-loop/worker-spawn.md +4 -3
- package/_shared/process-tree/AGENTS.md +3 -3
- package/bin/ever-shipped-skills.mjs +29 -1
- package/bin/install-constants.mjs +15 -6
- package/bin/install.agents-home.test.mjs +13 -0
- package/bin/install.cursor-rules.test.mjs +3 -3
- package/bin/install.mjs +80 -20
- package/bin/install.profile-root.test.mjs +1 -1
- package/bin/install.prune.test.mjs +23 -204
- package/bin/install.test.mjs +8 -5
- package/bin/resolve-install-root.mjs +21 -0
- package/bin/resolve-package-managed-directory.mjs +4 -4
- package/commands/AGENTS.md +2 -0
- package/commands/sr-loop.md +3 -0
- package/docs/references/prose-style-enforcement.md +3 -7
- package/docs/references/team-advisor-skill.md +2 -2
- package/hooks/AGENTS.md +0 -3
- package/hooks/blocking/AGENTS.md +0 -2
- package/hooks/blocking/ask_user_question_shape_blocker.py +83 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +2 -19
- package/hooks/blocking/state_description_blocker.py +1 -1
- package/hooks/blocking/test_ask_user_question_shape.py +69 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +17 -58
- package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +9 -104
- package/hooks/blocking/test_state_description_blocker.py +1 -0
- package/hooks/blocking/test_stop_dispatcher.py +1 -26
- package/hooks/hooks.json +1 -1
- package/hooks/hooks_constants/AGENTS.md +0 -3
- package/hooks/hooks_constants/ask_user_question_shape.py +1 -1
- package/hooks/hooks_constants/ask_user_question_shape_constants.py +73 -0
- package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +1 -2
- package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -1
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +0 -7
- package/hooks/hooks_constants/stop_dispatcher_constants.py +0 -1
- package/hooks/hooks_constants/test_ask_user_question_shape.py +1 -1
- package/hooks/hooks_constants/test_prose_metrics_parity.py +29 -107
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +0 -1
- package/hooks/hooks_constants/working_style_prompt_constants.py +9 -10
- package/hooks/session/AGENTS.md +4 -1
- package/hooks/session/test_working_style_prompt.py +8 -4
- package/hooks/session/working_style_prompt.py +4 -2
- package/package.json +1 -4
- package/rules/AGENTS.md +2 -5
- package/rules/asd-ste100-language.md +39 -0
- package/rules/ask-user-question-required.md +1 -1
- package/rules/long-horizon-autonomy.md +1 -1
- package/scripts/AGENTS.md +1 -0
- package/scripts/Show-Asset.ps1 +106 -0
- package/scripts/test_validate_instruction_pairs.py +30 -3
- package/scripts/tests/test_engine.py +4 -4
- package/scripts/tests/test_rules.py +5 -5
- package/system-prompts/AGENTS.md +8 -0
- package/system-prompts/software-engineer.xml +8 -3
- package/.agents/skills/grokify/evals/README.md +0 -72
- package/.agents/skills/grokify/evals/parse-payload.test.mjs +0 -171
- package/.agents/skills/grokify/evals/run-capability-evals.mjs +0 -545
- package/_shared/pr-loop/scripts/README.md +0 -21
- package/docs/imagegen.md +0 -22
- package/hooks/blocking/eli11_reply_enforcer.py +0 -436
- package/hooks/blocking/plain_language_blocker.py +0 -758
- package/hooks/blocking/test_eli11_reply_enforcer.py +0 -390
- package/hooks/blocking/test_plain_language_blocker.py +0 -683
- package/hooks/blocking/test_plain_language_blocker_allowlist.py +0 -228
- package/hooks/diagnostic/AGENTS.md +0 -75
- package/hooks/diagnostic/CLAUDE.md +0 -1
- package/hooks/diagnostic/hook_log_extractor.py +0 -875
- package/hooks/diagnostic/hook_log_init.py +0 -202
- package/hooks/diagnostic/hook_log_stop_wrapper.py +0 -26
- package/hooks/diagnostic/migrations/2026-04-25-drop-themes-hook-events.sql +0 -3
- package/hooks/diagnostic/migrations/AGENTS.md +0 -16
- package/hooks/diagnostic/migrations/CLAUDE.md +0 -1
- package/hooks/diagnostic/migrations/README.md +0 -76
- package/hooks/diagnostic/queries/AGENTS.md +0 -19
- package/hooks/diagnostic/queries/CLAUDE.md +0 -1
- package/hooks/diagnostic/queries/block_details_for_hook.sql +0 -26
- package/hooks/diagnostic/queries/blocks_by_category.sql +0 -10
- package/hooks/diagnostic/queries/blocks_by_tool.sql +0 -9
- package/hooks/diagnostic/queries/blocks_last_7_days.sql +0 -11
- package/hooks/diagnostic/queries/top_blockers_last_24_hours.sql +0 -12
- package/hooks/diagnostic/queries/top_blockers_overall.sql +0 -12
- package/hooks/diagnostic/requirements-hook-logs-dev.txt +0 -2
- package/hooks/diagnostic/requirements-hook-logs.txt +0 -1
- package/hooks/diagnostic/schema.sql +0 -51
- package/hooks/diagnostic/test_hook_log_extractor.py +0 -1518
- package/hooks/diagnostic/test_hook_log_init.py +0 -227
- package/hooks/diagnostic/test_hook_log_stop_wrapper.py +0 -17
- package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +0 -94
- package/hooks/hooks_constants/hook_log_extractor_constants.py +0 -233
- package/hooks/hooks_constants/plain_language_blocker_constants.py +0 -366
- package/hooks/hooks_constants/test_hook_log_extractor_constants.py +0 -123
- package/rules/doc-prose-cuts.md +0 -58
- package/rules/eli11-replies.md +0 -36
- package/rules/opus5-communication-contract.md +0 -45
- package/rules/plain-language.md +0 -9
- /package/.agents/{skills → skills-archived}/anthropic-plan/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/anthropic_plan_scripts_constants/validate_packet_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/test_validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/scripts/validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/README.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/build-prompt.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/reuse-audit.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/source-map.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/templates/visual-plan.template.html +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/test_skill_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.contract.test.mjs +0 -0
- /package/.agents/{skills → skills-archived}/anthropic-plan/workflow/plan-packet.mjs +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/auditing-claude-config/reference/probe-hook.md +0 -0
- /package/.agents/{skills → skills-archived}/beat-sheet/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/beat-sheet/reference/visual-beats.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/CONSTRAINTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/EXAMPLES.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/PROMPTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/README.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/audit-and-teammates.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/copilot-gap-analysis.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/design-rationale.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/github-pr-reviews.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-assign-ids.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-capture-excerpts.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-walk-categories.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/audit-write-xml.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-append-summary.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-apply-fixes.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-add-commit.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-git-push.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-post-reply.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-publish-summary.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-py-compile.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-read-files.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-resolve-thread.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-test-suite.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-violation-count.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/obstacles/fix-write-xml.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/reference/team-setup.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/README.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_code_rules_gate.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_fix_hookspath.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_preflight.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/probe_code_rules_enforcer_check_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/reflow_skill_md_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/bugteam_scripts_constants/windows_safe_rmtree_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/probe_code_rules_enforcer_check.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_code_rules_gate.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_fix_hookspath.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_bugteam_preflight.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_probe_code_rules_enforcer_check.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/test_windows_safe_rmtree.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/scripts/windows_safe_rmtree.py +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/sources.md +0 -0
- /package/.agents/{skills → skills-archived}/bugteam/test_skill_additions.py +0 -0
- /package/.agents/{skills → skills-archived}/closeout/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/closeout/reference/handoff-prompt-template.md +0 -0
- /package/.agents/{skills → skills-archived}/closeout/reference/pii-redaction-checklist.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/cli-contract.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/reference/loop-integration.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_down_classifier.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/classifier_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/codex_usage_probe_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/findings_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_review_scripts_constants/run_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/codex_usage_probe.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/auth_failure_synthetic.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/config_load_failure_v0.125.0.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/freeform_findings_v0.144.3.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/model_rejection_v0.125.0.jsonl +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/structured_findings.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/success_stream_v0.144.3.jsonl +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/unknown_failure_synthetic.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/fixtures/usage_limit_synthetic.txt +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/parse_codex_findings.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/run_codex_review.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_down_classifier.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_codex_usage_probe.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_parse_codex_findings.py +0 -0
- /package/.agents/{skills → skills-archived}/codex-review/scripts/test_run_codex_review.py +0 -0
- /package/.agents/{skills → skills-archived}/comments/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/condensing-instructions/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/reference/tier-rubric.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/conftest.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/copilot_finding_triage_constants/config/notify_ntfy_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/notify_ntfy.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/scripts/test_notify_ntfy.py +0 -0
- /package/.agents/{skills → skills-archived}/copilot-finding-triage/templates/notification.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/copilot-review/templates/subagent-prompt.md +0 -0
- /package/.agents/{skills → skills-archived}/descriptions/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/emergencies/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/grokify/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/grokify/capability-claims.test.mjs +0 -0
- /package/.agents/{skills → skills-archived}/grokify/templates/handoff-template.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/final-validation-tasks.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/model-routing.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-contract.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/packet-schema.json +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/process-inventory.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/review-loop.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/run-record.schema.json +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/self-audit-tasks.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-seeds.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/reference/task-ticket.md +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/config/constants.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/create_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/load_skill_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_create_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_protocol.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/test_validate_run.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_packet.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_protocol.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/scripts/validate_run.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/test_skill_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/plan-to-pr/test_task_ticket_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/pr_converge_skill_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/convergence-gates.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/examples.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/fix-protocol.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/ground-rules.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-post-replies.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-publish-summary.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-push.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-read-filelines.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-reset-state.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-resolve-threads.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-spawn-clean-coder.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-stage-commit.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-trigger-bugbot.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/obstacles/fix-write-test.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/progress-checklist.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/state-schema.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/reference/stop-conditions.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/README.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/_pr_converge_path_setup.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/caller-window-pid.ps1 +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_bugbot_ci.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_availability.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_convergence_thread_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/check_pending_reviews.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/conftest.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-caller.cmd +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue-stop-others.ps1 +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.ahk +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/cursor-agents-continue.cmd +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/fetch_copilot_reviews.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/post_fix_reply.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/convergence_gate_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/pr_converge_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/pr_converge_scripts_constants/reflow_skill_md_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test__pr_converge_path_setup.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_bugbot_ci.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_availability.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_codex.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_fixture.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_check_convergence_thread_gates.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_cursor_agents_continue.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/scripts/test_reflow_skill_md.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/test_step5_host_branch.py +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/workflows/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-converge/workflows/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-fix-protocol/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/identity-and-hooks.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-cloud-transport/reference/substitution-matrix.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/pr-loop-lifecycle/reference/teardown-publish-permissions.md +0 -0
- /package/.agents/{skills → skills-archived}/recall/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/recall/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/recall/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/release-notes-html/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/remember/.claude/CLAUDE.md +0 -0
- /package/.agents/{skills → skills-archived}/remember/AGENTS.md +0 -0
- /package/.agents/{skills → skills-archived}/remember/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/reviewer-gates/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/reviews/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/show/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/accessibility.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/art.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/charts.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/core-design.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/erds.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/flowcharts.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/host-and-html.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/illustrative-diagrams.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/interaction.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/mockups.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/quality-gates.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/structural-diagrams.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/subject-inventory.md +0 -0
- /package/.agents/{skills → skills-archived}/show/references/svg-contract.md +0 -0
- /package/.agents/{skills → skills-archived}/show/routing.yaml +0 -0
- /package/.agents/{skills → skills-archived}/show/samples/pr1262-v2.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/scripts/README.md +0 -0
- /package/.agents/{skills → skills-archived}/show/scripts/validate-artifact.py +0 -0
- /package/.agents/{skills → skills-archived}/show/scripts/validate-package.py +0 -0
- /package/.agents/{skills → skills-archived}/show/templates/html-widget.html +0 -0
- /package/.agents/{skills → skills-archived}/show/templates/svg-base.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/css-var.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/dead-ref.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/filled-glyph.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/inherited-fill.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/invalid.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/large-canvas.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/unfilled-connector.svg +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/fixtures/valid.html +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/test_validate-artifact.py +0 -0
- /package/.agents/{skills → skills-archived}/show/tests/test_validators.py +0 -0
- /package/.agents/{skills → skills-archived}/show/workflows/create-visual.md +0 -0
- /package/.agents/{skills → skills-archived}/show/workflows/review-visual.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/SKILL.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/reference/path-layers.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/reference/split-further-loop.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/reference/splitting-principles.md +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/analyze_pr.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/categorize_files.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/__init__.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/dependency_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/git_operations_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/packing_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/plan_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/config/split_pr_constants.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/execute_split_slices.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/pack_files_into_slices.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_git_operations.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_layer_order.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_paginate.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_process_runner.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_script_types.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/split_pr_title.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_analyze_pr.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_categorize_files_packing.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_execute_split_slices.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_git_operations.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_layer_order.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_paginate.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_script_types.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_split_pr_title.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_contract.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/test_verify_plan_path_normalization.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_dependency_graph.py +0 -0
- /package/.agents/{skills → skills-archived}/split-pr/scripts/verify_plan.py +0 -0
|
@@ -26,16 +26,6 @@ from pathlib import Path
|
|
|
26
26
|
|
|
27
27
|
import _path_setup # noqa: F401
|
|
28
28
|
|
|
29
|
-
from plain_language_blocker import (
|
|
30
|
-
build_allow_advisory_payload as build_plain_language_allow_advisory_payload,
|
|
31
|
-
)
|
|
32
|
-
from plain_language_blocker import (
|
|
33
|
-
build_deny_payload as build_plain_language_deny_payload,
|
|
34
|
-
)
|
|
35
|
-
from plain_language_blocker import evaluate as evaluate_plain_language
|
|
36
|
-
from plain_language_blocker import (
|
|
37
|
-
evaluate_with_advisory as evaluate_plain_language_with_advisory,
|
|
38
|
-
)
|
|
39
29
|
from state_description_blocker import (
|
|
40
30
|
build_deny_payload as build_state_description_deny_payload,
|
|
41
31
|
)
|
|
@@ -50,7 +40,6 @@ from hooks_constants.pre_tool_use_dispatcher_constants import (
|
|
|
50
40
|
DENY_DECISION,
|
|
51
41
|
EXIT_CODE_TWO_DENY_REASON,
|
|
52
42
|
HOOK_EVENT_NAME,
|
|
53
|
-
PLAIN_LANGUAGE_BLOCKER_MODULE_NAME,
|
|
54
43
|
REASON_JOIN_SEPARATOR,
|
|
55
44
|
STATE_DESCRIPTION_BLOCKER_MODULE_NAME,
|
|
56
45
|
SYSTEM_MESSAGE_JOIN_SEPARATOR,
|
|
@@ -77,7 +66,7 @@ class NativeHook:
|
|
|
77
66
|
additionalContext, and suppressOutput).
|
|
78
67
|
evaluate_with_advisory: Optional evaluator that returns
|
|
79
68
|
``(deny_reason, advisory_system_message)`` so allow-path notices
|
|
80
|
-
match the standalone hook
|
|
69
|
+
match the standalone hook.
|
|
81
70
|
build_allow_advisory_payload: Optional builder for an allow payload that
|
|
82
71
|
carries the advisory systemMessage without denying.
|
|
83
72
|
"""
|
|
@@ -93,12 +82,6 @@ _native_hook_by_module_name: dict[str, NativeHook] = {
|
|
|
93
82
|
evaluate=evaluate_state_description,
|
|
94
83
|
build_deny_payload=build_state_description_deny_payload,
|
|
95
84
|
),
|
|
96
|
-
PLAIN_LANGUAGE_BLOCKER_MODULE_NAME: NativeHook(
|
|
97
|
-
evaluate=evaluate_plain_language,
|
|
98
|
-
build_deny_payload=build_plain_language_deny_payload,
|
|
99
|
-
evaluate_with_advisory=evaluate_plain_language_with_advisory,
|
|
100
|
-
build_allow_advisory_payload=build_plain_language_allow_advisory_payload,
|
|
101
|
-
),
|
|
102
85
|
}
|
|
103
86
|
|
|
104
87
|
|
|
@@ -504,7 +487,7 @@ def _emit_allow_decision(decision: DispatcherDecision) -> None:
|
|
|
504
487
|
Matches the shape a standalone hosted hook emits when it auto-approves the
|
|
505
488
|
write, so a write a hosted hook allows explicitly is auto-approved under the
|
|
506
489
|
dispatcher rather than falling back to the default permission flow. When a
|
|
507
|
-
hook also carried an advisory systemMessage
|
|
490
|
+
hook also carried an advisory systemMessage,
|
|
508
491
|
that notice rides on the allow payload without denying.
|
|
509
492
|
"""
|
|
510
493
|
allow_payload: dict[str, object] = {
|
|
@@ -351,7 +351,7 @@ def build_deny_payload(deny_reason: str) -> dict[str, object]:
|
|
|
351
351
|
"only the current state. For example:\n"
|
|
352
352
|
' BAD: "Uses X instead of Y" → GOOD: "Uses X"\n'
|
|
353
353
|
' BAD: "Previously configured via Z" → GOOD: "Configured via Z"\n'
|
|
354
|
-
"
|
|
354
|
+
"Apply ~/.claude/rules/asd-ste100-language.md for user-facing language."
|
|
355
355
|
),
|
|
356
356
|
},
|
|
357
357
|
"systemMessage": "Agent wrote comparative/historical language - describe current state only",
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Production-path tests for the AskUserQuestion shape hook."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
HOOK_PATH = Path(__file__).parent / "ask_user_question_shape_blocker.py"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _payload(question_text: str, option_description: str) -> dict[str, object]:
|
|
14
|
+
return {
|
|
15
|
+
"tool_name": "AskUserQuestion",
|
|
16
|
+
"tool_input": {
|
|
17
|
+
"questions": [
|
|
18
|
+
{
|
|
19
|
+
"question": question_text,
|
|
20
|
+
"header": "Gate",
|
|
21
|
+
"options": [{"label": "Run", "description": option_description}],
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _run_hook(payload_by_key: dict[str, object]) -> subprocess.CompletedProcess[str]:
|
|
29
|
+
return subprocess.run(
|
|
30
|
+
[sys.executable, str(HOOK_PATH)],
|
|
31
|
+
input=json.dumps(payload_by_key),
|
|
32
|
+
capture_output=True,
|
|
33
|
+
text=True,
|
|
34
|
+
check=False,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_lean_question_passes_through_the_runtime_hook() -> None:
|
|
39
|
+
completed = _run_hook(_payload("Which gate should run first?", "Runs on write."))
|
|
40
|
+
|
|
41
|
+
assert completed.returncode == 0
|
|
42
|
+
assert completed.stdout == ""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_question_with_list_detail_is_denied_by_the_runtime_hook() -> None:
|
|
46
|
+
completed = _run_hook(
|
|
47
|
+
_payload(
|
|
48
|
+
"Which gate should run first?\n- Write\n- Commit",
|
|
49
|
+
"Runs on write.",
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
parsed_payload = json.loads(completed.stdout)
|
|
54
|
+
hook_specific_output = parsed_payload["hookSpecificOutput"]
|
|
55
|
+
assert hook_specific_output["permissionDecision"] == "deny"
|
|
56
|
+
assert "list marker" in hook_specific_output["permissionDecisionReason"]
|
|
57
|
+
assert "question" in parsed_payload["systemMessage"].lower()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_non_question_tool_passes_through_the_runtime_hook() -> None:
|
|
61
|
+
completed = _run_hook(
|
|
62
|
+
{
|
|
63
|
+
"tool_name": "Write",
|
|
64
|
+
"tool_input": {"file_path": "notes.md", "content": "Text."},
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
assert completed.returncode == 0
|
|
69
|
+
assert completed.stdout == ""
|
|
@@ -289,34 +289,6 @@ def test_clean_write_allows_on_multi_edit_tool() -> None:
|
|
|
289
289
|
_assert_dispatcher_matches_individual_hooks(payload_text, MULTI_EDIT_TOOL_NAME)
|
|
290
290
|
|
|
291
291
|
|
|
292
|
-
def test_plain_language_heavy_prose_allows_on_write_of_markdown_file() -> None:
|
|
293
|
-
"""Dispatcher matches individual hooks: heavy prose allows (OP-07D advisory)."""
|
|
294
|
-
payload_text = _write_payload(
|
|
295
|
-
_MARKDOWN_FILE_PATH,
|
|
296
|
-
"# Guide\n\nPlease utilize this functionality to commence the process.\n",
|
|
297
|
-
)
|
|
298
|
-
_assert_dispatcher_matches_individual_hooks(payload_text, WRITE_TOOL_NAME)
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
def test_plain_language_heavy_prose_allows_on_edit_of_markdown_file() -> None:
|
|
302
|
-
"""Dispatcher matches individual hooks: heavy prose Edit allows (OP-07D)."""
|
|
303
|
-
payload_text = _edit_payload(
|
|
304
|
-
_MARKDOWN_FILE_PATH,
|
|
305
|
-
"old line",
|
|
306
|
-
"Please utilize this functionality to commence the process.\n",
|
|
307
|
-
)
|
|
308
|
-
_assert_dispatcher_matches_individual_hooks(payload_text, EDIT_TOOL_NAME)
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
def test_plain_language_heavy_prose_allows_on_multi_edit_of_markdown_file() -> None:
|
|
312
|
-
"""Dispatcher matches individual hooks: heavy prose MultiEdit allows (OP-07D)."""
|
|
313
|
-
payload_text = _multi_edit_payload(
|
|
314
|
-
_MARKDOWN_FILE_PATH,
|
|
315
|
-
[{"old_string": "old", "new_string": "Please utilize this functionality to commence."}],
|
|
316
|
-
)
|
|
317
|
-
_assert_dispatcher_matches_individual_hooks(payload_text, MULTI_EDIT_TOOL_NAME)
|
|
318
|
-
|
|
319
|
-
|
|
320
292
|
def test_dispatcher_docstring_points_at_roster_not_hardcoded_counts() -> None:
|
|
321
293
|
"""The dispatcher docstring names the roster, not per-tool counts that drift."""
|
|
322
294
|
dispatcher_source = Path(_DISPATCHER_SCRIPT).read_text(encoding="utf-8")
|
|
@@ -331,9 +303,8 @@ def test_multi_edit_runs_only_group_b_hooks() -> None:
|
|
|
331
303
|
|
|
332
304
|
The write_existing_file_blocker (Group A only) must not run on MultiEdit,
|
|
333
305
|
so a MultiEdit to any path that would trip a Group-A hook must still allow.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
and still runs (allow-with-advisory on heavy prose).
|
|
306
|
+
This test proves Group A is absent from MultiEdit and the remaining Group-B
|
|
307
|
+
hooks stay in the applicable set.
|
|
337
308
|
"""
|
|
338
309
|
all_multi_edit_entries = _applicable_entries_for_tool(MULTI_EDIT_TOOL_NAME)
|
|
339
310
|
all_write_only_entries = [
|
|
@@ -349,20 +320,14 @@ def test_multi_edit_runs_only_group_b_hooks() -> None:
|
|
|
349
320
|
f"Group-A hook {each_group_a_entry.script_relative_path!r} "
|
|
350
321
|
"appears in the MultiEdit applicable set — it must not"
|
|
351
322
|
)
|
|
352
|
-
|
|
353
|
-
"plain_language_blocker (Group B) must stay in the MultiEdit applicable set"
|
|
354
|
-
)
|
|
355
|
-
heavy_prose_payload = _multi_edit_payload(
|
|
323
|
+
clean_payload = _multi_edit_payload(
|
|
356
324
|
_MARKDOWN_FILE_PATH,
|
|
357
|
-
[{"old_string": "old line", "new_string": "
|
|
325
|
+
[{"old_string": "old line", "new_string": "New text."}],
|
|
358
326
|
)
|
|
359
|
-
dispatcher_result = _run_dispatcher(
|
|
327
|
+
dispatcher_result = _run_dispatcher(clean_payload)
|
|
360
328
|
dispatcher_is_deny, _reason = _parse_hook_decision(dispatcher_result)
|
|
361
329
|
assert not dispatcher_is_deny, (
|
|
362
|
-
"Dispatcher should allow
|
|
363
|
-
)
|
|
364
|
-
assert dispatcher_result.stdout.strip(), (
|
|
365
|
-
"plain_language_blocker should emit an allow advisory on MultiEdit heavy prose"
|
|
330
|
+
"Dispatcher should allow a clean MultiEdit payload"
|
|
366
331
|
)
|
|
367
332
|
|
|
368
333
|
|
|
@@ -417,7 +382,7 @@ def test_write_existing_file_blocker_does_not_run_on_multi_edit() -> None:
|
|
|
417
382
|
|
|
418
383
|
The dispatcher must allow a MultiEdit to an existing file path even though
|
|
419
384
|
write_existing_file_blocker would deny the same path on a Write.
|
|
420
|
-
Uses a non-markdown file so
|
|
385
|
+
Uses a non-markdown file so markdown-only hooks stay silent.
|
|
421
386
|
"""
|
|
422
387
|
existing_file_path = str(Path(__file__).resolve())
|
|
423
388
|
payload_text = _multi_edit_payload(
|
|
@@ -453,8 +418,7 @@ def test_all_deny_reasons_present_when_multiple_hooks_deny() -> None:
|
|
|
453
418
|
|
|
454
419
|
Uses a Write to an existing markdown path with a historical phrase
|
|
455
420
|
("previously") so write_existing_file_blocker and state_description_blocker
|
|
456
|
-
both deny.
|
|
457
|
-
not a denier.
|
|
421
|
+
both deny.
|
|
458
422
|
"""
|
|
459
423
|
existing_markdown_path = str(Path(__file__).resolve().parent / "CLAUDE.md")
|
|
460
424
|
multi_deny_content = (
|
|
@@ -689,9 +653,8 @@ def test_later_hook_deny_survives_early_hook_exit() -> None:
|
|
|
689
653
|
"""Dispatcher denies even when an earlier hook exits cleanly before a later hook denies.
|
|
690
654
|
|
|
691
655
|
state_description_blocker denies a markdown write with a historical phrase.
|
|
692
|
-
Earlier hooks exit 0 (allow).
|
|
693
|
-
|
|
694
|
-
denial reaches the aggregator.
|
|
656
|
+
Earlier hooks exit 0 (allow). The dispatcher must catch each hook's
|
|
657
|
+
SystemExit and continue, so the later denial reaches the aggregator.
|
|
695
658
|
"""
|
|
696
659
|
payload_text = _write_payload(
|
|
697
660
|
_MARKDOWN_FILE_PATH,
|
|
@@ -712,11 +675,8 @@ def test_dispatcher_write_applies_both_groups() -> None:
|
|
|
712
675
|
assert "blocking/write_existing_file_blocker.py" in all_write_script_paths, (
|
|
713
676
|
"write_existing_file_blocker (Group A) must be in Write applicable set"
|
|
714
677
|
)
|
|
715
|
-
assert
|
|
716
|
-
"
|
|
717
|
-
)
|
|
718
|
-
assert len(all_write_entries) == 19, (
|
|
719
|
-
f"Write tool must apply to all 19 hosted hooks, got {len(all_write_entries)}"
|
|
678
|
+
assert len(all_write_entries) == 18, (
|
|
679
|
+
f"Write tool must apply to all 18 hosted hooks, got {len(all_write_entries)}"
|
|
720
680
|
)
|
|
721
681
|
|
|
722
682
|
|
|
@@ -732,16 +692,16 @@ def test_dispatcher_edit_applies_both_groups() -> None:
|
|
|
732
692
|
assert "advisory/refactor_guard.py" in all_edit_script_paths, (
|
|
733
693
|
"refactor_guard is Edit-scoped and hosted, so it belongs in the Edit applicable set"
|
|
734
694
|
)
|
|
735
|
-
assert len(all_edit_entries) ==
|
|
736
|
-
f"expected
|
|
695
|
+
assert len(all_edit_entries) == 21, (
|
|
696
|
+
f"expected 21 Edit entries, got {len(all_edit_entries)}"
|
|
737
697
|
)
|
|
738
698
|
|
|
739
699
|
|
|
740
700
|
def test_dispatcher_multi_edit_applies_only_group_b() -> None:
|
|
741
|
-
"""MultiEdit tool triggers only Group B (
|
|
701
|
+
"""MultiEdit tool triggers only Group B (8 hooks), not Group A."""
|
|
742
702
|
all_multi_edit_entries = _applicable_entries_for_tool(MULTI_EDIT_TOOL_NAME)
|
|
743
|
-
assert len(all_multi_edit_entries) ==
|
|
744
|
-
f"MultiEdit tool must apply to exactly
|
|
703
|
+
assert len(all_multi_edit_entries) == 8, (
|
|
704
|
+
f"MultiEdit tool must apply to exactly 8 Group-B hooks, got {len(all_multi_edit_entries)}"
|
|
745
705
|
)
|
|
746
706
|
|
|
747
707
|
|
|
@@ -973,7 +933,6 @@ def test_hosted_hook_set_covers_all_write_edit_blocking_hooks() -> None:
|
|
|
973
933
|
"blocking/claude_md_orphan_file_blocker.py",
|
|
974
934
|
"blocking/pytest_testpaths_orphan_blocker.py",
|
|
975
935
|
"blocking/open_questions_in_plans_blocker.py",
|
|
976
|
-
"blocking/plain_language_blocker.py",
|
|
977
936
|
})
|
|
978
937
|
for each_script_path in previously_registered_blocking_hooks:
|
|
979
938
|
assert each_script_path in all_hosted_script_paths, (
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""Native-equivalence tests for the nativized PreToolUse hosted hooks.
|
|
2
2
|
|
|
3
|
-
For
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
For the state_description_blocker hook the dispatcher runs natively. This suite
|
|
4
|
+
asserts the native evaluate() call and the hook's standalone __main__ subprocess
|
|
5
|
+
path decide identically on the same payload: same allow-or-deny, same deny-reason
|
|
6
|
+
text. It also asserts the dispatcher reaches the same decision through its native
|
|
7
|
+
path.
|
|
8
8
|
|
|
9
9
|
The corpus pairs allowing payloads with denying payloads for each hook so the
|
|
10
10
|
equivalence holds across both outcomes.
|
|
@@ -21,9 +21,12 @@ from unittest.mock import patch
|
|
|
21
21
|
|
|
22
22
|
import pytest
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
_BLOCKING_DIR = Path(__file__).resolve().parent
|
|
25
|
+
_HOOKS_DIR = str(_BLOCKING_DIR.parent)
|
|
25
26
|
if _HOOKS_DIR not in sys.path:
|
|
26
27
|
sys.path.insert(0, _HOOKS_DIR)
|
|
28
|
+
if str(_BLOCKING_DIR) not in sys.path:
|
|
29
|
+
sys.path.insert(0, str(_BLOCKING_DIR))
|
|
27
30
|
|
|
28
31
|
_PROSE_STYLE_ENFORCEMENT_ENVIRONMENT = {
|
|
29
32
|
"CLAUDE_PROSE_STYLE_ENFORCEMENT": "1",
|
|
@@ -35,21 +38,14 @@ from hooks_constants.pre_tool_use_dispatcher_constants import ( # noqa: E402, I
|
|
|
35
38
|
MULTI_EDIT_TOOL_NAME,
|
|
36
39
|
WRITE_TOOL_NAME,
|
|
37
40
|
)
|
|
38
|
-
import plain_language_blocker # noqa: E402, I001
|
|
39
41
|
import state_description_blocker # noqa: E402, I001
|
|
40
42
|
|
|
41
|
-
_BLOCKING_DIR = Path(__file__).resolve().parent
|
|
42
43
|
_STATE_DESCRIPTION_SCRIPT = str(_BLOCKING_DIR / "state_description_blocker.py")
|
|
43
|
-
_PLAIN_LANGUAGE_SCRIPT = str(_BLOCKING_DIR / "plain_language_blocker.py")
|
|
44
44
|
_DISPATCHER_SCRIPT = str(_BLOCKING_DIR / "pre_tool_use_dispatcher.py")
|
|
45
45
|
|
|
46
46
|
_MARKDOWN_PATH = "docs/native_equivalence_probe.md"
|
|
47
|
-
_PYTHON_PATH = "src/native_equivalence_probe.py"
|
|
48
|
-
|
|
49
47
|
_STATE_DESCRIPTION_ALLOW_CONTENT = "# Guide\n\nThe API uses port 8080.\n"
|
|
50
48
|
_STATE_DESCRIPTION_DENY_CONTENT = "# Guide\n\nPreviously the system used port 8080.\n"
|
|
51
|
-
_PLAIN_LANGUAGE_ALLOW_CONTENT = "# Guide\n\nStart the build to make the report.\n"
|
|
52
|
-
_PLAIN_LANGUAGE_DENY_CONTENT = "# Guide\n\nUtilize this to commence the process.\n"
|
|
53
49
|
|
|
54
50
|
_PROSE_STYLE_ENV_VAR = "CLAUDE_PROSE_STYLE_ENFORCEMENT"
|
|
55
51
|
_PROSE_STYLE_ENV_VALUE = "1"
|
|
@@ -249,61 +245,6 @@ def test_state_description_native_non_target_tool_allows_match_script() -> None:
|
|
|
249
245
|
assert native_reason is None
|
|
250
246
|
assert script_reason is None
|
|
251
247
|
|
|
252
|
-
def test_plain_language_native_allows_match_script() -> None:
|
|
253
|
-
"""plain_language_blocker native allow matches the script's allow."""
|
|
254
|
-
payload_dictionary = _write_payload_dictionary(_MARKDOWN_PATH, _PLAIN_LANGUAGE_ALLOW_CONTENT)
|
|
255
|
-
native_reason = _evaluate_with_prose_style_opt_in(plain_language_blocker.evaluate, payload_dictionary)
|
|
256
|
-
script_stdout = _run_script_subprocess(_PLAIN_LANGUAGE_SCRIPT, payload_dictionary)
|
|
257
|
-
script_reason = _deny_reason_from_script_stdout(script_stdout)
|
|
258
|
-
assert native_reason is None
|
|
259
|
-
assert script_reason is None
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
def test_plain_language_native_heavy_word_advisory_matches_script() -> None:
|
|
263
|
-
"""plain_language_blocker native and script agree: no deny, allow advisory."""
|
|
264
|
-
payload_dictionary = _write_payload_dictionary(_MARKDOWN_PATH, _PLAIN_LANGUAGE_DENY_CONTENT)
|
|
265
|
-
with patch.dict(os.environ, _PROSE_STYLE_ENFORCEMENT_ENVIRONMENT):
|
|
266
|
-
native_deny, native_advisory = plain_language_blocker.evaluate_with_advisory(
|
|
267
|
-
payload_dictionary
|
|
268
|
-
)
|
|
269
|
-
script_stdout = _run_script_subprocess(_PLAIN_LANGUAGE_SCRIPT, payload_dictionary)
|
|
270
|
-
script_reason = _deny_reason_from_script_stdout(script_stdout)
|
|
271
|
-
assert native_deny is None
|
|
272
|
-
assert script_reason is None
|
|
273
|
-
assert native_advisory is not None
|
|
274
|
-
assert "utilize" in native_advisory.lower() or "commence" in native_advisory.lower()
|
|
275
|
-
script_payload = json.loads(script_stdout)
|
|
276
|
-
assert script_payload["hookSpecificOutput"]["permissionDecision"] == "allow"
|
|
277
|
-
assert native_advisory in script_payload["systemMessage"]
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
def test_plain_language_native_multi_edit_heavy_word_advisory_matches_script() -> None:
|
|
281
|
-
"""plain_language_blocker native and script agree on MultiEdit heavy-word allow."""
|
|
282
|
-
payload_dictionary = _multi_edit_payload_dictionary(
|
|
283
|
-
_MARKDOWN_PATH, "Utilize this to commence the process.\n"
|
|
284
|
-
)
|
|
285
|
-
with patch.dict(os.environ, _PROSE_STYLE_ENFORCEMENT_ENVIRONMENT):
|
|
286
|
-
native_deny, native_advisory = plain_language_blocker.evaluate_with_advisory(
|
|
287
|
-
payload_dictionary
|
|
288
|
-
)
|
|
289
|
-
script_stdout = _run_script_subprocess(_PLAIN_LANGUAGE_SCRIPT, payload_dictionary)
|
|
290
|
-
script_reason = _deny_reason_from_script_stdout(script_stdout)
|
|
291
|
-
assert native_deny is None
|
|
292
|
-
assert script_reason is None
|
|
293
|
-
assert native_advisory is not None
|
|
294
|
-
script_payload = json.loads(script_stdout)
|
|
295
|
-
assert script_payload["hookSpecificOutput"]["permissionDecision"] == "allow"
|
|
296
|
-
assert native_advisory in script_payload["systemMessage"]
|
|
297
|
-
|
|
298
|
-
def test_plain_language_native_non_markdown_allows_match_script() -> None:
|
|
299
|
-
"""plain_language_blocker native allows a non-markdown Write, matching the script."""
|
|
300
|
-
payload_dictionary = _write_payload_dictionary(_PYTHON_PATH, _PLAIN_LANGUAGE_DENY_CONTENT)
|
|
301
|
-
native_reason = _evaluate_with_prose_style_opt_in(plain_language_blocker.evaluate, payload_dictionary)
|
|
302
|
-
script_stdout = _run_script_subprocess(_PLAIN_LANGUAGE_SCRIPT, payload_dictionary)
|
|
303
|
-
script_reason = _deny_reason_from_script_stdout(script_stdout)
|
|
304
|
-
assert native_reason is None
|
|
305
|
-
assert script_reason is None
|
|
306
|
-
|
|
307
248
|
def test_dispatcher_native_path_denies_state_description() -> None:
|
|
308
249
|
"""The dispatcher's native path denies a state_description_blocker violation."""
|
|
309
250
|
payload_dictionary = _write_payload_dictionary(_MARKDOWN_PATH, _STATE_DESCRIPTION_DENY_CONTENT)
|
|
@@ -314,42 +255,6 @@ def test_dispatcher_native_path_denies_state_description() -> None:
|
|
|
314
255
|
assert native_reason in dispatcher_reason
|
|
315
256
|
|
|
316
257
|
|
|
317
|
-
def test_dispatcher_native_path_allows_plain_language_heavy_word() -> None:
|
|
318
|
-
"""The dispatcher's native path allows heavy words and does not deny."""
|
|
319
|
-
payload_dictionary = _multi_edit_payload_dictionary(
|
|
320
|
-
_MARKDOWN_PATH, "Utilize this to commence the process.\n"
|
|
321
|
-
)
|
|
322
|
-
native_reason = _evaluate_with_prose_style_opt_in(
|
|
323
|
-
plain_language_blocker.evaluate, payload_dictionary
|
|
324
|
-
)
|
|
325
|
-
dispatcher_reason = _deny_reason_from_dispatcher(payload_dictionary)
|
|
326
|
-
assert native_reason is None
|
|
327
|
-
assert dispatcher_reason is None
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
def test_dispatcher_native_plain_language_carries_advisory_system_message() -> None:
|
|
331
|
-
"""The dispatcher's plain-language allow carries the advisory systemMessage."""
|
|
332
|
-
payload_dictionary = _write_payload_dictionary(_MARKDOWN_PATH, _PLAIN_LANGUAGE_DENY_CONTENT)
|
|
333
|
-
with patch.dict(os.environ, _PROSE_STYLE_ENFORCEMENT_ENVIRONMENT):
|
|
334
|
-
deny_reason, advisory_message = plain_language_blocker.evaluate_with_advisory(
|
|
335
|
-
payload_dictionary
|
|
336
|
-
)
|
|
337
|
-
assert deny_reason is None
|
|
338
|
-
assert advisory_message is not None
|
|
339
|
-
dispatcher_payload = _deny_payload_from_dispatcher(payload_dictionary)
|
|
340
|
-
assert dispatcher_payload["hookSpecificOutput"]["permissionDecision"] == "allow"
|
|
341
|
-
dispatcher_system_message = dispatcher_payload.get("systemMessage")
|
|
342
|
-
assert isinstance(dispatcher_system_message, str)
|
|
343
|
-
assert advisory_message in dispatcher_system_message
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
def test_dispatcher_native_plain_language_allow_does_not_suppress_output() -> None:
|
|
347
|
-
"""The dispatcher's plain-language advisory allow leaves suppressOutput off."""
|
|
348
|
-
payload_dictionary = _write_payload_dictionary(_MARKDOWN_PATH, _PLAIN_LANGUAGE_DENY_CONTENT)
|
|
349
|
-
dispatcher_payload = _deny_payload_from_dispatcher(payload_dictionary)
|
|
350
|
-
assert dispatcher_payload.get("suppressOutput") is not True
|
|
351
|
-
assert dispatcher_payload["hookSpecificOutput"]["permissionDecision"] == "allow"
|
|
352
|
-
|
|
353
258
|
def test_dispatcher_native_state_description_carries_additional_context() -> None:
|
|
354
259
|
"""The dispatcher's state-description deny carries the standalone additionalContext."""
|
|
355
260
|
payload_dictionary = _write_payload_dictionary(_MARKDOWN_PATH, _STATE_DESCRIPTION_DENY_CONTENT)
|
|
@@ -644,6 +644,7 @@ def test_additional_context_contains_examples():
|
|
|
644
644
|
ctx = output["hookSpecificOutput"].get("additionalContext", "")
|
|
645
645
|
assert "BAD:" in ctx
|
|
646
646
|
assert "GOOD:" in ctx
|
|
647
|
+
assert "~/.claude/rules/asd-ste100-language.md" in ctx
|
|
647
648
|
|
|
648
649
|
|
|
649
650
|
def test_handles_non_dict_stdin():
|
|
@@ -110,7 +110,7 @@ def test_dispatch_re_emits_first_block_with_system_message_and_suppress(
|
|
|
110
110
|
(
|
|
111
111
|
"blocking/hedging_language_blocker.py",
|
|
112
112
|
"blocking/question_to_user_enforcer.py",
|
|
113
|
-
"
|
|
113
|
+
"blocking/intent_only_ending_blocker.py",
|
|
114
114
|
),
|
|
115
115
|
)
|
|
116
116
|
dispatch('{"session_id": "test"}')
|
|
@@ -175,31 +175,6 @@ def test_dispatcher_blocks_hedging_message_matching_standalone() -> None:
|
|
|
175
175
|
assert "probably" in parsed["reason"].lower() or "hedging" in parsed["reason"].lower()
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
def test_dispatcher_blocks_eli11_shape_violation_matching_standalone() -> None:
|
|
179
|
-
"""An ELI11 shape violation (too many bullets) blocks through the dispatcher."""
|
|
180
|
-
too_many_bullets_message = "\n".join(
|
|
181
|
-
f"- finding{each_index} detail for this line" for each_index in range(7)
|
|
182
|
-
)
|
|
183
|
-
payload_text = json.dumps(
|
|
184
|
-
{
|
|
185
|
-
"stop_hook_active": False,
|
|
186
|
-
"last_assistant_message": too_many_bullets_message,
|
|
187
|
-
}
|
|
188
|
-
)
|
|
189
|
-
completed = subprocess.run(
|
|
190
|
-
[sys.executable, _DISPATCHER_SCRIPT],
|
|
191
|
-
check=False,
|
|
192
|
-
input=payload_text,
|
|
193
|
-
capture_output=True,
|
|
194
|
-
text=True,
|
|
195
|
-
encoding="utf-8",
|
|
196
|
-
)
|
|
197
|
-
assert completed.returncode == 0
|
|
198
|
-
parsed = json.loads(completed.stdout)
|
|
199
|
-
assert parsed["decision"] == "block"
|
|
200
|
-
assert "ELI11 REPLY SHAPE" in parsed["reason"]
|
|
201
|
-
|
|
202
|
-
|
|
203
178
|
def test_dispatcher_imports_standalone_with_only_blocking_on_the_path() -> None:
|
|
204
179
|
"""The dispatcher's bootstrap resolves hooks_constants without hooks/ on PYTHONPATH."""
|
|
205
180
|
subprocess_environment = {**os.environ, "PYTHONPATH": str(_BLOCKING_DIR)}
|
package/hooks/hooks.json
CHANGED
|
@@ -29,14 +29,12 @@ Shared constant modules imported by hooks throughout the `hooks/` tree. Each fil
|
|
|
29
29
|
| `duplicate_function_body_constants.py` | Hashing and comparison config for the duplicate-body check |
|
|
30
30
|
| `duplicate_rmtree_helper_blocker_constants.py` | Sanctioned Windows-safe rmtree helper names, the definition pattern, and the exempt-path set for the duplicate-rmtree-helper blocker |
|
|
31
31
|
| `dynamic_stderr_handler.py` | `DynamicStderrHandler` — a logging handler that resolves `sys.stderr` at emit time (for testability) |
|
|
32
|
-
| `eli11_reply_enforcer_constants.py` | Reply-shape thresholds (bullet cap, lead-line window, per-list-line word cap, overpacked list-line cap), the bullet / numbered-step / table-row / link-target / word patterns, the imperative instruction verbs, and the user-facing notice for the ELI11 reply-shape Stop hook |
|
|
33
32
|
| `fable_spawn_gate_constants.py` | The spawn tool-name set, the fable model alias and the model-id segment split pattern, the `FABLE-SPAWN-AUTHORIZED` authorization token, the advisor-protocol document path, payload field names, the deny message, and the deny `additionalContext` recovery text for the fable-tier spawn gate |
|
|
34
33
|
| `gh_pr_author_swap_constants.py` | Constants for the PR-author swap enforcement hooks |
|
|
35
34
|
| `hardcoded_user_path_constants.py` | Patterns for detecting hardcoded home-directory paths |
|
|
36
35
|
| `harness_scratchpad_constants.py` | Fixed path components (`claude` / `claude-` user-directory name and prefix, `scratchpad` leaf name), the PreToolUse session-id payload key, and the `CLAUDE_CODE_SESSION_ID` environment variable name that the code-rules and TDD gates use to recognize an existing harness session scratchpad directory |
|
|
37
36
|
| `hedging_uncertainty_constants.py` | Sentence-boundary pattern, explicit uncertainty label patterns, hedge-term list separator, and positive corrective block text for OP-07C sentence-scoped hedging |
|
|
38
37
|
| `hook_block_logger.py` | `log_hook_block()` — shared fail-safe logger every blocking hook calls to append a JSON record of each block decision to `~/.claude/logs/hook-blocks.log` |
|
|
39
|
-
| `hook_log_extractor_constants.py` | Neon table name, offset state file path, timeouts, and outcome-type mapping for the hook-log extractor |
|
|
40
38
|
| `hook_prose_detector_consistency_constants.py` | Trigger patterns and corrective messages for the hook-prose consistency checker |
|
|
41
39
|
| `hosted_hook_runner.py` | `run_hook_capturing_output()` — shared runner that runs one dispatcher-hosted hook in-process via runpy and returns its captured stdout and crash flag |
|
|
42
40
|
| `inline_tuple_string_magic_constants.py` | Patterns for detecting magic strings in inline tuple literals |
|
|
@@ -55,7 +53,6 @@ Shared constant modules imported by hooks throughout the `hooks/` tree. Each fil
|
|
|
55
53
|
| `pii_prevention_constants.py` | Patterns, allowlists, path exemptions, and deny-message text for `pii_prevention_blocker` |
|
|
56
54
|
| `piped_pytest_blocker_constants.py` | Bash tool name, pytest program basenames and the python-interpreter basename pattern, the pipe and segment-reset operator token sets, and the deny message for the piped-pytest blocker; classification that consumes those program and wrapper constants lives in `pytest_invocation.py` |
|
|
57
55
|
| `pytest_invocation.py` | Pure parsed-segment classifier for pytest runs through interpreters, shims, wrappers, and shell string-exec forms; no pipeline deny decision |
|
|
58
|
-
| `plain_language_blocker_constants.py` | The list of heavy words and their everyday replacements |
|
|
59
56
|
| `prose_matcher_precision_constants.py` | Sample floor, keep/narrow precision floors, matcher ids, label decisions, advisory log path, emit caps, and context fingerprint length for OP-07B prose-matcher advisory telemetry |
|
|
60
57
|
| `pre_tool_use_stdin.py` | `read_hook_input_dictionary_from_stdin()` — shared stdin parser for PreToolUse hooks |
|
|
61
58
|
| `precommit_code_rules_gate_constants.py` | Scope argument and exit-code constants for the precommit gate |
|
|
@@ -16,7 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
from collections.abc import Mapping, Sequence
|
|
17
17
|
from dataclasses import dataclass
|
|
18
18
|
|
|
19
|
-
from hooks_constants.
|
|
19
|
+
from hooks_constants.ask_user_question_shape_constants import (
|
|
20
20
|
ALL_CHAT_DETAIL_MARKERS,
|
|
21
21
|
ALL_LINE_ENDING_REPLACEMENTS,
|
|
22
22
|
COUNTABLE_WORD_PATTERN,
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Constants for AskUserQuestion field-shape validation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"ALL_CHAT_DETAIL_MARKERS",
|
|
9
|
+
"ALL_LINE_ENDING_REPLACEMENTS",
|
|
10
|
+
"ASK_USER_QUESTION_TOOL_NAME",
|
|
11
|
+
"COUNTABLE_WORD_PATTERN",
|
|
12
|
+
"INLINE_CODE_PLACEHOLDER",
|
|
13
|
+
"INLINE_CODE_SPAN_PATTERN",
|
|
14
|
+
"LEAN_QUESTION_BLOCK_GUIDANCE",
|
|
15
|
+
"LEAN_QUESTION_BLOCK_PREFIX",
|
|
16
|
+
"LEAN_QUESTION_VIOLATION_SEPARATOR",
|
|
17
|
+
"MAXIMUM_OPTION_DESCRIPTION_SENTENCE_COUNT",
|
|
18
|
+
"MAXIMUM_OPTION_DESCRIPTION_WORD_COUNT",
|
|
19
|
+
"MAXIMUM_QUESTION_SENTENCE_COUNT",
|
|
20
|
+
"MAXIMUM_QUESTION_WORD_COUNT",
|
|
21
|
+
"OPTION_DESCRIPTION_SURFACE_NAME",
|
|
22
|
+
"QUESTION_SURFACE_NAME",
|
|
23
|
+
"SENTENCE_BOUNDARY_PATTERN",
|
|
24
|
+
"USER_FACING_LEAN_QUESTION_NOTICE",
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
ASK_USER_QUESTION_TOOL_NAME: str = "AskUserQuestion"
|
|
28
|
+
|
|
29
|
+
ALL_CHAT_DETAIL_MARKERS: tuple[tuple[re.Pattern[str], str], ...] = (
|
|
30
|
+
(re.compile(r"^[ \t]*```", re.MULTILINE), "a fenced code block"),
|
|
31
|
+
(re.compile(r"^[ \t]*#{1,6}[ \t]+\S", re.MULTILINE), "a heading"),
|
|
32
|
+
(re.compile(r"^[ \t]*\|.*\|[ \t]*$", re.MULTILINE), "a table row"),
|
|
33
|
+
(
|
|
34
|
+
re.compile(r"^[ \t]*(?:[-*+][ \t]+|\d{1,2}[.)][ \t]+)\S", re.MULTILINE),
|
|
35
|
+
"a bullet or numbered list marker",
|
|
36
|
+
),
|
|
37
|
+
(re.compile(r"\n[ \t]*\n"), "more than one paragraph"),
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
INLINE_CODE_SPAN_PATTERN: re.Pattern[str] = re.compile(r"`[^`\n]+`")
|
|
41
|
+
INLINE_CODE_PLACEHOLDER: str = "code"
|
|
42
|
+
|
|
43
|
+
ALL_LINE_ENDING_REPLACEMENTS: tuple[tuple[str, str], ...] = (
|
|
44
|
+
("\r\n", "\n"),
|
|
45
|
+
("\r", "\n"),
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
SENTENCE_BOUNDARY_PATTERN: re.Pattern[str] = re.compile(
|
|
49
|
+
r"[.!?]+(?=\s+[A-Z]|\s*$)"
|
|
50
|
+
)
|
|
51
|
+
COUNTABLE_WORD_PATTERN: re.Pattern[str] = re.compile(r"\S*[A-Za-z0-9]\S*")
|
|
52
|
+
|
|
53
|
+
MAXIMUM_QUESTION_SENTENCE_COUNT: int = 2
|
|
54
|
+
MAXIMUM_QUESTION_WORD_COUNT: int = 40
|
|
55
|
+
MAXIMUM_OPTION_DESCRIPTION_SENTENCE_COUNT: int = 1
|
|
56
|
+
MAXIMUM_OPTION_DESCRIPTION_WORD_COUNT: int = 15
|
|
57
|
+
|
|
58
|
+
QUESTION_SURFACE_NAME: str = "the question"
|
|
59
|
+
OPTION_DESCRIPTION_SURFACE_NAME: str = "an option description"
|
|
60
|
+
|
|
61
|
+
LEAN_QUESTION_BLOCK_PREFIX: str = (
|
|
62
|
+
"BLOCKED: [LEAN_QUESTION] Question block carries chat detail -- "
|
|
63
|
+
)
|
|
64
|
+
LEAN_QUESTION_VIOLATION_SEPARATOR: str = "; "
|
|
65
|
+
LEAN_QUESTION_BLOCK_GUIDANCE: str = (
|
|
66
|
+
"AskUserQuestion renders as one plain text block. Print the plan, the counts, "
|
|
67
|
+
"and the tradeoffs in chat text before the call, keep the question block to a "
|
|
68
|
+
"lean question and short options, and reach for an inline visualizer tool when "
|
|
69
|
+
"a choice needs formatting."
|
|
70
|
+
)
|
|
71
|
+
USER_FACING_LEAN_QUESTION_NOTICE: str = (
|
|
72
|
+
"Question-block check: move the detail into chat and ask a short question."
|
|
73
|
+
)
|
|
@@ -15,6 +15,5 @@ CORRECTIVE_MESSAGE_COPILOT: str = (
|
|
|
15
15
|
"BLOCKED [bot-mention]: Invalid comment. "
|
|
16
16
|
"To request a Copilot review, use the GitHub REST API:\n"
|
|
17
17
|
" gh api --method POST repos/<owner>/<repo>/pulls/<number>/requested_reviewers \\\n"
|
|
18
|
-
" -f 'reviewers[]=copilot-pull-request-reviewer[bot]'
|
|
19
|
-
"See ~/.claude/skills/pr-converge/reference/convergence-gates.md."
|
|
18
|
+
" -f 'reviewers[]=copilot-pull-request-reviewer[bot]'"
|
|
20
19
|
)
|
|
@@ -20,7 +20,6 @@ ALL_CONFIG_DIRECTORY_NAMES = frozenset(
|
|
|
20
20
|
"skills_pr_loop_constants",
|
|
21
21
|
"pr_converge_skill_constants",
|
|
22
22
|
"pr_converge_scripts_constants",
|
|
23
|
-
"bugteam_scripts_constants",
|
|
24
23
|
"usage_pause_constants",
|
|
25
24
|
"prototype_scripts_constants",
|
|
26
25
|
"codex_review_scripts_constants",
|
|
@@ -24,7 +24,6 @@ __all__ = [
|
|
|
24
24
|
"ALL_WRITE_AND_EDIT_TOOL_NAMES",
|
|
25
25
|
"ALL_WRITE_EDIT_MULTI_EDIT_TOOL_NAMES",
|
|
26
26
|
"STATE_DESCRIPTION_BLOCKER_MODULE_NAME",
|
|
27
|
-
"PLAIN_LANGUAGE_BLOCKER_MODULE_NAME",
|
|
28
27
|
"SYSTEM_MESSAGE_JOIN_SEPARATOR",
|
|
29
28
|
"HostedHookEntry",
|
|
30
29
|
"ALL_HOSTED_HOOK_ENTRIES",
|
|
@@ -51,7 +50,6 @@ ALL_WRITE_EDIT_MULTI_EDIT_TOOL_NAMES: frozenset[str] = frozenset(
|
|
|
51
50
|
|
|
52
51
|
|
|
53
52
|
STATE_DESCRIPTION_BLOCKER_MODULE_NAME = "state_description_blocker"
|
|
54
|
-
PLAIN_LANGUAGE_BLOCKER_MODULE_NAME = "plain_language_blocker"
|
|
55
53
|
|
|
56
54
|
|
|
57
55
|
@dataclass(frozen=True)
|
|
@@ -155,11 +153,6 @@ ALL_HOSTED_HOOK_ENTRIES: tuple[HostedHookEntry, ...] = (
|
|
|
155
153
|
script_relative_path="blocking/docstring_rule_gate_count_blocker.py",
|
|
156
154
|
applicable_tool_names=ALL_WRITE_EDIT_MULTI_EDIT_TOOL_NAMES,
|
|
157
155
|
),
|
|
158
|
-
HostedHookEntry(
|
|
159
|
-
script_relative_path="blocking/plain_language_blocker.py",
|
|
160
|
-
applicable_tool_names=ALL_WRITE_EDIT_MULTI_EDIT_TOOL_NAMES,
|
|
161
|
-
native_module_name=PLAIN_LANGUAGE_BLOCKER_MODULE_NAME,
|
|
162
|
-
),
|
|
163
156
|
HostedHookEntry(
|
|
164
157
|
script_relative_path="advisory/refactor_guard.py",
|
|
165
158
|
applicable_tool_names=frozenset({EDIT_TOOL_NAME}),
|