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,436 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Stop hook that blocks egregious reply-shape failures (action-first, bullets).
|
|
4
|
-
|
|
5
|
-
The `eli11-replies` and `opus5-communication-contract` rules ask every chat
|
|
6
|
-
reply to lead with the action when the user must act, keep findings to a few
|
|
7
|
-
bullets, and stay scannable. This hook reads the final assistant message,
|
|
8
|
-
strips code fences, inline code, blockquotes, table rows, and link targets,
|
|
9
|
-
then judges shape only: multi-line instructions need numbered steps first,
|
|
10
|
-
bullet count stays bounded, and list lines stay one-idea short.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
import json
|
|
14
|
-
import sys
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
|
|
17
|
-
_hooks_dir = str(Path(__file__).resolve().parent.parent)
|
|
18
|
-
if _hooks_dir not in sys.path:
|
|
19
|
-
sys.path.insert(0, _hooks_dir)
|
|
20
|
-
|
|
21
|
-
from hooks_constants.eli11_reply_enforcer_constants import ( # noqa: E402
|
|
22
|
-
ACTION_FIRST_LEAD_LINE_COUNT,
|
|
23
|
-
ALL_IMPERATIVE_INSTRUCTION_VERBS,
|
|
24
|
-
ALL_IMPERATIVE_OBJECT_LEAD_WORDS,
|
|
25
|
-
ALPHABETIC_WORD_PATTERN,
|
|
26
|
-
BULLET_LINE_PATTERN,
|
|
27
|
-
COUNTABLE_WORD_PATTERN,
|
|
28
|
-
IMPERATIVE_OBJECT_TOKEN_PATTERN,
|
|
29
|
-
LINK_TARGET_PATTERN,
|
|
30
|
-
LIST_MARKER_PREFIX_PATTERN,
|
|
31
|
-
MARKDOWN_LEAD_MARKER_PATTERN,
|
|
32
|
-
MAXIMUM_BULLET_LINE_COUNT,
|
|
33
|
-
MAXIMUM_OVERPACKED_LIST_LINE_COUNT,
|
|
34
|
-
MAXIMUM_WORDS_PER_LIST_LINE,
|
|
35
|
-
NUMBERED_STEP_PATTERN,
|
|
36
|
-
TABLE_ROW_PATTERN,
|
|
37
|
-
TARGET_BULLET_LINE_COUNT,
|
|
38
|
-
USER_FACING_ELI11_NOTICE,
|
|
39
|
-
VIOLATION_SEPARATOR,
|
|
40
|
-
)
|
|
41
|
-
from hooks_constants.hook_block_logger import log_hook_block # noqa: E402
|
|
42
|
-
from hooks_constants.text_stripping import strip_code_and_quotes # noqa: E402
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def extract_reply_prose(assistant_message: str) -> str:
|
|
46
|
-
"""Return the reader-visible prose of a reply.
|
|
47
|
-
|
|
48
|
-
::
|
|
49
|
-
|
|
50
|
-
in: "See https://example.com/a now"
|
|
51
|
-
out: "See now"
|
|
52
|
-
|
|
53
|
-
Fenced code, inline code, and blockquotes come off through the shared
|
|
54
|
-
stripper; table rows and link targets come off here.
|
|
55
|
-
|
|
56
|
-
Args:
|
|
57
|
-
assistant_message: The raw final assistant message.
|
|
58
|
-
|
|
59
|
-
Returns:
|
|
60
|
-
The message with code, quotes, table rows, and link targets removed.
|
|
61
|
-
"""
|
|
62
|
-
prose_text = strip_code_and_quotes(assistant_message)
|
|
63
|
-
prose_text = TABLE_ROW_PATTERN.sub("", prose_text)
|
|
64
|
-
return LINK_TARGET_PATTERN.sub("", prose_text)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def collect_non_empty_lines(prose_text: str) -> list[str]:
|
|
68
|
-
"""Return every line of the stripped prose that carries visible text.
|
|
69
|
-
|
|
70
|
-
Args:
|
|
71
|
-
prose_text: Prose already cleaned of code, quotes, tables, and links.
|
|
72
|
-
|
|
73
|
-
Returns:
|
|
74
|
-
The lines with content, in order, blank lines dropped.
|
|
75
|
-
"""
|
|
76
|
-
return [
|
|
77
|
-
each_line for each_line in prose_text.splitlines() if each_line.strip()
|
|
78
|
-
]
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def leading_word_of(prose_line: str) -> str:
|
|
82
|
-
"""Return the first word of a line once list and bold markers come off.
|
|
83
|
-
|
|
84
|
-
::
|
|
85
|
-
|
|
86
|
-
in: "- **Click** Save"
|
|
87
|
-
out: "click"
|
|
88
|
-
|
|
89
|
-
Args:
|
|
90
|
-
prose_line: One non-empty line of reply prose.
|
|
91
|
-
|
|
92
|
-
Returns:
|
|
93
|
-
The lowercased first alphabetic word, or an empty string when the line
|
|
94
|
-
carries no letters.
|
|
95
|
-
"""
|
|
96
|
-
unmarked_line = LIST_MARKER_PREFIX_PATTERN.sub("", prose_line, count=1)
|
|
97
|
-
all_leading_words = ALPHABETIC_WORD_PATTERN.findall(unmarked_line)
|
|
98
|
-
if not all_leading_words:
|
|
99
|
-
return ""
|
|
100
|
-
return all_leading_words[0].lower()
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def object_word_after_leading_verb(prose_line: str) -> str:
|
|
104
|
-
"""Return the word a line puts right after its opening verb.
|
|
105
|
-
|
|
106
|
-
::
|
|
107
|
-
|
|
108
|
-
in: "Run the migration script."
|
|
109
|
-
out: "the"
|
|
110
|
-
|
|
111
|
-
Args:
|
|
112
|
-
prose_line: One non-empty line of reply prose.
|
|
113
|
-
|
|
114
|
-
Returns:
|
|
115
|
-
The lowercased token following the first alphabetic word, or an empty
|
|
116
|
-
string when the line carries no such token.
|
|
117
|
-
"""
|
|
118
|
-
unmarked_line = LIST_MARKER_PREFIX_PATTERN.sub("", prose_line, count=1)
|
|
119
|
-
leading_word_match = ALPHABETIC_WORD_PATTERN.search(unmarked_line)
|
|
120
|
-
if leading_word_match is None:
|
|
121
|
-
return ""
|
|
122
|
-
all_trailing_tokens = COUNTABLE_WORD_PATTERN.findall(
|
|
123
|
-
unmarked_line[leading_word_match.end():]
|
|
124
|
-
)
|
|
125
|
-
if not all_trailing_tokens:
|
|
126
|
-
return ""
|
|
127
|
-
return all_trailing_tokens[0].lower()
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def names_imperative_object(object_word: str) -> bool:
|
|
131
|
-
"""Return True when a word reads as the thing an imperative acts on.
|
|
132
|
-
|
|
133
|
-
::
|
|
134
|
-
|
|
135
|
-
ok: "the" (Run the script), "3" (Do 3 things), "scripts/run.py"
|
|
136
|
-
flag: "questions" (Open questions remain), "is" (Merge is complete)
|
|
137
|
-
|
|
138
|
-
An imperative names its object through a determiner, a count, a path, or a
|
|
139
|
-
filename; a narrative sentence puts a bare subject noun there instead.
|
|
140
|
-
|
|
141
|
-
Args:
|
|
142
|
-
object_word: The lowercased word following a line's opening verb.
|
|
143
|
-
|
|
144
|
-
Returns:
|
|
145
|
-
True when the word marks the opening verb as a real imperative.
|
|
146
|
-
"""
|
|
147
|
-
if not object_word:
|
|
148
|
-
return False
|
|
149
|
-
if object_word in ALL_IMPERATIVE_OBJECT_LEAD_WORDS:
|
|
150
|
-
return True
|
|
151
|
-
return IMPERATIVE_OBJECT_TOKEN_PATTERN.search(object_word) is not None
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def is_imperative_instruction_line(prose_line: str) -> bool:
|
|
155
|
-
"""Return True when a line tells the user to act.
|
|
156
|
-
|
|
157
|
-
::
|
|
158
|
-
|
|
159
|
-
ok: "Open questions remain about the stripper." -> False
|
|
160
|
-
flag: "Open the pull request." -> True
|
|
161
|
-
|
|
162
|
-
Args:
|
|
163
|
-
prose_line: One non-empty line of reply prose.
|
|
164
|
-
|
|
165
|
-
Returns:
|
|
166
|
-
True when the line opens with a tracked instruction verb naming an
|
|
167
|
-
object an imperative acts on.
|
|
168
|
-
"""
|
|
169
|
-
if leading_word_of(prose_line) not in ALL_IMPERATIVE_INSTRUCTION_VERBS:
|
|
170
|
-
return False
|
|
171
|
-
return names_imperative_object(object_word_after_leading_verb(prose_line))
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
def has_imperative_instruction_line(all_prose_lines: list[str]) -> bool:
|
|
175
|
-
"""Return True when any line opens with a verb telling the user to act.
|
|
176
|
-
|
|
177
|
-
Args:
|
|
178
|
-
all_prose_lines: The non-empty lines of reply prose.
|
|
179
|
-
|
|
180
|
-
Returns:
|
|
181
|
-
True when a line reads as an imperative instruction.
|
|
182
|
-
"""
|
|
183
|
-
return any(
|
|
184
|
-
is_imperative_instruction_line(each_line) for each_line in all_prose_lines
|
|
185
|
-
)
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
def has_leading_numbered_step(all_prose_lines: list[str]) -> bool:
|
|
189
|
-
"""Return True when a numbered step appears among the lead lines.
|
|
190
|
-
|
|
191
|
-
Args:
|
|
192
|
-
all_prose_lines: The non-empty lines of reply prose.
|
|
193
|
-
|
|
194
|
-
Returns:
|
|
195
|
-
True when one of the first lead lines opens a numbered list.
|
|
196
|
-
"""
|
|
197
|
-
all_lead_lines = all_prose_lines[:ACTION_FIRST_LEAD_LINE_COUNT]
|
|
198
|
-
return any(
|
|
199
|
-
NUMBERED_STEP_PATTERN.match(each_line) for each_line in all_lead_lines
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def count_bullet_lines(all_prose_lines: list[str]) -> int:
|
|
204
|
-
"""Return how many lines of the reply are bullets.
|
|
205
|
-
|
|
206
|
-
Args:
|
|
207
|
-
all_prose_lines: The non-empty lines of reply prose.
|
|
208
|
-
|
|
209
|
-
Returns:
|
|
210
|
-
The count of lines opening with a bullet marker.
|
|
211
|
-
"""
|
|
212
|
-
return sum(
|
|
213
|
-
1 for each_line in all_prose_lines if BULLET_LINE_PATTERN.match(each_line)
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
def count_words_in_line(prose_line: str) -> int:
|
|
218
|
-
"""Return the countable words a line carries once its list marker comes off.
|
|
219
|
-
|
|
220
|
-
::
|
|
221
|
-
|
|
222
|
-
in: "- **Save** the draft"
|
|
223
|
-
out: 3
|
|
224
|
-
|
|
225
|
-
Args:
|
|
226
|
-
prose_line: One non-empty line of reply prose.
|
|
227
|
-
|
|
228
|
-
Returns:
|
|
229
|
-
The count of tokens carrying a letter or digit, marker text excluded.
|
|
230
|
-
"""
|
|
231
|
-
unmarked_line = LIST_MARKER_PREFIX_PATTERN.sub("", prose_line, count=1)
|
|
232
|
-
return len(COUNTABLE_WORD_PATTERN.findall(unmarked_line))
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
def strip_markdown_lead_markers(prose_line: str) -> str:
|
|
236
|
-
"""Return a line with its opening blockquote, heading, and bold markers off.
|
|
237
|
-
|
|
238
|
-
::
|
|
239
|
-
|
|
240
|
-
in: "> **Bold lead:** the report follows"
|
|
241
|
-
out: "Bold lead:** the report follows"
|
|
242
|
-
|
|
243
|
-
Args:
|
|
244
|
-
prose_line: One line of raw reply text.
|
|
245
|
-
|
|
246
|
-
Returns:
|
|
247
|
-
The line with every leading markdown marker and its padding removed.
|
|
248
|
-
"""
|
|
249
|
-
return MARKDOWN_LEAD_MARKER_PATTERN.sub("", prose_line.strip(), count=1)
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
def is_list_item_line(prose_line: str) -> bool:
|
|
253
|
-
"""Return True when a line is a bullet or numbered list item.
|
|
254
|
-
|
|
255
|
-
Args:
|
|
256
|
-
prose_line: One non-empty line of reply prose.
|
|
257
|
-
|
|
258
|
-
Returns:
|
|
259
|
-
True when the line opens with a bullet or numbered-step marker.
|
|
260
|
-
"""
|
|
261
|
-
if BULLET_LINE_PATTERN.match(prose_line):
|
|
262
|
-
return True
|
|
263
|
-
return NUMBERED_STEP_PATTERN.match(prose_line) is not None
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
def count_overpacked_list_lines(all_prose_lines: list[str]) -> int:
|
|
267
|
-
"""Return how many list lines carry more words than one idea needs.
|
|
268
|
-
|
|
269
|
-
Plain paragraphs are not counted so a requested full report can use long
|
|
270
|
-
prose lines without a word ceiling.
|
|
271
|
-
|
|
272
|
-
Args:
|
|
273
|
-
all_prose_lines: The non-empty lines of reply prose.
|
|
274
|
-
|
|
275
|
-
Returns:
|
|
276
|
-
The count of bullet/numbered lines over the per-list-line word cap.
|
|
277
|
-
"""
|
|
278
|
-
return sum(
|
|
279
|
-
1
|
|
280
|
-
for each_line in all_prose_lines
|
|
281
|
-
if is_list_item_line(each_line)
|
|
282
|
-
and count_words_in_line(each_line) > MAXIMUM_WORDS_PER_LIST_LINE
|
|
283
|
-
)
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
def describe_bullet_cap_violation(bullet_line_count: int) -> str:
|
|
287
|
-
"""Return the violation text naming the bullet count and the target."""
|
|
288
|
-
return (
|
|
289
|
-
f"{bullet_line_count} bullets, over the {MAXIMUM_BULLET_LINE_COUNT}-bullet "
|
|
290
|
-
f"cap - put findings in at most {TARGET_BULLET_LINE_COUNT} bullets"
|
|
291
|
-
)
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
def describe_overpacked_list_line_violation(overpacked_line_count: int) -> str:
|
|
295
|
-
"""Return the violation text for overpacked list lines."""
|
|
296
|
-
return (
|
|
297
|
-
f"{overpacked_line_count} list lines carry too many words - one idea per "
|
|
298
|
-
f"bullet or step, at most {MAXIMUM_WORDS_PER_LIST_LINE} words each"
|
|
299
|
-
)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
def describe_action_first_violation() -> str:
|
|
303
|
-
"""Return the violation text for instructions buried under prose."""
|
|
304
|
-
return (
|
|
305
|
-
"the reply tells the user to act but leads with prose - open with "
|
|
306
|
-
"numbered steps, one short line each"
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
def is_action_first_violation(all_prose_lines: list[str]) -> bool:
|
|
311
|
-
"""Return True when multi-line instructions lack leading numbered steps.
|
|
312
|
-
|
|
313
|
-
::
|
|
314
|
-
|
|
315
|
-
ok: single-line "Run the migration." -> False
|
|
316
|
-
ok: numbered steps first, then prose -> False
|
|
317
|
-
flag: prose then "Install the package." -> True
|
|
318
|
-
|
|
319
|
-
Args:
|
|
320
|
-
all_prose_lines: The non-empty lines of reply prose.
|
|
321
|
-
|
|
322
|
-
Returns:
|
|
323
|
-
True when the reply has more than one line, carries instruction
|
|
324
|
-
lines, and shows no numbered step among its lead lines.
|
|
325
|
-
"""
|
|
326
|
-
if len(all_prose_lines) <= 1:
|
|
327
|
-
return False
|
|
328
|
-
if not has_imperative_instruction_line(all_prose_lines):
|
|
329
|
-
return False
|
|
330
|
-
return not has_leading_numbered_step(all_prose_lines)
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def collect_shape_violations(all_prose_lines: list[str]) -> list[str]:
|
|
334
|
-
"""Return the violation texts for every reply-shape rule the reply breaks.
|
|
335
|
-
|
|
336
|
-
Args:
|
|
337
|
-
all_prose_lines: The non-empty lines of reply prose.
|
|
338
|
-
|
|
339
|
-
Returns:
|
|
340
|
-
One violation text per broken rule, empty when the reply is in shape.
|
|
341
|
-
"""
|
|
342
|
-
all_violations: list[str] = []
|
|
343
|
-
if is_action_first_violation(all_prose_lines):
|
|
344
|
-
all_violations.append(describe_action_first_violation())
|
|
345
|
-
bullet_line_count = count_bullet_lines(all_prose_lines)
|
|
346
|
-
if bullet_line_count > MAXIMUM_BULLET_LINE_COUNT:
|
|
347
|
-
all_violations.append(describe_bullet_cap_violation(bullet_line_count))
|
|
348
|
-
overpacked_list_line_count = count_overpacked_list_lines(all_prose_lines)
|
|
349
|
-
if overpacked_list_line_count > MAXIMUM_OVERPACKED_LIST_LINE_COUNT:
|
|
350
|
-
all_violations.append(
|
|
351
|
-
describe_overpacked_list_line_violation(overpacked_list_line_count)
|
|
352
|
-
)
|
|
353
|
-
return all_violations
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
def find_reply_shape_violations(assistant_message: str) -> list[str]:
|
|
357
|
-
"""Return every reply-shape violation the final assistant message carries.
|
|
358
|
-
|
|
359
|
-
::
|
|
360
|
-
|
|
361
|
-
ok: a short outcome sentence -> []
|
|
362
|
-
ok: a long requested audit with few bullets -> []
|
|
363
|
-
flag: prose then buried "Install the package." -> [action-first]
|
|
364
|
-
|
|
365
|
-
Args:
|
|
366
|
-
assistant_message: The raw final assistant message.
|
|
367
|
-
|
|
368
|
-
Returns:
|
|
369
|
-
One violation text per broken rule, empty when the reply is in shape.
|
|
370
|
-
"""
|
|
371
|
-
prose_text = extract_reply_prose(assistant_message)
|
|
372
|
-
return collect_shape_violations(collect_non_empty_lines(prose_text))
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
def build_block_reason(all_violations: list[str]) -> str:
|
|
376
|
-
"""Return the corrective message naming each violation and the rewrite path.
|
|
377
|
-
|
|
378
|
-
Args:
|
|
379
|
-
all_violations: The violation texts the reply earned.
|
|
380
|
-
|
|
381
|
-
Returns:
|
|
382
|
-
The full block reason the model rewrites its reply against.
|
|
383
|
-
"""
|
|
384
|
-
formatted_violation_list = VIOLATION_SEPARATOR.join(all_violations)
|
|
385
|
-
return (
|
|
386
|
-
f"ELI11 REPLY SHAPE: Rewrite the reply into a short action-first shape "
|
|
387
|
-
f"({formatted_violation_list}).\n\n"
|
|
388
|
-
f"When the user must act, open with numbered click-by-click steps, one "
|
|
389
|
-
f"short line each. When nothing is needed, open with the outcome in one "
|
|
390
|
-
f"sentence. Keep findings to at most {TARGET_BULLET_LINE_COUNT} short "
|
|
391
|
-
f"bullets. A requested full report may run long; keep list lines short "
|
|
392
|
-
f"and lead with the outcome. Code fences, blockquotes, tables, and "
|
|
393
|
-
f"links are already exempt from shape counting.\n\n"
|
|
394
|
-
f"You MUST re-output the complete, revised response with the correction "
|
|
395
|
-
f"applied."
|
|
396
|
-
)
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
def main() -> None:
|
|
400
|
-
"""Read the Stop payload and block a reply that breaks the ELI11 shape."""
|
|
401
|
-
try:
|
|
402
|
-
hook_input = json.load(sys.stdin)
|
|
403
|
-
except json.JSONDecodeError:
|
|
404
|
-
sys.exit(0)
|
|
405
|
-
|
|
406
|
-
if hook_input.get("stop_hook_active", False):
|
|
407
|
-
sys.exit(0)
|
|
408
|
-
|
|
409
|
-
assistant_message = hook_input.get("last_assistant_message", "")
|
|
410
|
-
|
|
411
|
-
if not assistant_message:
|
|
412
|
-
sys.exit(0)
|
|
413
|
-
|
|
414
|
-
all_violations = find_reply_shape_violations(assistant_message)
|
|
415
|
-
|
|
416
|
-
if not all_violations:
|
|
417
|
-
sys.exit(0)
|
|
418
|
-
|
|
419
|
-
block_reason = build_block_reason(all_violations)
|
|
420
|
-
block_response = {
|
|
421
|
-
"decision": "block",
|
|
422
|
-
"reason": block_reason,
|
|
423
|
-
"systemMessage": USER_FACING_ELI11_NOTICE,
|
|
424
|
-
"suppressOutput": True,
|
|
425
|
-
}
|
|
426
|
-
log_hook_block(
|
|
427
|
-
calling_hook_name="eli11_reply_enforcer.py",
|
|
428
|
-
hook_event="Stop",
|
|
429
|
-
block_reason=block_reason,
|
|
430
|
-
)
|
|
431
|
-
print(json.dumps(block_response))
|
|
432
|
-
sys.exit(0)
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
if __name__ == "__main__":
|
|
436
|
-
main()
|