claude-dev-env 4.3.0 → 7.1.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/pr-description-writer.md +2 -2
- package/.agents/agents/test_agent_frontmatter.py +2 -2
- package/.agents/agents/test_pr_description_writer_style.py +1 -3
- package/.agents/skills/e-code-review/SKILL.md +12 -12
- package/.agents/skills/e-code-review/preflight-proposal.contract.test.mjs +20 -0
- package/.agents/skills/e-code-review/reference/fix.md +15 -17
- package/.agents/skills/e-code-review/reference/loop.md +35 -39
- package/.agents/skills/e-code-review/reference/mode-contract.test.mjs +2 -1
- package/.agents/skills/e-code-review/reference/preflight-proposal.md +44 -9
- package/.agents/skills/e-code-review/reference/runner-selection.md +13 -14
- package/.agents/skills/issue-tracker/SKILL.md +5 -4
- package/.agents/skills/pull-request/SKILL.md +11 -13
- package/.agents/skills/pull-request/reference/publication-tasks.md +3 -3
- package/.agents/skills/pull-request/scripts/github_pr_command_constants/config/constants.py +9 -1
- package/.agents/skills/pull-request/scripts/pull_request.py +35 -44
- package/.agents/skills/pull-request/scripts/test_github_pr_command_constants.py +9 -0
- package/.agents/skills/pull-request/scripts/test_pull_request.py +35 -3
- package/.agents/skills/session-continuity/README.md +189 -0
- package/.agents/skills/session-continuity/SKILL.md +114 -0
- package/.agents/skills/session-continuity/continuity.mjs +375 -0
- package/.agents/skills/session-continuity/continuity.test.mjs +303 -0
- package/.agents/skills/skill-builder/SKILL.md +3 -196
- package/.agents/skills/syncing-submodules/scripts/test_sync_parent_pointer.py +0 -7
- package/.agents/skills/windows-scheduled-task/SKILL.md +153 -0
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/terminology_sweep_constants.py +6 -0
- package/_shared/pr-loop/scripts/terminology_sweep.py +64 -19
- package/_shared/pr-loop/scripts/tests/test_terminology_sweep.py +59 -0
- package/bin/cde.mjs +36 -8
- package/bin/cde.test.mjs +48 -0
- package/bin/ever-shipped-skills.mjs +2 -20
- package/bin/ever-shipped-skills.test.mjs +8 -0
- package/bin/expand_home_directory_tokens.mjs +4 -5
- package/bin/expand_home_directory_tokens.test.mjs +128 -0
- package/bin/git_hooks_installer.mjs +22 -3
- package/bin/git_hooks_installer.test.mjs +159 -5
- package/bin/install-session-continuity.mjs +78 -0
- package/bin/install-session-continuity.test.mjs +42 -0
- package/bin/install.agents-home.test.mjs +15 -13
- package/bin/install.codex-rules.test.mjs +5 -2
- package/bin/install.cursor-rules.test.mjs +5 -2
- package/bin/install.mjs +506 -63
- package/bin/install.policy-lint.test.mjs +130 -0
- package/bin/install.profiles.test.mjs +10 -0
- package/bin/install.prune.test.mjs +286 -37
- package/bin/install.pstack-plugin.test.mjs +114 -0
- package/bin/install.test.mjs +537 -120
- package/bin/install.transaction.test.mjs +3 -3
- package/bin/refresh-pstack-plugin-skills.test.mjs +211 -0
- package/docs/CODE_RULES.md +1 -1
- package/hooks/advisory/pr_done_reminder.py +342 -0
- package/hooks/advisory/test_pr_done_reminder.py +249 -0
- package/hooks/blocking/bash_post_call_dispatcher.py +53 -6
- package/hooks/blocking/code_rules_banned_identifiers.py +3 -0
- package/hooks/blocking/code_rules_paired_test.py +22 -15
- package/hooks/blocking/precommit_code_rules_gate.py +5 -8
- package/hooks/blocking/test_bash_dispatcher_interpreter_starts.py +7 -52
- package/hooks/blocking/test_bash_post_call_dispatcher.py +65 -4
- package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +0 -69
- package/hooks/blocking/test_code_rules_banned_identifiers.py +64 -0
- package/hooks/blocking/test_code_rules_enforcer_paired_test.py +36 -29
- package/hooks/blocking/test_code_rules_js_resume_task_enumeration.py +4 -4
- package/hooks/blocking/test_code_rules_js_returns_object_schemaless.py +5 -5
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +43 -342
- package/hooks/blocking/test_pre_tool_use_dispatcher_native.py +20 -51
- package/hooks/blocking/test_shared_stdin_adoption.py +1 -47
- package/hooks/git-hooks/git_hooks_constants/staged_policy_lint.py +12 -0
- package/hooks/git-hooks/git_hooks_constants/verification_notice_constants.py +116 -0
- package/hooks/git-hooks/post_commit.py +33 -0
- package/hooks/git-hooks/pre_commit.py +18 -49
- package/hooks/git-hooks/pre_push.py +45 -541
- package/hooks/git-hooks/test_installed_policy_lint.py +208 -0
- package/hooks/git-hooks/test_native_hook_support.py +129 -0
- package/hooks/git-hooks/test_native_policy_commit.py +120 -0
- package/hooks/git-hooks/test_post_commit.py +43 -0
- package/hooks/git-hooks/test_pre_commit.py +38 -148
- package/hooks/git-hooks/test_pre_push.py +48 -1631
- package/hooks/git-hooks/test_verification_notice.py +60 -0
- package/hooks/git-hooks/test_verification_start.py +173 -0
- package/hooks/git-hooks/verification_notice.py +192 -0
- package/hooks/git-hooks/verification_notice_context.py +253 -0
- package/hooks/git-hooks/verification_notice_state.py +237 -0
- package/hooks/git-hooks/verification_start.py +100 -0
- package/hooks/hooks.json +1 -120
- package/hooks/hooks_constants/banned_identifiers_constants.py +4 -0
- package/hooks/hooks_constants/bash_post_call_dispatcher_constants.py +14 -1
- package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +1 -15
- package/hooks/hooks_constants/post_tool_use_dispatcher_constants.py +0 -4
- package/hooks/hooks_constants/pr_done_reminder_constants.py +98 -0
- package/hooks/hooks_constants/pre_tool_use_dispatcher_constants.py +10 -93
- package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -4
- package/hooks/hooks_constants/test_bash_post_call_dispatcher_constants.py +19 -2
- package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +3 -66
- package/hooks/hooks_constants/test_pr_done_reminder_constants.py +40 -0
- package/hooks/hooks_constants/test_pre_tool_use_dispatcher_constants.py +46 -201
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +3 -25
- package/hooks/validation/test_post_tool_use_dispatcher.py +35 -298
- package/hooks/validators/run_all_validators.py +5 -1
- package/hooks/validators/security_checks.py +57 -2
- package/hooks/validators/test_hook_timing_harness.py +2 -5
- package/hooks/validators/test_run_all_validators_mutation_tool_parity.py +3 -11
- package/hooks/validators/test_run_all_validators_policy_lint.py +36 -0
- package/hooks/validators/test_security_checks.py +57 -0
- package/package.json +2 -2
- package/rules/confirm-implementation-forks.md +2 -0
- package/rules/durable-post-artifacts.md +2 -1
- package/rules/git-workflow.md +18 -6
- package/rules/pstack-host-mapping.md +48 -0
- package/rules/vault-context.md +3 -5
- package/rules/verify-runtime-state.md +7 -0
- package/scripts/audit-hooks-cli.mjs +5 -0
- package/scripts/audit-hooks.mjs +72 -16
- package/scripts/automatic_advisory/__init__.py +1 -0
- package/scripts/automatic_advisory/checkout.py +51 -0
- package/scripts/automatic_advisory/cli.py +334 -0
- package/scripts/automatic_advisory/config/__init__.py +1 -0
- package/scripts/automatic_advisory/config/constants.py +93 -0
- package/scripts/automatic_advisory/config/timing.py +4 -0
- package/scripts/automatic_advisory/configuration.py +197 -0
- package/scripts/automatic_advisory/execution.py +350 -0
- package/scripts/automatic_advisory/git.py +69 -0
- package/scripts/automatic_advisory/model.py +107 -0
- package/scripts/automatic_advisory/process_host.py +32 -0
- package/scripts/automatic_advisory/publisher.py +84 -0
- package/scripts/automatic_advisory/runner.py +399 -0
- package/scripts/automatic_advisory/state.py +116 -0
- package/scripts/automatic_advisory/window_flags.py +41 -0
- package/scripts/automatic_advisory/windows_job.py +122 -0
- package/scripts/check.ps1 +0 -1
- package/{.agents/skills/run-claude-dev-env/driver.mjs → scripts/ci/installer-lifecycle.mjs} +3 -28
- package/scripts/ci/installer-lifecycle.test.mjs +26 -0
- package/scripts/ci/windows-installer-lifecycle.ps1 +1 -11
- package/scripts/codex_compat_materializer.py +99 -13
- package/scripts/dev_env_scripts_constants/shared_tree_constants.py +4 -5
- package/{.agents/skills/_shared/pr-loop/scripts → scripts}/durable_post_lint.py +35 -43
- package/{.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/durable_post_lint_constants.py → scripts/durable_post_lint_config/config/constants.py} +10 -10
- package/{.agents/skills/_shared/pr-loop/scripts/test_durable_post_lint_constants.py → scripts/durable_post_lint_config/config/test_constants.py} +14 -1
- package/scripts/local_report_cli.py +184 -0
- package/scripts/local_report_core.py +247 -0
- package/scripts/local_report_publisher.py +12 -0
- package/scripts/local_report_validation.py +357 -0
- package/scripts/local_verification/__init__.py +23 -0
- package/scripts/local_verification/check_runner.py +364 -0
- package/scripts/local_verification/check_support.py +99 -0
- package/scripts/local_verification/cli.py +158 -0
- package/scripts/local_verification/command_runner.py +84 -0
- package/scripts/local_verification/config/__init__.py +1 -0
- package/scripts/local_verification/config/constants.py +89 -0
- package/scripts/local_verification/config/timing.py +1 -0
- package/scripts/local_verification/git_state.py +146 -0
- package/scripts/local_verification/manifest.py +224 -0
- package/scripts/local_verification/model.py +174 -0
- package/scripts/local_verification/runner.py +234 -0
- package/scripts/policy_lint/adapter_detectors.py +13 -6
- package/scripts/policy_lint/adapter_pairing.py +58 -3
- package/scripts/policy_lint/adapters.py +7 -4
- package/scripts/policy_lint/config/approved_test_pairs.py +323 -0
- package/scripts/policy_lint/config/constants.py +5 -0
- package/scripts/policy_lint/engine.py +48 -4
- package/scripts/policy_lint/model.py +1 -0
- package/scripts/policy_lint/registry.py +1 -1
- package/scripts/policy_lint/selection.py +2 -1
- package/scripts/policy_lint/selection_git.py +2 -0
- package/scripts/pr_verification/__init__.py +1 -0
- package/scripts/pr_verification/branch_refs.py +114 -0
- package/scripts/pr_verification/config/__init__.py +1 -0
- package/scripts/pr_verification/config/constants.py +84 -0
- package/scripts/pr_verification/config/timing.py +5 -0
- package/scripts/pr_verification/github.py +137 -0
- package/scripts/pr_verification/github_api.py +376 -0
- package/scripts/pr_verification/github_labels.py +88 -0
- package/scripts/pr_verification/github_parsing.py +182 -0
- package/scripts/pr_verification/github_transport.py +91 -0
- package/scripts/pr_verification/lock.py +122 -0
- package/scripts/pr_verification/model.py +43 -0
- package/scripts/pr_verification/requirements.txt +1 -0
- package/scripts/refresh_pstack_plugin_skills.mjs +200 -0
- package/scripts/shared_tree_paths.py +32 -3
- package/{.agents/skills/_shared/pr-loop/scripts → scripts}/test_durable_post_lint.py +97 -0
- package/scripts/test_shared_tree_paths.py +33 -0
- package/scripts/tests/test-audit-hooks-cli.mjs +150 -0
- package/scripts/tests/test-audit-hooks.mjs +94 -2
- package/scripts/tests/test_automatic_advisory.py +376 -0
- package/scripts/tests/test_automatic_advisory_job_cleanup.py +71 -0
- package/scripts/tests/test_automatic_advisory_polling.py +216 -0
- package/scripts/tests/test_automatic_advisory_recovery.py +320 -0
- package/scripts/tests/test_automatic_advisory_repairs.py +400 -0
- package/scripts/tests/test_automatic_advisory_settings.py +48 -0
- package/scripts/tests/test_automatic_advisory_window_flags.py +163 -0
- package/scripts/tests/test_closed_pr_label.py +157 -0
- package/scripts/tests/test_codex_compat_materializer.py +189 -6
- package/scripts/tests/test_github_labels.py +101 -0
- package/scripts/tests/test_github_transport.py +125 -0
- package/scripts/tests/test_local_report_publisher.py +396 -0
- package/scripts/tests/test_local_report_publisher_cli.py +85 -0
- package/scripts/tests/test_local_verification.py +348 -0
- package/scripts/tests/test_local_verification_cli.py +98 -0
- package/scripts/tests/test_policy_lint_rules_archive.py +120 -0
- package/scripts/tests/test_policy_lint_rules_engine.py +25 -4
- package/scripts/tests/test_policy_lint_rules_installed_loader.py +29 -0
- package/scripts/tests/test_policy_lint_rules_pairing.py +163 -0
- package/scripts/tests/test_policy_lint_rules_registry.py +227 -13
- package/scripts/tests/test_policy_lint_selection.py +25 -2
- package/scripts/tests/test_policy_lint_selection_native_index.py +30 -0
- package/scripts/tests/test_pr_verification_github.py +392 -0
- package/scripts/tests/test_pr_verification_lock.py +168 -0
- package/scripts/tests/test_rules.py +3 -7
- package/scripts/tests/test_verification_notice.py +347 -0
- package/.agents/skills/_shared/pr-loop/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/audit-contract.md +0 -5
- package/.agents/skills/_shared/pr-loop/audit-reply-template.md +0 -5
- package/.agents/skills/_shared/pr-loop/code-rules-gate.md +0 -5
- package/.agents/skills/_shared/pr-loop/fix-protocol.md +0 -5
- package/.agents/skills/_shared/pr-loop/gh-payloads.md +0 -5
- package/.agents/skills/_shared/pr-loop/portable-driver.md +0 -149
- package/.agents/skills/_shared/pr-loop/post-audit-thread-contract.md +0 -5
- package/.agents/skills/_shared/pr-loop/precatch-rubric.md +0 -5
- package/.agents/skills/_shared/pr-loop/preflight-proposal.contract.test.mjs +0 -119
- package/.agents/skills/_shared/pr-loop/preflight-proposal.md +0 -5
- package/.agents/skills/_shared/pr-loop/prompts/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/prompts/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/prompts/pr-consistency-audit.xml +0 -324
- package/.agents/skills/_shared/pr-loop/scripts/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/RUNTIME_SCRIPTS.md +0 -29
- package/.agents/skills/_shared/pr-loop/scripts/_cli_utils.py +0 -22
- package/.agents/skills/_shared/pr-loop/scripts/_path_resolver.py +0 -186
- package/.agents/skills/_shared/pr-loop/scripts/_xml_utils.py +0 -20
- package/.agents/skills/_shared/pr-loop/scripts/audit_category_schema.py +0 -355
- package/.agents/skills/_shared/pr-loop/scripts/build_audit_prompt.py +0 -289
- package/.agents/skills/_shared/pr-loop/scripts/build_converge_task_list.py +0 -310
- package/.agents/skills/_shared/pr-loop/scripts/build_fix_prompt.py +0 -292
- package/.agents/skills/_shared/pr-loop/scripts/init_loop_state.py +0 -134
- package/.agents/skills/_shared/pr-loop/scripts/portable_converge_driver.py +0 -1646
- package/.agents/skills/_shared/pr-loop/scripts/preflight_worktree.py +0 -392
- package/.agents/skills/_shared/pr-loop/scripts/select_converge_pacer.py +0 -215
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/.claude/CLAUDE.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/AGENTS.md +0 -1
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/__init__.py +0 -0
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/audit_category_schema_constants.py +0 -37
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/converge_task_list_constants.py +0 -56
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/handoff_constants.py +0 -45
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/pacer_constants.py +0 -47
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/path_resolver_constants.py +0 -157
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/portable_driver_constants.py +0 -177
- package/.agents/skills/_shared/pr-loop/scripts/skills_pr_loop_constants/preflight_constants.py +0 -70
- package/.agents/skills/_shared/pr-loop/scripts/teardown_worktrees.py +0 -172
- package/.agents/skills/_shared/pr-loop/scripts/test__path_resolver.py +0 -106
- package/.agents/skills/_shared/pr-loop/scripts/test_audit_category_schema.py +0 -94
- package/.agents/skills/_shared/pr-loop/scripts/test_build_audit_prompt.py +0 -499
- package/.agents/skills/_shared/pr-loop/scripts/test_build_converge_task_list.py +0 -140
- package/.agents/skills/_shared/pr-loop/scripts/test_build_fix_prompt.py +0 -262
- package/.agents/skills/_shared/pr-loop/scripts/test_init_loop_state.py +0 -71
- package/.agents/skills/_shared/pr-loop/scripts/test_portable_converge_driver.py +0 -1119
- package/.agents/skills/_shared/pr-loop/scripts/test_preflight_worktree.py +0 -287
- package/.agents/skills/_shared/pr-loop/scripts/test_select_converge_pacer.py +0 -207
- package/.agents/skills/_shared/pr-loop/scripts/test_teardown_worktrees.py +0 -59
- package/.agents/skills/_shared/pr-loop/scripts/test_write_handoff.py +0 -201
- package/.agents/skills/_shared/pr-loop/scripts/write_audit_outcomes.py +0 -182
- package/.agents/skills/_shared/pr-loop/scripts/write_fix_outcomes.py +0 -206
- package/.agents/skills/_shared/pr-loop/scripts/write_handoff.py +0 -309
- package/.agents/skills/_shared/pr-loop/state-schema.md +0 -5
- package/.agents/skills/_shared/pr-loop/worker-spawn.md +0 -5
- package/.agents/skills/autoconverge/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/SKILL.md +0 -431
- package/.agents/skills/autoconverge/reference/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/reference/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/reference/closing-report.md +0 -93
- package/.agents/skills/autoconverge/reference/convergence-gates.md +0 -31
- package/.agents/skills/autoconverge/reference/convergence.md +0 -219
- package/.agents/skills/autoconverge/reference/copilot-findings.md +0 -51
- package/.agents/skills/autoconverge/reference/gotchas.md +0 -66
- package/.agents/skills/autoconverge/reference/headless-safety.md +0 -44
- package/.agents/skills/autoconverge/reference/multi-pr.md +0 -128
- package/.agents/skills/autoconverge/reference/self-closing-loop.md +0 -84
- package/.agents/skills/autoconverge/reference/stop-conditions.md +0 -127
- package/.agents/skills/autoconverge/test_portable_pacer_gate.py +0 -54
- package/.agents/skills/autoconverge/workflow/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/workflow/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/workflow/aggregate_runs.py +0 -371
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/.claude/CLAUDE.md +0 -1
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/AGENTS.md +0 -1
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/__init__.py +0 -0
- package/.agents/skills/autoconverge/workflow/autoconverge_report_constants/render_report_constants.py +0 -250
- package/.agents/skills/autoconverge/workflow/converge.clean-audit.test.mjs +0 -665
- package/.agents/skills/autoconverge/workflow/converge.codex-gate.test.mjs +0 -472
- package/.agents/skills/autoconverge/workflow/converge.contract.test.mjs +0 -64
- package/.agents/skills/autoconverge/workflow/converge.copilot-gate.test.mjs +0 -1009
- package/.agents/skills/autoconverge/workflow/converge.fix-progress.test.mjs +0 -107
- package/.agents/skills/autoconverge/workflow/converge.fix-recovery.test.mjs +0 -33
- package/.agents/skills/autoconverge/workflow/converge.merge-conflict.test.mjs +0 -15
- package/.agents/skills/autoconverge/workflow/converge.mjs +0 -3132
- package/.agents/skills/autoconverge/workflow/converge.p2-advance.test.mjs +0 -202
- package/.agents/skills/autoconverge/workflow/converge.path-aware.test.mjs +0 -47
- package/.agents/skills/autoconverge/workflow/converge.precatch.test.mjs +0 -152
- package/.agents/skills/autoconverge/workflow/converge.run-input.test.mjs +0 -116
- package/.agents/skills/autoconverge/workflow/converge_multi.mjs +0 -169
- package/.agents/skills/autoconverge/workflow/converge_multi.run-input.test.mjs +0 -173
- package/.agents/skills/autoconverge/workflow/convergence_summary.py +0 -110
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ab1c2d3e4f5a6b7c8.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +0 -2
- package/.agents/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +0 -266
- package/.agents/skills/autoconverge/workflow/render_report.py +0 -1024
- package/.agents/skills/autoconverge/workflow/test_aggregate_runs.py +0 -134
- package/.agents/skills/autoconverge/workflow/test_convergence_summary.py +0 -149
- package/.agents/skills/autoconverge/workflow/test_render_report.py +0 -812
- package/.agents/skills/hitl/SKILL.md +0 -45
- package/.agents/skills/pr-cleanup/SKILL.md +0 -140
- package/.agents/skills/pr-cleanup/reference/process-inventory.md +0 -17
- package/.agents/skills/pr-cleanup/reference/task-seeds.md +0 -22
- package/.agents/skills/pr-name-by-capability/SKILL.md +0 -73
- package/.agents/skills/pr-name-by-capability/reference/fetch-commands.md +0 -29
- package/.agents/skills/pr-name-by-capability/reference/offense-examples.md +0 -32
- package/.agents/skills/pr-name-by-capability/reference/report-template.md +0 -29
- package/.agents/skills/pr-name-by-capability/reference/rule-checklist.md +0 -38
- package/.agents/skills/pr-name-by-capability/reference/task-seeds.md +0 -10
- package/.agents/skills/pr-plain-language-cleanup/SKILL.md +0 -93
- package/.agents/skills/pr-refinement/SKILL.md +0 -31
- package/.agents/skills/pr-shared-extraction/SKILL.md +0 -177
- package/.agents/skills/pr-shared-extraction/reference/examples.md +0 -46
- package/.agents/skills/pr-shared-extraction/reference/offense-taxonomy.md +0 -100
- package/.agents/skills/pr-small-cl/SKILL.md +0 -52
- package/.agents/skills/pr-title-description/SKILL.md +0 -96
- package/.agents/skills/prototype/SKILL.md +0 -85
- package/.agents/skills/prototype/reference/honest-limitations.md +0 -23
- package/.agents/skills/prototype/reference/promotion-tasks.md +0 -23
- package/.agents/skills/prototype/scripts/build_sandbox_settings.py +0 -249
- package/.agents/skills/prototype/scripts/conftest.py +0 -15
- package/.agents/skills/prototype/scripts/launch_sandbox.py +0 -205
- package/.agents/skills/prototype/scripts/probe_sandbox_safety.py +0 -311
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/__init__.py +0 -1
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/__init__.py +0 -0
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/build_sandbox_settings_constants.py +0 -41
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/launch_sandbox_constants.py +0 -23
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/probe_sandbox_safety_constants.py +0 -45
- package/.agents/skills/prototype/scripts/prototype_scripts_constants/config/prototype_common_constants.py +0 -10
- package/.agents/skills/prototype/scripts/test_build_sandbox_settings.py +0 -275
- package/.agents/skills/prototype/scripts/test_launch_sandbox.py +0 -303
- package/.agents/skills/prototype/scripts/test_probe_sandbox_safety.py +0 -312
- package/.agents/skills/prototype/workflows/promotion.md +0 -25
- package/.agents/skills/prototype/workflows/sandbox.md +0 -35
- package/.agents/skills/rebase/.claude/CLAUDE.md +0 -1
- package/.agents/skills/rebase/AGENTS.md +0 -1
- package/.agents/skills/rebase/SKILL.md +0 -178
- package/.agents/skills/review-router/SKILL.md +0 -51
- package/.agents/skills/review-router/reference/route-policy.json +0 -7
- package/.agents/skills/review-router/reference/task-seeds.md +0 -1
- package/.agents/skills/review-router/scripts/conftest.py +0 -4
- package/.agents/skills/review-router/scripts/review_router.py +0 -50
- package/.agents/skills/review-router/scripts/review_router_cli.py +0 -211
- package/.agents/skills/review-router/scripts/review_router_constants/__init__.py +0 -1
- 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 +0 -13
- package/.agents/skills/review-router/scripts/test_review_router.py +0 -23
- package/.agents/skills/review-router/scripts/test_review_router_cli.py +0 -47
- package/.agents/skills/review-tier/SKILL.md +0 -56
- package/.agents/skills/review-tier/reference/task-seeds.md +0 -1
- package/.agents/skills/review-tier/reference/tier-policy.json +0 -9
- package/.agents/skills/review-tier/scripts/conftest.py +0 -4
- package/.agents/skills/review-tier/scripts/review_tier.py +0 -359
- package/.agents/skills/review-tier/scripts/review_tier_constants/__init__.py +0 -1
- 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 +0 -29
- package/.agents/skills/review-tier/scripts/test_generation.py +0 -159
- package/.agents/skills/review-tier/scripts/test_review_tier.py +0 -33
- package/.agents/skills/run-claude-dev-env/SKILL.md +0 -84
- package/.agents/skills/session-log/.claude/CLAUDE.md +0 -1
- package/.agents/skills/session-log/AGENTS.md +0 -1
- package/.agents/skills/session-log/SKILL.md +0 -170
- package/.agents/skills/session-log/templates/frontmatter.md +0 -40
- package/.agents/skills/session-tidy/.claude/CLAUDE.md +0 -1
- package/.agents/skills/session-tidy/AGENTS.md +0 -1
- package/.agents/skills/session-tidy/SKILL.md +0 -191
- package/.agents/skills/skill-builder/references/.claude/CLAUDE.md +0 -1
- package/.agents/skills/skill-builder/references/AGENTS.md +0 -1
- package/.agents/skills/skill-builder/references/delegation-map.md +0 -130
- package/.agents/skills/skill-builder/references/description-field.md +0 -111
- package/.agents/skills/skill-builder/references/deterministic-elements.md +0 -218
- package/.agents/skills/skill-builder/references/progressive-disclosure.md +0 -122
- package/.agents/skills/skill-builder/references/self-audit-checklist.md +0 -126
- package/.agents/skills/skill-builder/references/skill-modularity.md +0 -111
- package/.agents/skills/skill-builder/references/skill-types.md +0 -232
- package/.agents/skills/skill-builder/references/thariq-x-post-skills.json +0 -33
- package/.agents/skills/skill-builder/templates/.claude/CLAUDE.md +0 -1
- package/.agents/skills/skill-builder/templates/AGENTS.md +0 -1
- package/.agents/skills/skill-builder/templates/gap-analysis.md +0 -87
- package/.agents/skills/skill-builder/workflows/.claude/CLAUDE.md +0 -1
- package/.agents/skills/skill-builder/workflows/AGENTS.md +0 -1
- package/.agents/skills/skill-builder/workflows/improve-skill.md +0 -136
- package/.agents/skills/skill-builder/workflows/new-skill.md +0 -179
- package/.agents/skills/skill-builder/workflows/polish-skill.md +0 -139
- package/.agents/skills/source-command-sr-loop/SKILL.md +0 -82
- package/.agents/skills/update/.claude/CLAUDE.md +0 -1
- package/.agents/skills/update/AGENTS.md +0 -1
- package/.agents/skills/update/SKILL.md +0 -190
- package/_shared/pr-loop/AGENTS.md +0 -1
- package/_shared/pr-loop/audit-contract.md +0 -183
- package/_shared/pr-loop/audit-reply-template.md +0 -151
- package/_shared/pr-loop/code-rules-gate.md +0 -65
- package/_shared/pr-loop/fix-protocol.md +0 -60
- package/_shared/pr-loop/gh-payloads.md +0 -75
- package/_shared/pr-loop/post-audit-thread-contract.md +0 -51
- package/_shared/pr-loop/precatch-rubric.md +0 -66
- package/_shared/pr-loop/preflight-proposal.md +0 -56
- package/_shared/pr-loop/scripts/post_audit_thread.py +0 -1242
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/post_audit_thread_constants.py +0 -199
- package/_shared/pr-loop/scripts/tests/test_post_audit_thread.py +0 -1115
- package/_shared/pr-loop/scripts/tests/test_post_audit_thread_constants.py +0 -129
- package/_shared/pr-loop/state-schema.md +0 -45
- package/_shared/pr-loop/worker-spawn.md +0 -189
- package/hooks/blocking/ask_user_question_shape_blocker.py +0 -83
- package/hooks/blocking/bot_mention_comment_blocker.py +0 -76
- package/hooks/blocking/claude_md_orphan_file_blocker.py +0 -129
- package/hooks/blocking/cursor_cli_python_misfire_blocker.py +0 -108
- package/hooks/blocking/destructive_command_blocker.py +0 -2073
- package/hooks/blocking/fable_spawn_gate.py +0 -187
- package/hooks/blocking/luna_fast_mode_gate.py +0 -160
- package/hooks/blocking/nas_ssh_binary_enforcer.py +0 -163
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +0 -260
- package/hooks/blocking/package_inventory_stale_blocker.py +0 -107
- package/hooks/blocking/pii_prevention_blocker.py +0 -365
- package/hooks/blocking/piped_pytest_blocker.py +0 -1223
- package/hooks/blocking/question_to_user_enforcer.py +0 -130
- package/hooks/blocking/send_user_file_open_locally_blocker.py +0 -71
- package/hooks/blocking/sensitive_file_protector.py +0 -167
- package/hooks/blocking/session_edit_stage_gate.py +0 -684
- package/hooks/blocking/session_handoff_blocker.py +0 -182
- package/hooks/blocking/shell_substitution_blocker.py +0 -350
- package/hooks/blocking/test_ask_user_question_shape.py +0 -69
- package/hooks/blocking/test_bot_mention_comment_blocker.py +0 -131
- package/hooks/blocking/test_claude_md_orphan_file_blocker.py +0 -1277
- package/hooks/blocking/test_cursor_cli_python_misfire_blocker.py +0 -208
- package/hooks/blocking/test_destructive_command_blocker.py +0 -2024
- package/hooks/blocking/test_destructive_command_blocker_deny_mode.py +0 -105
- package/hooks/blocking/test_destructive_command_blocker_no_verify.py +0 -122
- package/hooks/blocking/test_destructive_command_blocker_patterns.py +0 -133
- package/hooks/blocking/test_fable_spawn_gate.py +0 -381
- package/hooks/blocking/test_inventory_deadlock_resolution.py +0 -154
- package/hooks/blocking/test_luna_fast_mode_gate.py +0 -211
- package/hooks/blocking/test_nas_ssh_binary_enforcer.py +0 -225
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +0 -231
- package/hooks/blocking/test_package_inventory_stale_blocker.py +0 -382
- package/hooks/blocking/test_pii_prevention_blocker.py +0 -1222
- package/hooks/blocking/test_pii_prevention_windows_git_path.py +0 -41
- package/hooks/blocking/test_pii_write_surface_ephemeral.py +0 -221
- package/hooks/blocking/test_piped_pytest_blocker.py +0 -587
- package/hooks/blocking/test_precommit_code_rules_gate_native_owner.py +0 -233
- package/hooks/blocking/test_question_to_user_enforcer.py +0 -169
- package/hooks/blocking/test_send_user_file_open_locally_blocker.py +0 -118
- package/hooks/blocking/test_sensitive_file_protector.py +0 -365
- package/hooks/blocking/test_session_edit_stage_gate.py +0 -537
- package/hooks/blocking/test_session_edit_stage_gate_staging.py +0 -64
- package/hooks/blocking/test_session_edit_stage_gate_support.py +0 -204
- package/hooks/blocking/test_session_edit_stage_gate_tracker.py +0 -116
- package/hooks/blocking/test_session_handoff_blocker.py +0 -318
- package/hooks/blocking/test_shell_substitution_blocker.py +0 -298
- package/hooks/blocking/test_unscoped_search_blocker.py +0 -102
- package/hooks/blocking/test_write_existing_file_blocker.py +0 -122
- package/hooks/blocking/tests/test_pii_prevention_blocker.py +0 -259
- package/hooks/blocking/unscoped_search_blocker.py +0 -391
- package/hooks/blocking/write_existing_file_blocker.py +0 -124
- package/hooks/hooks_constants/bot_mention_comment_blocker_constants.py +0 -19
- package/hooks/hooks_constants/cursor_cli_python_misfire_blocker_constants.py +0 -79
- package/hooks/hooks_constants/fable_spawn_gate_constants.py +0 -61
- package/hooks/hooks_constants/luna_fast_mode_gate_constants.py +0 -45
- package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +0 -20
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +0 -57
- package/hooks/hooks_constants/send_user_file_open_locally_blocker_constants.py +0 -17
- package/hooks/hooks_constants/sensitive_file_protector_constants.py +0 -40
- package/hooks/hooks_constants/session_handoff_blocker_constants.py +0 -10
- package/hooks/hooks_constants/shell_substitution_blocker_constants.py +0 -80
- /package/.agents/skills/{_shared/pr-loop → session-continuity}/AGENTS.md +0 -0
- /package/{_shared/pr-loop → .agents/skills/session-continuity}/CLAUDE.md +0 -0
|
@@ -6,7 +6,7 @@ tools: Read,Grep,Glob,Bash
|
|
|
6
6
|
|
|
7
7
|
# PR Description Writer
|
|
8
8
|
|
|
9
|
-
Write from the current pull request diff and task. Resolve the active managed root and active agents home before reading guides: `~/.claude` is the default root, `CLAUDE_CONFIG_DIR` selects another root, and `--target DIR` takes precedence; the default `.claude` root uses sibling `~/.agents`, while another root uses sibling `<root-name>.agents`. Use
|
|
9
|
+
Write from the current pull request diff and task. Resolve the active managed root and active agents home before reading guides: `~/.claude` is the default root, `CLAUDE_CONFIG_DIR` selects another root, and `--target DIR` takes precedence; the default `.claude` root uses sibling `~/.agents`, while another root uses sibling `<root-name>.agents`. Use this agent's full-diff behavior standard and drafting steps. Use the current review findings and task guidance for a review comment. Do not assume `~/.claude` or `~/.agents` for a named profile or explicit target.
|
|
10
10
|
|
|
11
11
|
## Voice
|
|
12
12
|
|
|
@@ -24,7 +24,7 @@ Before drafting, inventory every independently observable behavior in the full d
|
|
|
24
24
|
|
|
25
25
|
For each behavior, state the trigger or observer, the Before -> After result, the affected surface/caller when shared, and focused proof. Include important preserved behavior and fallback paths when they help a coder rule a regression in or out. Describe outcomes, not line-by-line implementation, and do not hide multiple behaviors under vague umbrella wording.
|
|
26
26
|
|
|
27
|
-
For a
|
|
27
|
+
For a voice sample only when needed, read `<agents-home>/agents/reference/pr-description-illustrative-voice.md` (source fallback: `packages/claude-dev-env/.agents/agents/reference/pr-description-illustrative-voice.md`). For a verification sample only when needed, read `reference/pr-description-verification.md` beside this agent. These samples guide the shape and voice; they are not content to copy into unrelated pull requests.
|
|
28
28
|
|
|
29
29
|
## Draft the body
|
|
30
30
|
|
|
@@ -602,8 +602,8 @@ EXPECTED_SOURCE_LINK_PAIRS = {
|
|
|
602
602
|
}),
|
|
603
603
|
"pr-description-writer.md": frozenset({
|
|
604
604
|
(
|
|
605
|
-
"<agents-home>/
|
|
606
|
-
"packages/claude-dev-env/.agents/
|
|
605
|
+
"<agents-home>/agents/reference/pr-description-illustrative-voice.md",
|
|
606
|
+
"packages/claude-dev-env/.agents/agents/reference/pr-description-illustrative-voice.md",
|
|
607
607
|
),
|
|
608
608
|
(
|
|
609
609
|
"<managed-root>/rules/gh-cli-conventions.md#body-content-goes-in-a-file",
|
|
@@ -17,6 +17,7 @@ def test_pr_description_writer_uses_repo_owned_progressive_samples() -> None:
|
|
|
17
17
|
assert "only when needed" in agent_text
|
|
18
18
|
assert "PR #2562" not in agent_text
|
|
19
19
|
assert "PR #1150" not in agent_text
|
|
20
|
+
assert "skills/pr-title-description" not in agent_text
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
def test_voice_reference_keeps_the_plain_illustrative_shape() -> None:
|
|
@@ -48,9 +49,6 @@ def test_verification_leads_with_a_human_visible_check() -> None:
|
|
|
48
49
|
|
|
49
50
|
def test_full_diff_behavior_standard_is_explicit_in_writer_sources() -> None:
|
|
50
51
|
all_writer_source_texts = [
|
|
51
|
-
(AGENT_DIRECTORY.parent / "skills" / "pr-title-description" / "SKILL.md").read_text(
|
|
52
|
-
encoding="utf-8"
|
|
53
|
-
),
|
|
54
52
|
AGENT_PATH.read_text(encoding="utf-8"),
|
|
55
53
|
VOICE_REFERENCE_PATH.read_text(encoding="utf-8"),
|
|
56
54
|
]
|
|
@@ -16,10 +16,10 @@ description: >-
|
|
|
16
16
|
|
|
17
17
|
Resolve the first matching invocation before the normal refusal and loop rules:
|
|
18
18
|
|
|
19
|
-
1. `preflight-proposal` requires `<pr_number>`, `--level <low|medium|xhigh>`, `--base-sha <immutable SHA>`, `--head-sha <immutable SHA>`, and `--worktree <isolated path>`.
|
|
19
|
+
1. `preflight-proposal` requires `<pr_number>`, `--level <low|medium|xhigh>`, `--base-sha <immutable SHA>`, `--head-sha <immutable SHA>`, and `--worktree <isolated path>`. Default level is `low`. Follow [reference/preflight-proposal.md](reference/preflight-proposal.md). The mode runs `<review_level> --fix loop` locally and returns selected-candidate-ready proposal evidence.
|
|
20
20
|
2. Normal mode follows the current level, `--fix`, and `loop` behavior.
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Proposal mode selects the review level and records finding outcomes. The downstream owner records selected proposal IDs before reapplication. Each new finding gets a new ID.
|
|
23
23
|
|
|
24
24
|
## Gotchas
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ The proposal mode applies the canonical proposal contract at `@~/.claude/_shared
|
|
|
27
27
|
- **Collection reports every real finding.** Keep every CONFIRMED or PLAUSIBLE finding at its assigned severity (`blocker`, `high`, `medium`, `low`, `nit`). Do not drop low or nit findings during collection. Severity or action filtering is a separate consumer stage after the collection record is complete (`scripts/finding_pipeline.py`).
|
|
28
28
|
- **`medium` favors precision, `xhigh` favors recall.** At `medium` (8 angles) assign severity carefully so a later filter can pick maintainer-action findings. At `xhigh` (10 angles plus a gap sweep) a single non-REFUTED vote carries the finding; do not drop on uncertainty.
|
|
29
29
|
- **Every retained finding carries `severity` and `verdict`.** Severity is one of `blocker`, `high`, `medium`, `low`, `nit`. Verdict is `CONFIRMED` or `PLAUSIBLE`. Drop REFUTED candidates only; never emit an unclassified retained finding.
|
|
30
|
-
- **`--fix` applies findings once.** Load `reference/fix.md` and follow it
|
|
30
|
+
- **`--fix` applies findings once.** Load `reference/fix.md` and follow it. That file owns the fix agent, the code-rules gate, skip logging, and outcome reporting. Commits are lead-owned; fix agents never commit or push.
|
|
31
31
|
- **`loop` never asks.** A round with bug findings validates them with an advisor, fixes, and re-reviews. Terminals are exactly `clean`, `nits_fixed`, and `advisor_blocked`. There is no reviewed-head count limit; a new head increments the count once, a re-review of the same head does not. Load `reference/loop.md` and follow it.
|
|
32
32
|
- **`--fix` and `loop` combine.** With both, each loop round runs the level file, and the round's fixing happens inside `reference/loop.md`'s gate sequence, which loads `reference/fix.md` for the mechanics. There is no separate fix pass around the round.
|
|
33
33
|
|
|
@@ -35,13 +35,13 @@ The proposal mode applies the canonical proposal contract at `@~/.claude/_shared
|
|
|
35
35
|
|
|
36
36
|
Triggers: `/e-code-review <level> [--fix] [loop]`. `<level>` is `low`, `medium`, or `xhigh`. `--fix` and `loop` are each optional and may be used together.
|
|
37
37
|
|
|
38
|
-
**Refusal
|
|
38
|
+
**Refusal. First match wins:**
|
|
39
39
|
|
|
40
40
|
- **No level, or an unknown level.** Respond exactly: `Which effort level — low, medium, or xhigh?`
|
|
41
41
|
|
|
42
42
|
## Evaluation-backed defaults (e-code-review family)
|
|
43
43
|
|
|
44
|
-
When the caller asks which level to pick for a known fixture band (easy / medium / demanding scope), use the committed OP-02B evaluation evidence
|
|
44
|
+
When the caller asks which level to pick for a known fixture band (easy / medium / demanding scope), use the committed OP-02B evaluation evidence. Thinking stays on; **effort** is the only cost/latency lever.
|
|
45
45
|
|
|
46
46
|
| Fixture band | Skill effort | Source |
|
|
47
47
|
|---|---|---|
|
|
@@ -58,7 +58,7 @@ Detail: `reference/effort-evaluation.md`.
|
|
|
58
58
|
1. Read `<level>` and the optional `--fix` and `loop` flags. Apply the refusal first.
|
|
59
59
|
2. Load `reference/low.md`, `reference/medium.md`, or `reference/xhigh.md`. Run that file as one review cycle, ending in its structured findings report.
|
|
60
60
|
3. If `--fix` is set and `loop` is not set, load `reference/fix.md` and apply it to that cycle's findings. This path has no commit step: the fixes stay uncommitted in the working tree for the user to review and commit.
|
|
61
|
-
4. If `loop` is set, load `reference/loop.md` and follow it with that cycle's findings still unfixed. Round 1's findings are the ones step 2 already produced; from the second round on, the round re-runs that same level file end to end. End to end means the level file's review phases, up to and including its findings report
|
|
61
|
+
4. If `loop` is set, load `reference/loop.md` and follow it with that cycle's findings still unfixed. Round 1's findings are the ones step 2 already produced; from the second round on, the round re-runs that same level file end to end. End to end means the level file's review phases, up to and including its findings report. Skip that file's *Looping* section, which hands control to `loop.md` and would re-enter the loop the round is already inside. `loop.md`'s gate sequence owns when the round fixes.
|
|
62
62
|
5. Without `--fix` or `loop`, return the cycle findings and stop.
|
|
63
63
|
|
|
64
64
|
## File index
|
|
@@ -66,9 +66,9 @@ Detail: `reference/effort-evaluation.md`.
|
|
|
66
66
|
| File | Purpose |
|
|
67
67
|
|---|---|
|
|
68
68
|
| `SKILL.md` | Route by level; dispatch `--fix` and `loop` |
|
|
69
|
-
| `reference/low.md` | low review procedure
|
|
70
|
-
| `reference/medium.md` | medium review procedure
|
|
71
|
-
| `reference/xhigh.md` | xhigh review procedure
|
|
69
|
+
| `reference/low.md` | low review procedure: 1 diff pass per target item, no verify |
|
|
70
|
+
| `reference/medium.md` | medium review procedure: 8 angles, 1-vote verify |
|
|
71
|
+
| `reference/xhigh.md` | xhigh review procedure: 10 angles, 1-vote verify, gap sweep |
|
|
72
72
|
| `reference/fix.md` | Fix application, code-rules gate, skip logging, outcome reporting |
|
|
73
73
|
| `reference/loop.md` | Repeat review/fix rounds until clean |
|
|
74
74
|
| `reference/preflight-proposal.md` | Isolated local review, immutable SHAs, proposal evidence, and mutation boundary |
|
|
@@ -85,6 +85,6 @@ Detail: `reference/effort-evaluation.md`.
|
|
|
85
85
|
|
|
86
86
|
## Folder map
|
|
87
87
|
|
|
88
|
-
- `SKILL.md
|
|
89
|
-
- `reference
|
|
90
|
-
- `scripts
|
|
88
|
+
- `SKILL.md`: route and dispatch.
|
|
89
|
+
- `reference/`: level procedures, fix/loop, effort evaluation, runner selection.
|
|
90
|
+
- `scripts/`: collect-then-filter finding pipeline, effort evaluation, Grok medium-review module, tests, and `e_code_review_scripts_constants/`.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import { readFileSync } from 'node:fs'
|
|
3
|
+
import { dirname, resolve } from 'node:path'
|
|
4
|
+
import test from 'node:test'
|
|
5
|
+
import { fileURLToPath } from 'node:url'
|
|
6
|
+
|
|
7
|
+
const here = dirname(fileURLToPath(import.meta.url))
|
|
8
|
+
const skill = readFileSync(resolve(here, 'SKILL.md'), 'utf8')
|
|
9
|
+
const contract = readFileSync(resolve(here, 'reference/preflight-proposal.md'), 'utf8')
|
|
10
|
+
|
|
11
|
+
test('e-code-review owns its preflight proposal contract', () => {
|
|
12
|
+
assert.match(skill, /reference\/preflight-proposal\.md/)
|
|
13
|
+
assert.doesNotMatch(skill, /_shared\/pr-loop/)
|
|
14
|
+
assert.match(contract, /caller-supplied isolated worktree/)
|
|
15
|
+
assert.match(contract, /exact `base_sha\.\.\.head_sha` range/)
|
|
16
|
+
assert.match(contract, /immutable proposal identity/)
|
|
17
|
+
assert.match(contract, /selected or dispositioned proposal collection/)
|
|
18
|
+
assert.match(contract, /review_level: low \| medium \| xhigh/)
|
|
19
|
+
assert.match(contract, /outcome: fixed \| no_change_needed \| skipped/)
|
|
20
|
+
})
|
|
@@ -12,7 +12,7 @@ For each finding, resume the same Agent-tool agent instance that originally
|
|
|
12
12
|
surfaced it. That agent applies all relevant fixes, which you provide guidance
|
|
13
13
|
on in your resume prompt.
|
|
14
14
|
|
|
15
|
-
At `low
|
|
15
|
+
At `low`, and any time the Agent tool is unavailable, no finder agent exists
|
|
16
16
|
to resume. Apply the fixes yourself, sequentially, in this context, holding to
|
|
17
17
|
every rule below.
|
|
18
18
|
|
|
@@ -26,7 +26,7 @@ call every other surface in this skill uses:
|
|
|
26
26
|
2. If the gate reports violations **on lines this fix already owns** (the files
|
|
27
27
|
and added lines the fix changed), fix them and re-run the exact same command.
|
|
28
28
|
3. A violation on a path or added line outside this fix's own work is reported
|
|
29
|
-
or skipped
|
|
29
|
+
or skipped. It is not force-fixed into unrelated files. Log each skip with
|
|
30
30
|
the path and reason, then continue.
|
|
31
31
|
4. Repeat until every violation on this fix's own work is clean (or skipped with
|
|
32
32
|
a logged reason for out-of-scope hits).
|
|
@@ -39,15 +39,14 @@ This gate commits nothing. The fix lands in the working tree and stays
|
|
|
39
39
|
uncommitted. **Commit ownership is lead-only:** a fix agent, patch worker, or
|
|
40
40
|
resumed finding agent never runs `git commit` or `git push`. The lead that owns
|
|
41
41
|
the branch creates the commit after gates pass. The bare code-rules call covers
|
|
42
|
-
the merge-base surface and staged added lines only
|
|
42
|
+
the merge-base surface and staged added lines only. Working-tree-only lines
|
|
43
43
|
enter that scope after the lead stages or commits them.
|
|
44
44
|
|
|
45
|
-
Under a bare `--fix`
|
|
46
|
-
downstream commits either
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
still owns the commit and push.
|
|
45
|
+
Under a bare `--fix` (this document invoked without `loop`), nothing
|
|
46
|
+
downstream commits either. A one-shot fix pass leaves its fixes uncommitted in
|
|
47
|
+
the working tree for the lead to review and commit (stage first if you re-run
|
|
48
|
+
the gate on those lines). Under `loop`, the round tail in `reference\loop.md`
|
|
49
|
+
stages and runs required checks; the lead still owns the commit and push.
|
|
51
50
|
|
|
52
51
|
## Skip candidates
|
|
53
52
|
|
|
@@ -55,16 +54,15 @@ Skip a finding when fixing it would change intended behavior, require changes
|
|
|
55
54
|
well outside the reviewed diff, or the finding itself is judged a false
|
|
56
55
|
positive.
|
|
57
56
|
|
|
58
|
-
Every logged skip surfaces exactly once, batched together, in a single
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
and never before.
|
|
57
|
+
Every logged skip surfaces exactly once, batched together, in a single
|
|
58
|
+
list presented to the user at the end of the fix pass, after every other
|
|
59
|
+
finding has been fixed, marked not-needed, or skipped, and never before.
|
|
62
60
|
|
|
63
61
|
## Reporting outcomes
|
|
64
62
|
|
|
65
63
|
After fixes land, report the same findings list again through the structured
|
|
66
|
-
findings-report call
|
|
67
|
-
|
|
64
|
+
findings-report call, the call that renders this review's results as a typed
|
|
65
|
+
list in the host UI, with each finding now carrying an `outcome`:
|
|
68
66
|
`fixed`, `no_change_needed` (the finding was wrong or already handled), or
|
|
69
67
|
`skipped` (real but not applied). Do not repeat the findings as text in the
|
|
70
68
|
response body; the structured call is the record the host UI reads, and the
|
|
@@ -72,8 +70,8 @@ batched skip list from above goes in the prose that follows it.
|
|
|
72
70
|
|
|
73
71
|
## If findings are fixed later
|
|
74
72
|
|
|
75
|
-
Whenever a reported finding is fixed later in the session
|
|
76
|
-
the fix
|
|
73
|
+
Whenever a reported finding is fixed later in the session, because the user
|
|
74
|
+
asks for the fix or later work fixes it incidentally, call the structured
|
|
77
75
|
findings-report call again with the same findings, each carrying an
|
|
78
76
|
`outcome` (`fixed`, `no_change_needed`, or `skipped`). Do not repeat the
|
|
79
77
|
findings as text. Make that call immediately after the fixes land, before any
|
|
@@ -14,18 +14,14 @@ Report progress while you work. Stop for the user only on a terminal outcome bel
|
|
|
14
14
|
|
|
15
15
|
## Where fixes come from
|
|
16
16
|
|
|
17
|
-
A round
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
fix pass sitting around the round. Gate 2 loads `reference\fix.md` (relative to
|
|
26
|
-
this skill's folder) for the mechanics — which agent applies each fix, agent
|
|
27
|
-
resume, the code-rules gate, skip logging, and outcome reporting — while the
|
|
28
|
-
gate sequence decides whether a round fixes, commits, pushes, and re-reviews.
|
|
17
|
+
A round always applies fixes. Gate 2 below is the only place a round applies a
|
|
18
|
+
fix. `--fix` chooses the mechanics. With the flag, Gate 2 loads
|
|
19
|
+
`reference\fix.md` (relative to this skill's folder) for which agent applies
|
|
20
|
+
each fix, agent resume, the code-rules gate, skip logging, and outcome
|
|
21
|
+
reporting. Without the flag, this session applies each fix itself.
|
|
22
|
+
|
|
23
|
+
The gate sequence still decides whether a round fixes, commits, pushes, and
|
|
24
|
+
re-reviews.
|
|
29
25
|
|
|
30
26
|
## Scope stays narrow
|
|
31
27
|
|
|
@@ -55,8 +51,8 @@ no advisor call reopens that.
|
|
|
55
51
|
`~/.claude/_shared/pr-loop/scripts/code_rules_gate.py --repo-root <repo root>`
|
|
56
52
|
with no file paths and no `--only-under` prefix. On a violation on lines this
|
|
57
53
|
round already owns, fix it and re-run the exact same command until clean. A
|
|
58
|
-
violation outside the review target is reported or skipped
|
|
59
|
-
unrelated files
|
|
54
|
+
violation outside the review target is reported or skipped, not force-fixed into
|
|
55
|
+
unrelated files, and the skip is logged with path and reason.
|
|
60
56
|
|
|
61
57
|
That bare call gates the git diff since the merge-base (and any staged added
|
|
62
58
|
lines the gate already includes). Working-tree lines that are neither staged
|
|
@@ -76,20 +72,20 @@ A repair diff is new code. From the second round on, the round runs the level
|
|
|
76
72
|
file end to end at the new head. End to end means that file's review phases, up
|
|
77
73
|
to and including its findings report; the round stops there and brings those
|
|
78
74
|
findings back to the gate sequence below. It does not run the level file's
|
|
79
|
-
*Looping* section
|
|
75
|
+
*Looping* section. That section hands control to this document, and the round
|
|
80
76
|
is already inside it. The round's scope is the level's own review
|
|
81
|
-
target
|
|
82
|
-
`medium.md` and `xhigh.md
|
|
77
|
+
target, the diff or path the level gathers up front, called Phase 0 in
|
|
78
|
+
`medium.md` and `xhigh.md`, taken against that target's base. A repair edit
|
|
83
79
|
landing outside that target widens the next round's scope to cover it: the next
|
|
84
80
|
round's review target is the original target **plus** that path, and the round
|
|
85
81
|
reviews both. A later widening adds to that target the same way.
|
|
86
82
|
|
|
87
83
|
The widened target is what the round hands the level file. When a round runs the
|
|
88
|
-
level file end to end, it passes the current review target
|
|
89
|
-
plus every path a widening has since added
|
|
84
|
+
level file end to end, it passes the current review target (the original target
|
|
85
|
+
plus every path a widening has since added) as that run's target argument, in
|
|
90
86
|
place of the argument the first round was given. When the first round was given
|
|
91
|
-
no target argument, the original target is the item `default-range
|
|
92
|
-
file's own default gather
|
|
87
|
+
no target argument, the original target is the item `default-range`, the level
|
|
88
|
+
file's own default gather, so the widened target is `default-range` plus every
|
|
93
89
|
added path, and the range the first round reviewed stays in scope. The level
|
|
94
90
|
file gathers what the round hands it, so a widened path is gathered and reviewed
|
|
95
91
|
like any other part of the target.
|
|
@@ -134,11 +130,11 @@ A broken reader outside the review target does not block the loop and does not
|
|
|
134
130
|
widen scope. Hand it off as a reported finding. Two separate things are owed for
|
|
135
131
|
that hand-off, and they land at different times:
|
|
136
132
|
|
|
137
|
-
- **The round-scoped record
|
|
133
|
+
- **The round-scoped record.** What a round produces. Check the reader, record
|
|
138
134
|
its result, and name it in that round's progress report. All three are done
|
|
139
135
|
inside the round that checks the reader, and nothing outside that round is
|
|
140
136
|
needed to complete them. This is the record gate 2 reads.
|
|
141
|
-
- **The termination-time disclosure
|
|
137
|
+
- **The termination-time disclosure.** What terminating requires. The
|
|
142
138
|
ready-for-review message names every broken off-target reader and every
|
|
143
139
|
skipped finding that still exists, and the pull request body carries the same
|
|
144
140
|
names when the target is a pull request. A target with no pull request owes
|
|
@@ -158,15 +154,15 @@ The loop emits exactly one of these terminals when it stops:
|
|
|
158
154
|
Every round does this round's own work first, then runs the three gates below,
|
|
159
155
|
in order: gate 1, then gate 2, then gate 3.
|
|
160
156
|
|
|
161
|
-
**This round's work
|
|
157
|
+
**This round's work, before the gates.** Record this round's dangerous
|
|
162
158
|
classification and the dangerous-round count as `N of M`; and when a shape-change
|
|
163
159
|
list is open, check each reader on that list and name each reader with its
|
|
164
160
|
result, adding any on-target reader that reads the new shape wrong to this
|
|
165
161
|
round's findings as *A shape change names its readers* directs. Then run the
|
|
166
162
|
gates.
|
|
167
163
|
|
|
168
|
-
**Gate 1
|
|
169
|
-
answer turns on the round's open obligations alone
|
|
164
|
+
**Gate 1, obligations.** Gate 1 is evaluated first in the sequence, and its
|
|
165
|
+
answer turns on the round's open obligations alone. The findings are in hand by
|
|
170
166
|
now, and no content they carry changes it. Ask only: does any obligation remain
|
|
171
167
|
open? Two kinds exist.
|
|
172
168
|
|
|
@@ -175,17 +171,17 @@ open? Two kinds exist.
|
|
|
175
171
|
|
|
176
172
|
Gate 1 states its answer and stops there: an obligation remains open, or none
|
|
177
173
|
does. It states no re-entry, no continuation, and no routing. Gate 3 is the sole
|
|
178
|
-
router
|
|
174
|
+
router. Every path out of a round passes through it.
|
|
179
175
|
|
|
180
|
-
**Gate 2
|
|
181
|
-
follow it for the mechanics of every fix this gate applies
|
|
176
|
+
**Gate 2, findings.** When `--fix` is set, load `reference\fix.md` here and
|
|
177
|
+
follow it for the mechanics of every fix this gate applies: the fix agent,
|
|
182
178
|
agent resume, the code-rules gate, skip logging, and outcome reporting. When `--fix` is
|
|
183
179
|
absent, apply each fix in this session yourself, and log each skip in this
|
|
184
180
|
round's progress report. Then take the one case that matches the round's
|
|
185
181
|
findings.
|
|
186
182
|
|
|
187
183
|
- Any bug-severity finding: validate each bug with an advisor before touching
|
|
188
|
-
code
|
|
184
|
+
code. Confirm it's real and confirm the intended fix, then fix every
|
|
189
185
|
validated bug and every nit on the review target. A refuted bug removes only
|
|
190
186
|
itself from the round's work; the nits are fixed either way.
|
|
191
187
|
- Nits only, with at least one nit present: fix all of them on the review
|
|
@@ -196,13 +192,13 @@ Gate 2 then ends by stating one of exactly two outcomes: unresolved findings
|
|
|
196
192
|
remain, or none remain. A refuted bug is resolved. A fixed nit is resolved. A
|
|
197
193
|
fixed validated bug is resolved. A handed-off off-target finding is resolved once
|
|
198
194
|
this round has made its round-scoped record as *A shape change names its readers*
|
|
199
|
-
defines that record
|
|
200
|
-
report
|
|
195
|
+
defines that record (checked, result recorded, named in this round's progress
|
|
196
|
+
report), whether or not the problem behind it is solved. Gate 2 reads the record
|
|
201
197
|
and nothing else; the termination-time disclosure belongs to gate 3.
|
|
202
198
|
|
|
203
|
-
A skipped finding
|
|
199
|
+
A skipped finding, a finding deliberately not applied because fixing it would
|
|
204
200
|
change intended behavior, would reach beyond the review target, or the finding
|
|
205
|
-
itself is judged a false positive
|
|
201
|
+
itself is judged a false positive, is resolved once its skip is logged in this
|
|
206
202
|
round's progress report, naming the finding and the reason it was skipped. That
|
|
207
203
|
report is the sink every run has, with or without `--fix`. When `--fix` is set,
|
|
208
204
|
the skip handling `fix.md` carries runs inside this gate and adds to this log
|
|
@@ -210,7 +206,7 @@ rather than replacing it.
|
|
|
210
206
|
|
|
211
207
|
Gate 3 reads that stated outcome, never a case label.
|
|
212
208
|
|
|
213
|
-
**Gate 3
|
|
209
|
+
**Gate 3, exit test.** Resolve the terminal from the table above, then stop or
|
|
214
210
|
continue:
|
|
215
211
|
|
|
216
212
|
- zero retained findings and required checks pass → `clean`;
|
|
@@ -226,13 +222,13 @@ Also require, for `clean` and `nits_fixed`:
|
|
|
226
222
|
|
|
227
223
|
Any other combination runs the round tail and re-enters the loop.
|
|
228
224
|
|
|
229
|
-
Terminating with `clean` or `nits_fixed` carries one further condition
|
|
225
|
+
Terminating with `clean` or `nits_fixed` carries one further condition, the
|
|
230
226
|
termination-time disclosure: the ready-for-review message names every broken
|
|
231
227
|
off-target reader and every skipped finding that still exists. When the target
|
|
232
228
|
is a pull request, the pull request body carries the same names; a target with
|
|
233
229
|
no pull request owes the ready message alone. Every surface this condition
|
|
234
|
-
names is written at termination
|
|
235
|
-
body too when the target is a pull request
|
|
230
|
+
names is written at termination, the ready message always, the pull request
|
|
231
|
+
body too when the target is a pull request, so each one is available to the
|
|
236
232
|
terminating round. A round that cannot name them does not terminate; it runs
|
|
237
233
|
the round tail and re-enters the loop, the same as any other non-terminating
|
|
238
234
|
round. With that condition met, post the proof-of-work PR comment when the
|
|
@@ -250,7 +246,7 @@ own section above.
|
|
|
250
246
|
*Required checks* gives: the bare command, no file paths. When this round
|
|
251
247
|
produced edits, stage those edits first so they enter the bare gate's scope,
|
|
252
248
|
then run the checks. When this round produced no edits, run the same checks.
|
|
253
|
-
Should those checks produce repairs, this round has produced edits
|
|
249
|
+
Should those checks produce repairs, this round has produced edits. Stage
|
|
254
250
|
them and re-run the checks.
|
|
255
251
|
|
|
256
252
|
**Commit and push are lead-owned.** Gate 2 and the round tail leave every fix
|
|
@@ -33,7 +33,8 @@ function assertReviewLevelExtension() {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
function assertProposalHandoffs() {
|
|
36
|
-
assert.match(proposalSource, /
|
|
36
|
+
assert.match(proposalSource, /This file owns the proposal contract for `e-code-review`/)
|
|
37
|
+
assert.match(proposalSource, /exact `base_sha\.\.\.head_sha` range/)
|
|
37
38
|
const fixModeSource = sourceBetweenHeadings(
|
|
38
39
|
fixSource,
|
|
39
40
|
'## Preflight-proposal mode',
|
|
@@ -1,17 +1,37 @@
|
|
|
1
1
|
# Review preflight proposal mode
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This file owns the proposal contract for `e-code-review`.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
@~/.claude/_shared/pr-loop/preflight-proposal.md
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
Use this review extension when the caller selects `preflight-proposal`:
|
|
5
|
+
Use this review mode when the caller selects `preflight-proposal`:
|
|
10
6
|
|
|
11
7
|
```text
|
|
12
8
|
/e-code-review preflight-proposal <pr_number> --level low --base-sha <base_sha> --head-sha <head_sha> --worktree <isolated_worktree>
|
|
13
9
|
```
|
|
14
10
|
|
|
11
|
+
## Required inputs
|
|
12
|
+
|
|
13
|
+
| Input | Contract |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `pr_number` | Resolved open pull-request number |
|
|
16
|
+
| `--level` | Resolved review level: `low`, `medium`, or `xhigh` |
|
|
17
|
+
| `--base-sha` | Full immutable base commit SHA |
|
|
18
|
+
| `--head-sha` | Full immutable head commit SHA |
|
|
19
|
+
| `--worktree` | Caller-supplied isolated worktree path |
|
|
20
|
+
|
|
21
|
+
## Proposal contract
|
|
22
|
+
|
|
23
|
+
1. Validate every required input before the first review command.
|
|
24
|
+
2. Run `git rev-parse HEAD` in the supplied worktree and require exact equality with the head SHA.
|
|
25
|
+
3. Gather changed paths and review scope from the exact `base_sha...head_sha` range. Use the resolved pull-request number for pull-request metadata.
|
|
26
|
+
4. Run the complete selected review and findings against the immutable range and worktree.
|
|
27
|
+
5. Keep every review edit and test inside the caller-supplied isolated worktree.
|
|
28
|
+
6. Create an immutable proposal identity. Use the existing commit SHA for committed proposals. For working-tree edits, use a deterministic diff hash over the baseline `HEAD` SHA, base SHA, head SHA, sorted normalized changed paths, status records, and file bytes.
|
|
29
|
+
7. Record every changed path, including tracked, untracked, renamed, and deleted paths.
|
|
30
|
+
8. Record exact tests and outcomes: each test command, exit code, and outcome.
|
|
31
|
+
9. Return selected-candidate-ready proposal evidence with the proposal ID, isolated worktree path, changed paths, findings, tests, and outcomes.
|
|
32
|
+
10. Keep commit, push, pull-request body, pull-request comment, pull-request review, pull-request update, merge, rebase, and Ready-state mutations disabled.
|
|
33
|
+
11. Return the proposal for downstream disposition. The downstream owner adds the proposal ID to its selected or dispositioned proposal collection. Reapplication uses exactly the selected records and their changed paths. Give each later finding a new proposal ID and evidence record.
|
|
34
|
+
|
|
15
35
|
## Review extension
|
|
16
36
|
|
|
17
37
|
The caller resolves the review level before invocation and always passes `--level`. Use this mapping:
|
|
@@ -27,14 +47,29 @@ The `review_level` evidence mirrors the resolved `--level` value.
|
|
|
27
47
|
|
|
28
48
|
Run the selected level as `<review_level> --fix loop`. The selected level owns its normal finding and fix rules. Require `HEAD` to equal the supplied head SHA before each round.
|
|
29
49
|
|
|
30
|
-
Keep Gate 1, Gate 2, the bare code-rules gate, and exact required tests.
|
|
50
|
+
Keep Gate 1, Gate 2, the bare code-rules gate, and exact required tests.
|
|
51
|
+
|
|
52
|
+
## Evidence record
|
|
31
53
|
|
|
32
54
|
```yaml
|
|
55
|
+
mode: preflight-proposal
|
|
56
|
+
pr_number: <resolved PR number>
|
|
33
57
|
review_level: low | medium | xhigh
|
|
58
|
+
base_sha: <immutable base SHA>
|
|
59
|
+
head_sha: <immutable head SHA>
|
|
60
|
+
proposal_id:
|
|
61
|
+
kind: commit-sha | diff-sha256
|
|
62
|
+
value: <immutable identity>
|
|
63
|
+
isolated_worktree: <caller-supplied path>
|
|
64
|
+
changed_paths:
|
|
65
|
+
- <normalized path>
|
|
34
66
|
findings:
|
|
35
67
|
- severity: blocker | high | medium | low | nit
|
|
36
68
|
verdict: CONFIRMED | PLAUSIBLE
|
|
37
69
|
outcome: fixed | no_change_needed | skipped
|
|
70
|
+
tests:
|
|
71
|
+
- command: <exact command>
|
|
72
|
+
exit_code: <integer>
|
|
73
|
+
outcome: <exact outcome>
|
|
74
|
+
downstream_selection: required
|
|
38
75
|
```
|
|
39
|
-
|
|
40
|
-
The canonical contract owns the immutable range, worktree boundary, proposal identity, changed paths, exact tests and outcomes, mutation boundary, and downstream selection.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Runner selection (medium review)
|
|
2
2
|
|
|
3
|
-
How `/e-code-review medium` (and loop)
|
|
4
|
-
|
|
3
|
+
How `/e-code-review medium` (and loop) picks a harness runner for finder and
|
|
4
|
+
verify work. `SKILL.md` points here.
|
|
5
5
|
|
|
6
6
|
## What lives here
|
|
7
7
|
|
|
8
8
|
| Topic | Content |
|
|
9
9
|
|---|---|
|
|
10
|
-
| Goal | One skill surface
|
|
10
|
+
| Goal | One skill surface, many runners (Grok, Codex, Claude headless, and others) |
|
|
11
11
|
| Today | `scripts/grok_code_review.py` is the Grok medium orchestration module |
|
|
12
12
|
| Target | A thin selector chooses a runner by availability and task flags |
|
|
13
|
-
|
|
|
13
|
+
| Out of scope | Reimplementing every harness inside this skill |
|
|
14
14
|
|
|
15
15
|
## Today
|
|
16
16
|
|
|
@@ -21,21 +21,20 @@ finder/verify work. This file is the map; `SKILL.md` only points here.
|
|
|
21
21
|
|
|
22
22
|
## Target shape (tracked separately)
|
|
23
23
|
|
|
24
|
-
1. **Runner protocol
|
|
24
|
+
1. **Runner protocol.** Shared inputs (diff base, head, angles) and outputs
|
|
25
25
|
(candidates, verdicts, severities).
|
|
26
|
-
2. **Detection
|
|
26
|
+
2. **Detection.** Which runners are installed or configured (PATH, skills,
|
|
27
27
|
account chain).
|
|
28
|
-
3. **Selection
|
|
29
|
-
|
|
30
|
-
4. **Adapters
|
|
28
|
+
3. **Selection.** Pick one runner. Keep vendor choice out of `SKILL.md`
|
|
29
|
+
process steps.
|
|
30
|
+
4. **Adapters.** Thin wrappers: Grok (current module), Codex, Claude, and
|
|
31
|
+
others.
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
Keep implementation pull requests small: one concern each. Link this file from
|
|
34
|
+
the tracking issue.
|
|
34
35
|
|
|
35
36
|
## Related always-on docs
|
|
36
37
|
|
|
37
|
-
- Skill hub: `../SKILL.md` (levels, fix, loop
|
|
38
|
+
- Skill hub: `../SKILL.md` (levels, fix, loop).
|
|
38
39
|
- Preflight proposal: `preflight-proposal.md` (immutable range, local runner, proposal evidence).
|
|
39
40
|
- Medium procedure: `medium.md`.
|
|
40
|
-
- Shared worker spawn (when applicable):
|
|
41
|
-
`packages/claude-dev-env/_shared/pr-loop/worker-spawn.md` in the package tree.
|
|
@@ -61,10 +61,11 @@ Search open and closed issues on the target repo before create. Open twin -> upd
|
|
|
61
61
|
Prefer GitHub MCP. Fall back to `gh` on the same REST endpoints. Full map and `.id` rule: [reference/operation-matrix.md](reference/operation-matrix.md).
|
|
62
62
|
|
|
63
63
|
Before issue creation, a full issue body edit, or an issue comment, write the
|
|
64
|
-
body to a UTF-8 file
|
|
65
|
-
|
|
66
|
-
`issue-
|
|
67
|
-
after exit code
|
|
64
|
+
body to a UTF-8 file. Resolve the active managed root (`CLAUDE_CONFIG_DIR` when
|
|
65
|
+
set, `~/.claude` otherwise), then run
|
|
66
|
+
`<managed-root>/scripts/durable_post_lint.py`. Use `issue-create`, `issue-edit`,
|
|
67
|
+
or `issue-comment` as the action. Send the server write only after exit code
|
|
68
|
+
`0`.
|
|
68
69
|
|
|
69
70
|
## Handoff input
|
|
70
71
|
|
|
@@ -38,9 +38,8 @@ Use this skill for one pull request action:
|
|
|
38
38
|
- Submit a pull request review.
|
|
39
39
|
- Recover one selected legacy author record before the action.
|
|
40
40
|
|
|
41
|
-
Send issue create, edit, and comment work to `issue-tracker`. Send review
|
|
42
|
-
|
|
43
|
-
`source-command-commit`.
|
|
41
|
+
Send issue create, edit, and comment work to `issue-tracker`. Send review and
|
|
42
|
+
fix-loop work to `e-code-review`. Send commits to `source-command-commit`.
|
|
44
43
|
|
|
45
44
|
Require one repository and one action target. Stop before author lookup or
|
|
46
45
|
network work when the repository, pull request, action, author, or required
|
|
@@ -75,11 +74,9 @@ current process environment.
|
|
|
75
74
|
| Skill | When | Produces | If missing |
|
|
76
75
|
|---|---|---|---|
|
|
77
76
|
| `pr-description-writer` | Before create or a full body rewrite | A reviewed title and body file | Stop the create or rewrite and report that authoring is required |
|
|
78
|
-
| `pr-title-description` | Optional title and body review | Review findings for the writer's output | Continue with the required writer output |
|
|
79
77
|
| `privacy-hygiene` | Before any durable GitHub post | A clean body and repository privacy sweep | Stop before publication and report the missing gate |
|
|
80
78
|
| `issue-tracker` | Issue create, edit, or comment requests | Issue state and issue URLs | Route the request there. |
|
|
81
|
-
| `
|
|
82
|
-
| `autoconverge` | Autonomous PR review and fix loops | A converged draft or ready-state decision | Route the request there. |
|
|
79
|
+
| `e-code-review` | Review or review/fix loop requests | Structured findings or a clean review result | Route the request there. |
|
|
83
80
|
| `source-command-commit` | Commit or push requests | A verified commit or pushed branch | Route the request there. |
|
|
84
81
|
|
|
85
82
|
## Task seeding
|
|
@@ -102,14 +99,16 @@ request target. Create actions publish drafts. Record the target before any writ
|
|
|
102
99
|
|
|
103
100
|
For create and full body rewrite, invoke the installed
|
|
104
101
|
`pr-description-writer`. Require its title and body file as the authoring
|
|
105
|
-
output.
|
|
106
|
-
|
|
102
|
+
output. A comment or review may use a supplied body file when it does not
|
|
103
|
+
rewrite the pull request description.
|
|
107
104
|
|
|
108
105
|
### 3. Run the local linter
|
|
109
106
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
107
|
+
Resolve the active managed root (`CLAUDE_CONFIG_DIR` when set, `~/.claude`
|
|
108
|
+
otherwise), then run `<managed-root>/scripts/durable_post_lint.py` with the
|
|
109
|
+
matching action and title or body file. Use `pr-create`, `pr-edit`, `pr-comment`,
|
|
110
|
+
or `pr-review`. The linter owns the action-specific body, title, and
|
|
111
|
+
volatile-path rules.
|
|
113
112
|
|
|
114
113
|
Exit code `0` continues to the next gate. Any non-zero exit stops the action. Fix
|
|
115
114
|
the named local input and rerun the linter. Do not look up the author or make a
|
|
@@ -197,8 +196,7 @@ The recovery command restores the named account and deletes only that record.
|
|
|
197
196
|
| `scripts/recover_legacy_author.py` | Command for one selected legacy author record |
|
|
198
197
|
| `scripts/test_github_pr_command_constants.py` | Tests for the command and recovery constants |
|
|
199
198
|
| `scripts/test_recover_legacy_author.py` | Tests for `recover_legacy_author.py` |
|
|
200
|
-
|
|
|
201
|
-
| `_shared/pr-loop/scripts/test_durable_post_lint.py` | Tests for the shared validator |
|
|
199
|
+
| `<managed-root>/scripts/durable_post_lint.py` | Shared action-aware title, body, and path validator |
|
|
202
200
|
| `scripts/gh_artifact_upload.py` | Helper for permanent GitHub binary evidence URLs |
|
|
203
201
|
| `scripts/tests/test_gh_artifact_upload.py` | Tests for binary evidence upload |
|
|
204
202
|
|