claude-dev-env 2.16.0 → 2.17.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/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-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/reference/sol-rung.md +2 -2
- package/_shared/advisor/reference/third-party-bind.md +1 -1
- 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/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/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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { test
|
|
1
|
+
import { test } from 'node:test';
|
|
2
2
|
import { strict as assert } from 'node:assert';
|
|
3
3
|
import { execFileSync, spawnSync } from 'node:child_process';
|
|
4
4
|
import {
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
readFileSync,
|
|
10
10
|
readdirSync,
|
|
11
11
|
rmSync,
|
|
12
|
-
cpSync,
|
|
13
12
|
} from 'node:fs';
|
|
14
13
|
import { tmpdir } from 'node:os';
|
|
15
14
|
import { join, dirname, basename } from 'node:path';
|
|
@@ -28,21 +27,15 @@ const RETIRED_SKILL_DIRECTORIES = [
|
|
|
28
27
|
'pr-consistency-audit',
|
|
29
28
|
'bdd-protocol',
|
|
30
29
|
];
|
|
31
|
-
const PERSONAL_SKILL_DIRECTORIES = ['
|
|
30
|
+
const PERSONAL_SKILL_DIRECTORIES = ['credit-card-picker', 'midjourney-sref'];
|
|
32
31
|
const SHIPPED_SKILL_DIRECTORY = 'autoconverge';
|
|
33
32
|
const PRUNED_BACKUP_DIRECTORY_NAME = '.claude-dev-env-pruned';
|
|
34
33
|
const SKIP_PRUNE_NOTICE_MARKER = 'Skipping retired-skill and stale-file prune';
|
|
35
34
|
const STALE_SKILL_FILE_RELATIVE_SEGMENTS = ['scripts', 'retired_module.py'];
|
|
36
35
|
const RUNTIME_ARTIFACT_RELATIVE_SEGMENTS = ['scripts', '__pycache__', 'helper.cpython-312.pyc'];
|
|
37
|
-
const DEPENDENCY_STUB_PACKAGE_SEGMENTS = ['@jl-cmd', 'prompt-generator'];
|
|
38
|
-
const DEPENDENCY_SUPPLIED_SKILL_DIRECTORY = 'dependency-supplied-skill';
|
|
39
36
|
const SCOPED_GROUP_SKILL_DIRECTORY = 'orchestrator';
|
|
40
37
|
const CORE_REVIEW_GUIDE_SKILL_DIRECTORIES = [
|
|
41
38
|
'small-cl',
|
|
42
|
-
'comments',
|
|
43
|
-
'reviews',
|
|
44
|
-
'descriptions',
|
|
45
|
-
'emergencies',
|
|
46
39
|
];
|
|
47
40
|
const PRIOR_RUN_BACKUP_DIRECTORY_NAMES = [
|
|
48
41
|
'2020-01-01T00-00-00-000Z',
|
|
@@ -70,70 +63,6 @@ const NESTED_SKILL_FILE_SEGMENTS = [NESTED_SKILL_DIRECTORY, 'scripts', 'a.py'];
|
|
|
70
63
|
const MYPY_INI_FILE_NAME = '.mypy.ini';
|
|
71
64
|
const SKIPPED_RECORD_SUMMARY_MARKER = 'manifest record(s) skipped';
|
|
72
65
|
|
|
73
|
-
/**
|
|
74
|
-
* Create a stub node_modules tree the installer can resolve the declared
|
|
75
|
-
* dependency package from, and return its root for the child's NODE_PATH.
|
|
76
|
-
*
|
|
77
|
-
* The installer resolves `@jl-cmd/prompt-generator/package.json`; a lone
|
|
78
|
-
* package.json at that path is enough for `createRequire.resolve` to succeed.
|
|
79
|
-
* The stub makes the dependency resolvable inside the sandbox so a full install
|
|
80
|
-
* exercises the real prune path. It does not prove the real private package
|
|
81
|
-
* resolves in a real install — CI cannot host that package — only that the
|
|
82
|
-
* resolved-dependency branch prunes as designed.
|
|
83
|
-
*
|
|
84
|
-
* @param {string} homeDirectory The sandbox home the stub is nested under.
|
|
85
|
-
* @returns {string} The stub modules root to place on the child's NODE_PATH.
|
|
86
|
-
*/
|
|
87
|
-
let isolatedInstallerPath = null;
|
|
88
|
-
let isolatedPackageCopyRoot = null;
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Copy the package into a temp directory without node_modules and return the
|
|
92
|
-
* copy's installer path.
|
|
93
|
-
*
|
|
94
|
-
* The installer resolves its declared dependencies with Node's regular
|
|
95
|
-
* node_modules walk starting at its own file, so the real installer under the
|
|
96
|
-
* repo always finds `@jl-cmd/prompt-generator` once `npm install` has run —
|
|
97
|
-
* removing NODE_PATH from the child cannot make the dependency unresolvable
|
|
98
|
-
* there. Running the copy makes resolution genuinely fail through the
|
|
99
|
-
* installer's own catch path: no node_modules sits in the copy's ancestry and
|
|
100
|
-
* the child gets no NODE_PATH. The copy is created once and shared by every
|
|
101
|
-
* unresolved-dependency install; installs write only into their sandbox HOME.
|
|
102
|
-
*
|
|
103
|
-
* @returns {string} The path to `bin/install.mjs` inside the package copy.
|
|
104
|
-
*/
|
|
105
|
-
function ensureIsolatedInstallerPath() {
|
|
106
|
-
if (isolatedInstallerPath !== null) return isolatedInstallerPath;
|
|
107
|
-
isolatedPackageCopyRoot = mkdtempSync(join(tmpdir(), 'cdev-prune-package-'));
|
|
108
|
-
cpSync(PACKAGE_DIRECTORY, isolatedPackageCopyRoot, {
|
|
109
|
-
recursive: true,
|
|
110
|
-
filter: sourcePath => basename(sourcePath) !== EXCLUDED_PACKAGE_COPY_DIRECTORY,
|
|
111
|
-
});
|
|
112
|
-
isolatedInstallerPath = join(isolatedPackageCopyRoot, 'bin', 'install.mjs');
|
|
113
|
-
return isolatedInstallerPath;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
after(() => {
|
|
117
|
-
if (isolatedPackageCopyRoot !== null) {
|
|
118
|
-
rmSync(isolatedPackageCopyRoot, { recursive: true, force: true });
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
function ensureDependencyStub(homeDirectory) {
|
|
123
|
-
const stubModulesRoot = join(homeDirectory, 'dependency-stub-modules');
|
|
124
|
-
const stubPackageDirectory = join(stubModulesRoot, ...DEPENDENCY_STUB_PACKAGE_SEGMENTS);
|
|
125
|
-
mkdirSync(stubPackageDirectory, { recursive: true });
|
|
126
|
-
writeFileSync(
|
|
127
|
-
join(stubPackageDirectory, 'package.json'),
|
|
128
|
-
JSON.stringify({
|
|
129
|
-
name: DEPENDENCY_STUB_PACKAGE_SEGMENTS.join('/'),
|
|
130
|
-
version: '1.0.0',
|
|
131
|
-
description: 'sandbox dependency stub',
|
|
132
|
-
}) + '\n',
|
|
133
|
-
);
|
|
134
|
-
return stubModulesRoot;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
66
|
/**
|
|
138
67
|
* Report whether a path under one managed root landed in a run backup.
|
|
139
68
|
*
|
|
@@ -203,20 +132,12 @@ function plantSkillDirectory(skillsDirectory, skillName, withSkillManifest) {
|
|
|
203
132
|
/**
|
|
204
133
|
* Run the real installer against the sandbox home and return its stdout.
|
|
205
134
|
*
|
|
206
|
-
* The declared dependency package is resolvable by default: the child's
|
|
207
|
-
* NODE_PATH points at a sandbox stub so `createRequire.resolve` finds it and the
|
|
208
|
-
* full-install prune runs. Passing ``{ dependencyResolvable: false }`` runs the
|
|
209
|
-
* installer from an isolated package copy with no node_modules in its ancestry
|
|
210
|
-
* and no NODE_PATH, so the dependency fails to resolve and the installer skips
|
|
211
|
-
* the prune.
|
|
212
|
-
*
|
|
213
135
|
* @param {string} homeDirectory The sandbox home the installer writes into.
|
|
214
136
|
* @param {string[]} extraArguments Installer arguments (for example ``['--only', 'core']``).
|
|
215
|
-
* @param {{dependencyResolvable?: boolean}} options Whether the dependency resolves.
|
|
216
137
|
* @returns {string} The installer's stdout.
|
|
217
138
|
*/
|
|
218
|
-
function runInstaller(homeDirectory, extraArguments
|
|
219
|
-
const { installerPath, childEnvironment } = resolveInstallerInvocation(homeDirectory
|
|
139
|
+
function runInstaller(homeDirectory, extraArguments) {
|
|
140
|
+
const { installerPath, childEnvironment } = resolveInstallerInvocation(homeDirectory);
|
|
220
141
|
return execFileSync('node', [installerPath, ...extraArguments], {
|
|
221
142
|
cwd: dirname(installerPath),
|
|
222
143
|
encoding: 'utf8',
|
|
@@ -228,11 +149,9 @@ function runInstaller(homeDirectory, extraArguments, options = {}) {
|
|
|
228
149
|
* Build the installer path and child environment one sandbox run uses.
|
|
229
150
|
*
|
|
230
151
|
* @param {string} homeDirectory The sandbox home the installer writes into.
|
|
231
|
-
* @param {{dependencyResolvable?: boolean}} options Whether the dependency resolves.
|
|
232
152
|
* @returns {{installerPath: string, childEnvironment: object}} The invocation inputs.
|
|
233
153
|
*/
|
|
234
|
-
function resolveInstallerInvocation(homeDirectory
|
|
235
|
-
const dependencyResolvable = options.dependencyResolvable !== false;
|
|
154
|
+
function resolveInstallerInvocation(homeDirectory) {
|
|
236
155
|
const childEnvironment = {
|
|
237
156
|
...process.env,
|
|
238
157
|
HOME: homeDirectory,
|
|
@@ -240,12 +159,7 @@ function resolveInstallerInvocation(homeDirectory, options) {
|
|
|
240
159
|
GIT_CONFIG_GLOBAL: join(homeDirectory, '.gitconfig'),
|
|
241
160
|
CODEX_HOME: join(homeDirectory, '.codex'),
|
|
242
161
|
};
|
|
243
|
-
|
|
244
|
-
childEnvironment.NODE_PATH = ensureDependencyStub(homeDirectory);
|
|
245
|
-
return { installerPath: INSTALLER_PATH, childEnvironment };
|
|
246
|
-
}
|
|
247
|
-
delete childEnvironment.NODE_PATH;
|
|
248
|
-
return { installerPath: ensureIsolatedInstallerPath(), childEnvironment };
|
|
162
|
+
return { installerPath: INSTALLER_PATH, childEnvironment };
|
|
249
163
|
}
|
|
250
164
|
|
|
251
165
|
/**
|
|
@@ -259,7 +173,7 @@ function resolveInstallerInvocation(homeDirectory, options) {
|
|
|
259
173
|
* @returns {string} The child's stdout and stderr, joined.
|
|
260
174
|
*/
|
|
261
175
|
function runInstallerReadingBothStreams(homeDirectory, extraArguments) {
|
|
262
|
-
const { installerPath, childEnvironment } = resolveInstallerInvocation(homeDirectory
|
|
176
|
+
const { installerPath, childEnvironment } = resolveInstallerInvocation(homeDirectory);
|
|
263
177
|
const completedRun = spawnSync('node', [installerPath, ...extraArguments], {
|
|
264
178
|
cwd: dirname(installerPath),
|
|
265
179
|
encoding: 'utf8',
|
|
@@ -634,7 +548,7 @@ test('a full reinstall prunes a manifest-recorded skill absent from the package
|
|
|
634
548
|
const sandbox = createSandbox();
|
|
635
549
|
try {
|
|
636
550
|
const retiredManifestSkill = 'ghost-skill';
|
|
637
|
-
const personalSkill = '
|
|
551
|
+
const personalSkill = 'credit-card-picker';
|
|
638
552
|
plantSkillDirectory(sandbox.skillsDirectory, retiredManifestSkill, true);
|
|
639
553
|
plantSkillDirectory(sandbox.skillsDirectory, personalSkill, false);
|
|
640
554
|
writeFileSync(
|
|
@@ -701,115 +615,25 @@ test('a scoped --only install leaves retired skills in place because prune runs
|
|
|
701
615
|
}
|
|
702
616
|
});
|
|
703
617
|
|
|
704
|
-
test('a full reinstall keeps
|
|
618
|
+
test('a full reinstall keeps autoconverge because the package ships it again', () => {
|
|
705
619
|
const sandbox = createSandbox();
|
|
706
620
|
try {
|
|
707
|
-
plantSkillDirectory(sandbox.skillsDirectory, '
|
|
708
|
-
writeFileSync(join(sandbox.skillsDirectory, '
|
|
621
|
+
plantSkillDirectory(sandbox.skillsDirectory, 'autoconverge', true);
|
|
622
|
+
writeFileSync(join(sandbox.skillsDirectory, 'autoconverge', 'SKILL.md'), 'stale seeded copy\n');
|
|
709
623
|
|
|
710
624
|
const installerOutput = runInstaller(sandbox.homeDirectory, []);
|
|
711
625
|
|
|
712
626
|
assert.equal(
|
|
713
627
|
installerOutput.includes(SKIP_PRUNE_NOTICE_MARKER),
|
|
714
628
|
false,
|
|
715
|
-
'the
|
|
629
|
+
'the full install runs the prune rather than skipping it',
|
|
716
630
|
);
|
|
717
|
-
const restoredSkillPath = join(sandbox.skillsDirectory, '
|
|
718
|
-
assert.equal(existsSync(restoredSkillPath), true, '
|
|
631
|
+
const restoredSkillPath = join(sandbox.skillsDirectory, 'autoconverge', 'SKILL.md');
|
|
632
|
+
assert.equal(existsSync(restoredSkillPath), true, 'autoconverge survives and is reinstalled');
|
|
719
633
|
assert.notEqual(
|
|
720
634
|
readFileSync(restoredSkillPath, 'utf8'),
|
|
721
635
|
'stale seeded copy\n',
|
|
722
|
-
'the shipped
|
|
723
|
-
);
|
|
724
|
-
} finally {
|
|
725
|
-
rmSync(sandbox.homeDirectory, { recursive: true, force: true });
|
|
726
|
-
}
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
test('a full reinstall with an unresolved dependency skips the prune and leaves retired skills untouched', () => {
|
|
730
|
-
const sandbox = createSandbox();
|
|
731
|
-
try {
|
|
732
|
-
for (const retiredSkill of RETIRED_SKILL_DIRECTORIES) {
|
|
733
|
-
plantSkillDirectory(sandbox.skillsDirectory, retiredSkill, true);
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
const installerOutput = runInstaller(sandbox.homeDirectory, [], { dependencyResolvable: false });
|
|
737
|
-
|
|
738
|
-
assert.equal(
|
|
739
|
-
installerOutput.includes(SKIP_PRUNE_NOTICE_MARKER),
|
|
740
|
-
true,
|
|
741
|
-
'the installer logs a notice that it is skipping the prune',
|
|
742
|
-
);
|
|
743
|
-
for (const retiredSkill of RETIRED_SKILL_DIRECTORIES) {
|
|
744
|
-
assert.equal(
|
|
745
|
-
existsSync(join(sandbox.skillsDirectory, retiredSkill)),
|
|
746
|
-
true,
|
|
747
|
-
`retired skill ${retiredSkill} should survive when a dependency is unresolved`,
|
|
748
|
-
);
|
|
749
|
-
assert.equal(
|
|
750
|
-
prunedSkillBackupContains(sandbox.claudeDirectory, retiredSkill),
|
|
751
|
-
false,
|
|
752
|
-
`retired skill ${retiredSkill} should not be moved to backup when the prune is skipped`,
|
|
753
|
-
);
|
|
754
|
-
}
|
|
755
|
-
} finally {
|
|
756
|
-
rmSync(sandbox.homeDirectory, { recursive: true, force: true });
|
|
757
|
-
}
|
|
758
|
-
});
|
|
759
|
-
|
|
760
|
-
test('a full install that holds the prune keeps prior manifest file entries it did not itself write', () => {
|
|
761
|
-
const sandbox = createSandbox();
|
|
762
|
-
try {
|
|
763
|
-
runInstaller(sandbox.homeDirectory, []);
|
|
764
|
-
const { staleFilePath } = seedStaleSkillFile(sandbox);
|
|
765
|
-
const filesBeforeHeldPrune = readManifest(sandbox.manifestPath).files;
|
|
766
|
-
|
|
767
|
-
const installerOutput = runInstaller(sandbox.homeDirectory, [], { dependencyResolvable: false });
|
|
768
|
-
|
|
769
|
-
assert.equal(
|
|
770
|
-
installerOutput.includes(SKIP_PRUNE_NOTICE_MARKER),
|
|
771
|
-
true,
|
|
772
|
-
'the unresolved-dependency install holds both prunes',
|
|
773
|
-
);
|
|
774
|
-
const recordedFiles = new Set(readManifest(sandbox.manifestPath).files);
|
|
775
|
-
assert.equal(
|
|
776
|
-
recordedFiles.has(staleFilePath),
|
|
777
|
-
true,
|
|
778
|
-
'the entry a later pruning install needs to spot the stale file stays on the record',
|
|
779
|
-
);
|
|
780
|
-
const droppedEntries = filesBeforeHeldPrune.filter(priorPath => !recordedFiles.has(priorPath));
|
|
781
|
-
assert.deepEqual(droppedEntries, [], 'a held prune drops no prior file entry');
|
|
782
|
-
} finally {
|
|
783
|
-
rmSync(sandbox.homeDirectory, { recursive: true, force: true });
|
|
784
|
-
}
|
|
785
|
-
});
|
|
786
|
-
|
|
787
|
-
test('a full install that holds the prune keeps prior manifest skill names it did not itself install', () => {
|
|
788
|
-
const sandbox = createSandbox();
|
|
789
|
-
try {
|
|
790
|
-
runInstaller(sandbox.homeDirectory, []);
|
|
791
|
-
plantSkillDirectory(sandbox.skillsDirectory, DEPENDENCY_SUPPLIED_SKILL_DIRECTORY, true);
|
|
792
|
-
const manifest = readManifest(sandbox.manifestPath);
|
|
793
|
-
manifest.skills.push(DEPENDENCY_SUPPLIED_SKILL_DIRECTORY);
|
|
794
|
-
writeFileSync(sandbox.manifestPath, JSON.stringify(manifest, null, 2) + '\n');
|
|
795
|
-
|
|
796
|
-
const installerOutput = runInstaller(sandbox.homeDirectory, [], { dependencyResolvable: false });
|
|
797
|
-
|
|
798
|
-
assert.equal(
|
|
799
|
-
installerOutput.includes(SKIP_PRUNE_NOTICE_MARKER),
|
|
800
|
-
true,
|
|
801
|
-
'the unresolved-dependency install holds both prunes',
|
|
802
|
-
);
|
|
803
|
-
const recordedSkills = new Set(readManifest(sandbox.manifestPath).skills);
|
|
804
|
-
assert.equal(
|
|
805
|
-
recordedSkills.has(DEPENDENCY_SUPPLIED_SKILL_DIRECTORY),
|
|
806
|
-
true,
|
|
807
|
-
'the name a later pruning install needs to spot the retired skill stays on the record',
|
|
808
|
-
);
|
|
809
|
-
assert.equal(
|
|
810
|
-
recordedSkills.has(SHIPPED_SKILL_DIRECTORY),
|
|
811
|
-
true,
|
|
812
|
-
'the held run still records the skills it installed itself',
|
|
636
|
+
'the shipped autoconverge overwrites the stale seeded copy',
|
|
813
637
|
);
|
|
814
638
|
} finally {
|
|
815
639
|
rmSync(sandbox.homeDirectory, { recursive: true, force: true });
|
|
@@ -856,43 +680,38 @@ test('a scoped core install ships the canonical review guide skills', () => {
|
|
|
856
680
|
}
|
|
857
681
|
});
|
|
858
682
|
|
|
859
|
-
test('
|
|
683
|
+
test('a scoped core install leaves retired skills in place; a later full install prunes them', () => {
|
|
860
684
|
const sandbox = createSandbox();
|
|
861
685
|
try {
|
|
862
686
|
for (const retiredSkill of RETIRED_SKILL_DIRECTORIES) {
|
|
863
687
|
plantSkillDirectory(sandbox.skillsDirectory, retiredSkill, true);
|
|
864
688
|
}
|
|
865
689
|
|
|
866
|
-
|
|
867
|
-
assert.equal(
|
|
868
|
-
skippedOutput.includes(SKIP_PRUNE_NOTICE_MARKER),
|
|
869
|
-
true,
|
|
870
|
-
'the unresolved-dependency install skips the prune',
|
|
871
|
-
);
|
|
690
|
+
runInstaller(sandbox.homeDirectory, ['--only', 'core']);
|
|
872
691
|
for (const retiredSkill of RETIRED_SKILL_DIRECTORIES) {
|
|
873
692
|
assert.equal(
|
|
874
693
|
existsSync(join(sandbox.skillsDirectory, retiredSkill)),
|
|
875
694
|
true,
|
|
876
|
-
`retired skill ${retiredSkill} should
|
|
695
|
+
`retired skill ${retiredSkill} should survive a scoped install`,
|
|
877
696
|
);
|
|
878
697
|
}
|
|
879
698
|
|
|
880
|
-
const
|
|
699
|
+
const fullOutput = runInstaller(sandbox.homeDirectory, []);
|
|
881
700
|
assert.equal(
|
|
882
|
-
|
|
701
|
+
fullOutput.includes(SKIP_PRUNE_NOTICE_MARKER),
|
|
883
702
|
false,
|
|
884
|
-
'the
|
|
703
|
+
'the full install runs the prune',
|
|
885
704
|
);
|
|
886
705
|
for (const retiredSkill of RETIRED_SKILL_DIRECTORIES) {
|
|
887
706
|
assert.equal(
|
|
888
707
|
existsSync(join(sandbox.skillsDirectory, retiredSkill)),
|
|
889
708
|
false,
|
|
890
|
-
`retired skill ${retiredSkill} should be pruned
|
|
709
|
+
`retired skill ${retiredSkill} should be pruned on the full install`,
|
|
891
710
|
);
|
|
892
711
|
assert.equal(
|
|
893
712
|
prunedSkillBackupContains(sandbox.claudeDirectory, retiredSkill),
|
|
894
713
|
true,
|
|
895
|
-
`retired skill ${retiredSkill} should be moved to the prune backup
|
|
714
|
+
`retired skill ${retiredSkill} should be moved to the prune backup`,
|
|
896
715
|
);
|
|
897
716
|
}
|
|
898
717
|
} finally {
|
package/bin/install.test.mjs
CHANGED
|
@@ -214,6 +214,12 @@ test('CORE_SKILLS ships issue-tracker so the core group installs the skill the S
|
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
|
|
217
|
+
test('CORE_SKILLS ships ELI5 as the leaf presentation skill', () => {
|
|
218
|
+
assert.ok(CORE_SKILLS.includes('eli5'), 'eli5 must be in CORE_SKILLS');
|
|
219
|
+
assert.equal(INSTALL_GROUPS.core.skills.includes('eli5'), true);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
|
|
217
223
|
test('EVER_SHIPPED_SKILL_NAMES retains imagegen so reinstall prunes the retired skill', () => {
|
|
218
224
|
assert.ok(
|
|
219
225
|
EVER_SHIPPED_SKILL_NAMES.has('imagegen'),
|
|
@@ -980,7 +986,6 @@ const OLD_FOLDED_HOOKS_SETTINGS = {
|
|
|
980
986
|
{ type: 'command', command: 'py -3 C:/Users/x/.claude/hooks/blocking/claude_md_orphan_file_blocker.py', timeout: 10 },
|
|
981
987
|
{ type: 'command', command: 'py -3 C:/Users/x/.claude/hooks/blocking/pytest_testpaths_orphan_blocker.py', timeout: 10 },
|
|
982
988
|
{ type: 'command', command: 'py -3 C:/Users/x/.claude/hooks/blocking/open_questions_in_plans_blocker.py', timeout: 10 },
|
|
983
|
-
{ type: 'command', command: 'py -3 C:/Users/x/.claude/hooks/blocking/plain_language_blocker.py', timeout: 10 },
|
|
984
989
|
],
|
|
985
990
|
},
|
|
986
991
|
],
|
|
@@ -988,10 +993,9 @@ const OLD_FOLDED_HOOKS_SETTINGS = {
|
|
|
988
993
|
};
|
|
989
994
|
|
|
990
995
|
|
|
991
|
-
test('FOLDED_HOOK_RELATIVE_PATHS contains all
|
|
992
|
-
assert.equal(FOLDED_HOOK_RELATIVE_PATHS.size,
|
|
996
|
+
test('FOLDED_HOOK_RELATIVE_PATHS contains all 14 hooks removed from hooks.json plus the retired md_to_html_blocker', () => {
|
|
997
|
+
assert.equal(FOLDED_HOOK_RELATIVE_PATHS.size, 15);
|
|
993
998
|
assert.ok(FOLDED_HOOK_RELATIVE_PATHS.has('blocking/write_existing_file_blocker.py'));
|
|
994
|
-
assert.ok(FOLDED_HOOK_RELATIVE_PATHS.has('blocking/plain_language_blocker.py'));
|
|
995
999
|
assert.ok(FOLDED_HOOK_RELATIVE_PATHS.has('blocking/code_rules_enforcer.py'));
|
|
996
1000
|
assert.ok(FOLDED_HOOK_RELATIVE_PATHS.has('blocking/pytest_testpaths_orphan_blocker.py'));
|
|
997
1001
|
assert.ok(FOLDED_HOOK_RELATIVE_PATHS.has('blocking/md_to_html_blocker.py'));
|
|
@@ -1014,7 +1018,6 @@ test('FOLDED_HOOK_RELATIVE_PATHS lists every hook the PreToolUse dispatcher host
|
|
|
1014
1018
|
'blocking/env_var_table_code_drift_blocker.py',
|
|
1015
1019
|
'blocking/pytest_testpaths_orphan_blocker.py',
|
|
1016
1020
|
'blocking/open_questions_in_plans_blocker.py',
|
|
1017
|
-
'blocking/plain_language_blocker.py',
|
|
1018
1021
|
];
|
|
1019
1022
|
const retiredHooks = [
|
|
1020
1023
|
'blocking/md_to_html_blocker.py',
|
|
@@ -20,6 +20,9 @@ import {
|
|
|
20
20
|
CURSOR_RULES_DIRECTORY_NAME,
|
|
21
21
|
MANAGED_SKILLS_DIRECTORY_NAME,
|
|
22
22
|
MANAGED_AGENTS_DIRECTORY_NAME,
|
|
23
|
+
MANAGED_HOOKS_DIRECTORY_NAME,
|
|
24
|
+
MANAGED_SCRIPTS_DIRECTORY_NAME,
|
|
25
|
+
CODEX_HOOKS_DIRECTORY_NAME,
|
|
23
26
|
} from './install-constants.mjs';
|
|
24
27
|
|
|
25
28
|
export const CLAUDE_CONFIG_DIR_ENVIRONMENT_VARIABLE = 'CLAUDE_CONFIG_DIR';
|
|
@@ -52,6 +55,11 @@ export const MANIFEST_FILE_NAME = '.claude-dev-env-manifest.json';
|
|
|
52
55
|
* agentsInstallDirectory: string,
|
|
53
56
|
* skillsLookupDirectory: string,
|
|
54
57
|
* agentsLookupDirectory: string,
|
|
58
|
+
* hooksInstallDirectory: string,
|
|
59
|
+
* scriptsInstallDirectory: string,
|
|
60
|
+
* hooksLookupDirectory: string,
|
|
61
|
+
* scriptsLookupDirectory: string,
|
|
62
|
+
* codexHooksInstallDirectory: string,
|
|
55
63
|
* }} InstallRootResolution
|
|
56
64
|
*/
|
|
57
65
|
|
|
@@ -127,6 +135,9 @@ export function resolveInstallRoot(options = {}) {
|
|
|
127
135
|
const codexRulesInstallDirectory = resolve(
|
|
128
136
|
join(codexHomeDirectory, CODEX_RULES_DIRECTORY_NAME),
|
|
129
137
|
);
|
|
138
|
+
const codexHooksInstallDirectory = resolve(
|
|
139
|
+
join(codexHomeDirectory, CODEX_HOOKS_DIRECTORY_NAME),
|
|
140
|
+
);
|
|
130
141
|
const cursorInstallDirectory = resolve(
|
|
131
142
|
join(homeDirectory, DEFAULT_CURSOR_DIRECTORY_NAME),
|
|
132
143
|
);
|
|
@@ -136,8 +147,12 @@ export function resolveInstallRoot(options = {}) {
|
|
|
136
147
|
const agentsHome = resolveAgentsHome(managedRoot);
|
|
137
148
|
const skillsInstallDirectory = join(agentsHome, MANAGED_SKILLS_DIRECTORY_NAME);
|
|
138
149
|
const agentsInstallDirectory = join(agentsHome, MANAGED_AGENTS_DIRECTORY_NAME);
|
|
150
|
+
const hooksInstallDirectory = join(agentsHome, MANAGED_HOOKS_DIRECTORY_NAME);
|
|
151
|
+
const scriptsInstallDirectory = join(agentsHome, MANAGED_SCRIPTS_DIRECTORY_NAME);
|
|
139
152
|
const skillsLookupDirectory = join(managedRoot, MANAGED_SKILLS_DIRECTORY_NAME);
|
|
140
153
|
const agentsLookupDirectory = join(managedRoot, MANAGED_AGENTS_DIRECTORY_NAME);
|
|
154
|
+
const hooksLookupDirectory = join(managedRoot, MANAGED_HOOKS_DIRECTORY_NAME);
|
|
155
|
+
const scriptsLookupDirectory = join(managedRoot, MANAGED_SCRIPTS_DIRECTORY_NAME);
|
|
141
156
|
return {
|
|
142
157
|
managedRoot,
|
|
143
158
|
source,
|
|
@@ -147,6 +162,7 @@ export function resolveInstallRoot(options = {}) {
|
|
|
147
162
|
allDeclaredExternalPaths: [mypyIniInstallPath],
|
|
148
163
|
allDeclaredExternalDirectories: [
|
|
149
164
|
codexRulesInstallDirectory,
|
|
165
|
+
codexHooksInstallDirectory,
|
|
150
166
|
cursorInstallDirectory,
|
|
151
167
|
agentsHome,
|
|
152
168
|
],
|
|
@@ -158,6 +174,11 @@ export function resolveInstallRoot(options = {}) {
|
|
|
158
174
|
agentsInstallDirectory,
|
|
159
175
|
skillsLookupDirectory,
|
|
160
176
|
agentsLookupDirectory,
|
|
177
|
+
hooksInstallDirectory,
|
|
178
|
+
scriptsInstallDirectory,
|
|
179
|
+
hooksLookupDirectory,
|
|
180
|
+
scriptsLookupDirectory,
|
|
181
|
+
codexHooksInstallDirectory,
|
|
161
182
|
};
|
|
162
183
|
}
|
|
163
184
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve a managed content directory in a package source tree.
|
|
3
3
|
*
|
|
4
|
-
* This package keeps
|
|
4
|
+
* This package keeps managed trees under `.agents/<name>/`. A dependency
|
|
5
5
|
* package may still keep those trees at `<package-root>/<name>/`. Callers pass
|
|
6
|
-
* the package root and the managed directory name
|
|
7
|
-
*
|
|
6
|
+
* the package root and the managed directory name; this helper returns the
|
|
7
|
+
* directory that exists.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { existsSync } from 'node:fs';
|
|
@@ -13,7 +13,7 @@ import { PACKAGE_AGENTS_HOME_DIRECTORY_NAME } from './install-constants.mjs';
|
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* @param {string} sourceRoot Package root that may hold `.agents/<name>` or `<name>`.
|
|
16
|
-
* @param {string} directoryName Managed directory name
|
|
16
|
+
* @param {string} directoryName Managed directory name.
|
|
17
17
|
* @returns {string} Absolute source directory to copy from.
|
|
18
18
|
*/
|
|
19
19
|
export function resolvePackageManagedDirectory(sourceRoot, directoryName) {
|
package/commands/AGENTS.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Slash-command definitions installed into `~/.claude/commands/` by `bin/install.mjs`. Each `.md` file registers a `/command-name` the user can type in Claude Code. The file name (without `.md`) becomes the command name.
|
|
4
4
|
|
|
5
|
+
Command bodies use `rules/asd-ste100-language.md` for user-facing word choice, sentence style, tone, punctuation, and prose form. Each command keeps its workflow contract.
|
|
6
|
+
|
|
5
7
|
## Command files
|
|
6
8
|
|
|
7
9
|
| File | Command | What it does |
|
package/commands/sr-loop.md
CHANGED
|
@@ -7,6 +7,9 @@ Run the converging cleanup loop on the target: `$ARGUMENTS` (blank means the
|
|
|
7
7
|
current branch's diff). Each phase invokes an existing skill with the Skill
|
|
8
8
|
tool and repeats it until a pass returns zero new findings.
|
|
9
9
|
|
|
10
|
+
Use `rules/asd-ste100-language.md` for user-facing wording. Keep the loop's
|
|
11
|
+
cleanup, verification, commit, push, and finish-report fields.
|
|
12
|
+
|
|
10
13
|
## Phase A — loop /simplify
|
|
11
14
|
|
|
12
15
|
1. Invoke the `simplify` skill on the target (the same review the user gets
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Prose-style enforcement
|
|
2
2
|
|
|
3
|
-
Opinionated prose gates (
|
|
3
|
+
Opinionated prose gates (hedging, historical state phrasing, intent-only endings, hook prose-detector consistency) are **off by default**.
|
|
4
4
|
|
|
5
5
|
## Opt-in
|
|
6
6
|
|
|
@@ -10,16 +10,12 @@ The flag is `PROSE_STYLE_ENFORCEMENT_ENABLED` in `hooks/blocking/config/prose_st
|
|
|
10
10
|
|
|
11
11
|
## Always on
|
|
12
12
|
|
|
13
|
-
Structural AskUserQuestion lean-block validation in `
|
|
13
|
+
Structural AskUserQuestion lean-block validation in `ask_user_question_shape_blocker` (chat detail, length caps on question blocks) stays active regardless of the flag. Apply `rules/asd-ste100-language.md` for user-facing word choice and sentence style. Code-rules and security blockers are out of scope for this switch.
|
|
14
14
|
|
|
15
15
|
## Advisory precision measurement (OP-07B)
|
|
16
16
|
|
|
17
|
-
When the flag is off,
|
|
17
|
+
When the flag is off, hedging hits still emit privacy-safe advisory candidates to `~/.claude/logs/prose-matcher-advisory.jsonl` (matcher id, surface, hashed context fingerprint, optional label). Classification (`keep` / `narrow` / `drop` / `advisory`) uses a labeled sample floor of 30 and precision floors 0.7 / 0.4. Matchers below the floor stay advisory. See `hooks/observability/prose_matcher_advisory.py`.
|
|
18
18
|
|
|
19
19
|
## Explicit uncertainty (OP-07C)
|
|
20
20
|
|
|
21
21
|
With enforcement on, a hedge word in a sentence that also labels the claim (`unverified`, `I don't know`, `no source for this claim`, …) passes. A bare hedge in a different sentence still blocks. Detail: `rules/hedging-claims.md`.
|
|
22
|
-
|
|
23
|
-
## Plain-language advisory (OP-07D)
|
|
24
|
-
|
|
25
|
-
Heavy-word matches never hard-deny a Write/Edit or AskUserQuestion. With enforcement on, the hook allows the call and returns a `systemMessage` that names everyday swaps for both AskUserQuestion and `.md` writes. Lean-block structure denials stay hard. Detail: `rules/plain-language.md`.
|
package/hooks/AGENTS.md
CHANGED
|
@@ -9,9 +9,6 @@ Python hook scripts wired into Claude Code's lifecycle via `settings.json`. Each
|
|
|
9
9
|
| `advisory/` | Hooks that warn but do not block (`permissionDecision: "ask"`) |
|
|
10
10
|
| `blocking/` | Hooks that deny tool calls when a rule is violated |
|
|
11
11
|
| `blocking/config/` | Shared constants for blocking hooks |
|
|
12
|
-
| `diagnostic/` | Hooks that record and extract hook-firing records into Neon |
|
|
13
|
-
| `diagnostic/migrations/` | SQL migrations for the `hook_events` Neon schema |
|
|
14
|
-
| `diagnostic/queries/` | Parameterized SQL queries for inspecting blocked commands |
|
|
15
12
|
| `git-hooks/` | Native git hooks (`pre-commit`, `pre-push`, `post-commit`) installed via the git-hooks path |
|
|
16
13
|
| `git-hooks/git_hooks_constants/` | Shared constants for the git-hook scripts |
|
|
17
14
|
| `hooks_constants/` | Shared constant modules imported by multiple hooks across this tree (includes `pii_prevention_constants.py` for personal-data and secret scan patterns) |
|
package/hooks/blocking/AGENTS.md
CHANGED
|
@@ -74,7 +74,6 @@ The check modules it calls are the `code_rules_<concern>.py` files below.
|
|
|
74
74
|
| `destructive_command_blocker.py` | PreToolUse (Bash/PowerShell) | Shell commands with destructive literals (`rm -rf`, `git reset --hard`, etc.) |
|
|
75
75
|
| `docstring_rule_gate_count_blocker.py` | PreToolUse (Write/Edit/MultiEdit) | A stale spelled-out gate-validator count in `docstring-prose-matches-implementation.md` — the "N more gate validators" / "M gated slices" count drifting from the `check_docstring_*` validators the prose names |
|
|
76
76
|
| `duplicate_rmtree_helper_blocker.py` | PreToolUse (Write/Edit) | A local re-definition of the Windows-safe rmtree helper trio (`_strip_read_only_and_retry`, `_force_remove_tree` / `force_rmtree`) in place of importing a shared helper |
|
|
77
|
-
| `eli11_reply_enforcer.py` | Stop | Final replies breaking the `eli11-replies` shape — more than 6 bullet lines, more than 2 list lines over 20 words each, or multi-line instructions with no numbered step among the lead lines. Code fences, inline code, blockquotes, table rows, and link targets come off before the reply is judged. |
|
|
78
77
|
| `env_var_table_code_drift_blocker.py` | PreToolUse (Write/Edit/MultiEdit) | A markdown env-var summary table row attributing an environment variable to a code file whose source never references that variable name |
|
|
79
78
|
| `es_exe_path_rewriter.py` | PreToolUse | Rewrites paths referencing `.exe` under the Everything search path |
|
|
80
79
|
| `fable_spawn_gate.py` | PreToolUse (Agent/Task) | An `Agent` or `Task` spawn whose prompt carries no `FABLE-SPAWN-AUTHORIZED` token and whose model field reads `fable` in any letter case — the bare alias, or a delimiter segment of a full model id, so `claude-fable-5` is denied too |
|
|
@@ -92,7 +91,6 @@ The check modules it calls are the `code_rules_<concern>.py` files below.
|
|
|
92
91
|
| `pii_prevention_blocker.py` | PreToolUse (Write/Edit/MultiEdit/Bash/PowerShell/MCP GitHub) | Entry hook — content that carries high-confidence personal data or secrets (real emails, home-dir paths, private IPs, credential material) on write, durable GitHub posts, or staged commit paths; resolves the staged-commit repository from the command it gates (via `pii_prevention_blocker_parts`), not the session working directory |
|
|
93
92
|
| `pii_scanner.py` | library | Pure text scanners shared by `pii_prevention_blocker.py` |
|
|
94
93
|
| `piped_pytest_blocker.py` | PreToolUse (Bash) | A pytest run whose output feeds a pipe, where the pipeline reports the exit code of the command on the right |
|
|
95
|
-
| `plain_language_blocker.py` | PreToolUse (Write/Edit/AskUserQuestion) | Heavy or jargon words in user-facing prose when `CLAUDE_PROSE_STYLE_ENFORCEMENT` is on (default off); AskUserQuestion lean-block structure stays always on |
|
|
96
94
|
| `precommit_code_rules_gate.py` | PreToolUse (Bash) | Staged changes that fail the CODE_RULES gate at commit time |
|
|
97
95
|
| `pytest_testpaths_orphan_blocker.py` | PreToolUse (Write/Edit/MultiEdit) | New `test_*.py` files created under a directory absent from a package's explicit pytest `testpaths` allowlist |
|
|
98
96
|
| `question_to_user_enforcer.py` | Stop | User-directed questions not routed through `AskUserQuestion` |
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""PreToolUse hook that enforces AskUserQuestion field shape."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import sys
|
|
8
|
+
from collections.abc import Mapping, Sequence
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
_hooks_dir = str(Path(__file__).resolve().parent.parent)
|
|
12
|
+
if _hooks_dir not in sys.path:
|
|
13
|
+
sys.path.insert(0, _hooks_dir)
|
|
14
|
+
|
|
15
|
+
from hooks_constants.ask_user_question_shape import ( # noqa: E402
|
|
16
|
+
analyze_ask_user_question_shape,
|
|
17
|
+
)
|
|
18
|
+
from hooks_constants.ask_user_question_shape_constants import ( # noqa: E402
|
|
19
|
+
ASK_USER_QUESTION_TOOL_NAME,
|
|
20
|
+
LEAN_QUESTION_BLOCK_GUIDANCE,
|
|
21
|
+
LEAN_QUESTION_BLOCK_PREFIX,
|
|
22
|
+
LEAN_QUESTION_VIOLATION_SEPARATOR,
|
|
23
|
+
USER_FACING_LEAN_QUESTION_NOTICE,
|
|
24
|
+
)
|
|
25
|
+
from hooks_constants.hook_block_logger import log_hook_block # noqa: E402
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def build_lean_block_reason(all_violations: Sequence[str]) -> str:
|
|
29
|
+
"""Build a deny reason that names each field-shape violation."""
|
|
30
|
+
violation_list = LEAN_QUESTION_VIOLATION_SEPARATOR.join(all_violations)
|
|
31
|
+
return f"{LEAN_QUESTION_BLOCK_PREFIX}{violation_list}. {LEAN_QUESTION_BLOCK_GUIDANCE}"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def evaluate(payload_by_key: Mapping[str, object]) -> str | None:
|
|
35
|
+
"""Return a deny reason when an AskUserQuestion payload breaks field shape."""
|
|
36
|
+
tool_name = payload_by_key.get("tool_name", "")
|
|
37
|
+
tool_input = payload_by_key.get("tool_input", {})
|
|
38
|
+
if tool_name != ASK_USER_QUESTION_TOOL_NAME:
|
|
39
|
+
return None
|
|
40
|
+
if not isinstance(tool_input, Mapping):
|
|
41
|
+
return None
|
|
42
|
+
shape_result = analyze_ask_user_question_shape(tool_input)
|
|
43
|
+
if shape_result.is_lean:
|
|
44
|
+
return None
|
|
45
|
+
return build_lean_block_reason(shape_result.all_violations)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def build_deny_payload(deny_reason: str) -> dict[str, object]:
|
|
49
|
+
"""Build the standard PreToolUse deny payload for a shape violation."""
|
|
50
|
+
log_hook_block(
|
|
51
|
+
calling_hook_name="ask_user_question_shape_blocker.py",
|
|
52
|
+
hook_event="PreToolUse",
|
|
53
|
+
block_reason=deny_reason,
|
|
54
|
+
)
|
|
55
|
+
return {
|
|
56
|
+
"hookSpecificOutput": {
|
|
57
|
+
"hookEventName": "PreToolUse",
|
|
58
|
+
"permissionDecision": "deny",
|
|
59
|
+
"permissionDecisionReason": deny_reason,
|
|
60
|
+
},
|
|
61
|
+
"systemMessage": USER_FACING_LEAN_QUESTION_NOTICE,
|
|
62
|
+
"suppressOutput": True,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def main() -> None:
|
|
67
|
+
"""Read one PreToolUse payload and deny malformed question shape."""
|
|
68
|
+
try:
|
|
69
|
+
payload_by_key = json.load(sys.stdin)
|
|
70
|
+
except json.JSONDecodeError:
|
|
71
|
+
sys.exit(0)
|
|
72
|
+
|
|
73
|
+
if not isinstance(payload_by_key, dict):
|
|
74
|
+
sys.exit(0)
|
|
75
|
+
deny_reason = evaluate(payload_by_key)
|
|
76
|
+
if deny_reason is None:
|
|
77
|
+
sys.exit(0)
|
|
78
|
+
sys.stdout.write(json.dumps(build_deny_payload(deny_reason)))
|
|
79
|
+
sys.stdout.flush()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
main()
|