claude-dev-env 2.4.0 → 2.7.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/CLAUDE.md +26 -59
- package/_shared/pr-loop/scripts/_claude_permissions_common.py +84 -0
- package/_shared/pr-loop/scripts/code_rules_gate.py +6 -3
- package/_shared/pr-loop/scripts/code_rules_gate_parts/CLAUDE.md +12 -2
- package/_shared/pr-loop/scripts/code_rules_gate_parts/baseline_import_isolation.py +309 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_regression.py +540 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/staged_test_running.py +206 -70
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/__init__.py +1 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/_repo_test_helpers.py +76 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_baseline_import_isolation.py +248 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_regression.py +309 -0
- package/_shared/pr-loop/scripts/code_rules_gate_parts/tests/test_staged_test_running.py +91 -58
- package/_shared/pr-loop/scripts/grant_project_claude_permissions.py +306 -306
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/claude_permissions_constants.py +44 -0
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/code_rules_gate_constants.py +202 -0
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/copilot_quota_constants.py +24 -24
- package/_shared/pr-loop/scripts/pr_loop_shared_constants/stale_worktree_rule_sweep_constants.py +107 -107
- package/_shared/pr-loop/scripts/revoke_project_claude_permissions.py +290 -48
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_common.py +42 -2
- package/_shared/pr-loop/scripts/tests/test_claude_permissions_constants.py +36 -0
- package/_shared/pr-loop/scripts/tests/test_code_rules_gate.py +100 -1
- package/_shared/pr-loop/scripts/tests/test_fix_hookspath.py +497 -497
- package/_shared/pr-loop/scripts/tests/test_revoke_project_claude_permissions.py +311 -2
- package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep.py +301 -301
- package/_shared/pr-loop/scripts/tests/test_stale_worktree_rule_sweep_constants.py +85 -85
- package/_shared/pr-loop/worker-spawn.md +1 -1
- package/agents/CLAUDE.md +3 -2
- package/agents/caveman.md +0 -1
- package/agents/clasp-deployment-orchestrator.md +0 -1
- package/agents/clean-coder.md +0 -1
- package/agents/code-advisor.md +0 -1
- package/agents/code-quality-agent.md +1 -2
- package/agents/code-verifier.md +36 -8
- package/agents/deep-research.md +0 -1
- package/agents/docs-agent.md +0 -1
- package/agents/git-commit-crafter.md +0 -1
- package/agents/issue-tracker.md +42 -0
- package/agents/plan-packet-validator.md +0 -1
- package/agents/pr-description-writer.md +0 -1
- package/agents/test_agent_frontmatter.py +67 -18
- package/audit-rubrics/category_rubrics/category-o-docstring-vs-impl-drift.md +143 -141
- package/bin/CLAUDE.md +68 -5
- package/bin/codex-compat.mjs +104 -0
- package/bin/codex-compat.test.mjs +51 -0
- package/bin/ever-shipped-skills.mjs +1 -0
- package/bin/install-constants.mjs +88 -0
- package/bin/install.mjs +1138 -114
- package/bin/install.prune.test.mjs +869 -19
- package/bin/install.test.mjs +906 -2
- package/codex-capability-map.json +13 -0
- package/commands/implement.md +1 -1
- package/commands/right-size.md +1 -1
- package/docs/CLAUDE.md +1 -0
- package/docs/CODE_RULES.md +2 -0
- package/docs/codex-compatibility.md +25 -0
- package/docs/host-pool-health-monitor.md +102 -0
- package/docs/nas-ssh-invocation.md +96 -12
- package/docs/references/CLAUDE.md +4 -2
- package/docs/references/advisor-tool.md +13 -0
- package/docs/references/code-review-enforcement.md +35 -0
- package/docs/references/team-advisor-skill.md +14 -0
- package/hooks/blocking/CLAUDE.md +4 -0
- package/hooks/blocking/code_review_pr_create_gate.py +7 -3
- package/hooks/blocking/code_review_push_gate.py +9 -4
- package/hooks/blocking/code_review_stamp_directory_write_blocker.py +8 -0
- package/hooks/blocking/config/__init__.py +5 -5
- package/hooks/blocking/config/code_review_enforcement_constants.py +40 -7
- package/hooks/blocking/config/test_code_review_enforcement_constants.py +58 -0
- package/hooks/blocking/config/verified_commit_constants.py +160 -159
- package/hooks/blocking/eli11_reply_enforcer.py +479 -0
- package/hooks/blocking/gh_body_arg_blocker.py +1 -1
- package/hooks/blocking/nas_ssh_binary_enforcer.py +8 -46
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +256 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +24 -24
- package/hooks/blocking/shell_substitution_blocker.py +129 -0
- package/hooks/blocking/state_description_blocker.py +1 -1
- package/hooks/blocking/stop_dispatcher.py +1 -1
- package/hooks/blocking/test_bash_pre_tool_use_dispatcher.py +2 -3
- package/hooks/blocking/test_code_review_pr_create_gate.py +14 -0
- package/hooks/blocking/test_code_review_push_gate.py +16 -0
- package/hooks/blocking/test_code_review_stamp_directory_write_blocker.py +19 -0
- package/hooks/blocking/test_eli11_reply_enforcer.py +457 -0
- package/hooks/blocking/test_orchestrator_refresh_reschedule_gate.py +231 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -1
- package/hooks/blocking/test_shell_substitution_blocker.py +124 -0
- package/hooks/blocking/test_stop_dispatcher.py +23 -0
- package/hooks/blocking/test_unscoped_search_blocker.py +102 -0
- package/hooks/blocking/test_verdict_directory_write_blocker.py +804 -808
- package/hooks/blocking/test_verification_verdict_store.py +54 -0
- package/hooks/blocking/test_verified_commit_gate.py +581 -581
- package/hooks/blocking/test_verified_commit_message_accuracy_blocker.py +131 -131
- package/hooks/blocking/unscoped_search_blocker.py +391 -0
- package/hooks/blocking/verdict_directory_write_blocker.py +687 -687
- package/hooks/blocking/verification_verdict_store.py +1039 -1036
- package/hooks/blocking/verified_commit_message_accuracy_blocker.py +167 -167
- package/hooks/blocking/verifier_verdict_minter.py +280 -280
- package/hooks/git-hooks/CLAUDE.md +3 -0
- package/hooks/git-hooks/conftest.py +30 -0
- package/hooks/git-hooks/gate_utils.py +2 -2
- package/hooks/git-hooks/git_hooks_constants/__init__.py +41 -2
- package/hooks/git-hooks/pre_push.py +75 -4
- package/hooks/git-hooks/pre_push_base_reference.py +166 -0
- package/hooks/git-hooks/test_config.py +0 -15
- package/hooks/git-hooks/test_gate_utils.py +3 -15
- package/hooks/git-hooks/test_pre_commit.py +1 -15
- package/hooks/git-hooks/test_pre_push.py +257 -23
- package/hooks/git-hooks/test_pre_push_base_reference.py +339 -0
- package/hooks/hooks.json +10 -12
- package/hooks/hooks_constants/CLAUDE.md +7 -2
- package/hooks/hooks_constants/bash_pre_tool_use_dispatcher_constants.py +4 -4
- package/hooks/hooks_constants/eli11_reply_enforcer_constants.py +101 -0
- package/hooks/hooks_constants/enter_worktree_prefetch_constants.py +18 -18
- package/hooks/hooks_constants/nas_ssh_binary_enforcer_constants.py +2 -8
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +48 -0
- package/hooks/hooks_constants/ruff_integration_constants.py +16 -0
- package/hooks/hooks_constants/shell_command_segments.py +82 -0
- package/hooks/hooks_constants/shell_substitution_blocker_constants.py +67 -0
- package/hooks/hooks_constants/stop_dispatcher_constants.py +1 -0
- package/hooks/hooks_constants/test_bash_pre_tool_use_dispatcher_constants.py +5 -6
- package/hooks/hooks_constants/test_stop_dispatcher_constants.py +1 -0
- package/hooks/hooks_constants/unscoped_search_blocker_constants.py +153 -0
- package/hooks/lifecycle/enter_worktree_origin_prefetch.py +163 -146
- package/hooks/lifecycle/test_enter_worktree_origin_prefetch.py +185 -178
- package/hooks/pyproject.toml +1 -0
- package/hooks/validators/CLAUDE.md +1 -0
- package/hooks/validators/config/__init__.py +0 -0
- package/hooks/validators/config/directory_exemption_constants.py +183 -0
- package/hooks/validators/config/test_directory_exemption_constants.py +21 -0
- package/hooks/validators/conftest.py +4 -0
- package/hooks/validators/ruff_integration.py +49 -5
- package/hooks/validators/run_all_validators.py +206 -9
- package/hooks/validators/test_directory_exemption_constants.py +185 -0
- package/hooks/validators/test_python_antipattern_checks.py +110 -5
- package/hooks/validators/test_ruff_integration.py +92 -1
- package/hooks/validators/test_run_all_validators.py +115 -68
- package/hooks/validators/test_run_all_validators_pretooluse.py +159 -1
- package/package.json +13 -3
- package/rules/CLAUDE.md +17 -22
- package/rules/agent-spawn-protocol.md +6 -6
- package/rules/anti-corollary-tests.md +1 -1
- package/rules/bdd.md +1 -1
- package/rules/cleanup-temp-files.md +10 -4
- package/rules/code-standards.md +7 -0
- package/rules/conservative-action.md +1 -5
- package/rules/context7.md +0 -4
- package/rules/destructive-commands.md +47 -0
- package/rules/doc-inventory-integrity.md +48 -0
- package/rules/doc-prose-cuts.md +58 -0
- package/rules/docstring-prose-matches-implementation.md +53 -44
- package/rules/durable-post-artifacts.md +0 -4
- package/rules/eli11-replies.md +31 -0
- package/rules/explore-thoroughly.md +4 -4
- package/rules/falsify-before-green.md +68 -0
- package/rules/file-global-constants.md +1 -1
- package/rules/filesystem-search.md +51 -0
- package/rules/gh-cli-conventions.md +27 -0
- package/rules/git-workflow.md +26 -0
- package/rules/hedging-claims.md +9 -0
- package/rules/long-horizon-autonomy.md +0 -4
- package/rules/measurement-denominators.md +48 -0
- package/rules/nas-ssh-invocation.md +23 -5
- package/rules/parallel-tools.md +2 -2
- package/rules/plain-illustrative-docstrings.md +3 -7
- package/rules/plain-language.md +2 -0
- package/rules/proof-of-work-pr-comments.md +0 -4
- package/rules/re-stage-before-commit.md +2 -0
- package/rules/research-mode.md +10 -0
- package/rules/shell-invocation.md +21 -0
- package/rules/testing.md +4 -0
- package/rules/verified-commit-gate-skip.md +3 -27
- package/rules/verify-before-asking.md +5 -0
- package/rules/windows-filesystem-safe.md +1 -1
- package/rules/workers-done-before-complete.md +4 -0
- package/scripts/CLAUDE.md +1 -0
- package/scripts/Capture-PoolHealth.ps1 +410 -0
- package/scripts/Migrate-ShellPolicy.ps1 +1 -1
- package/scripts/_code_review_test_support.py +404 -0
- package/scripts/claude_chain_runner.py +141 -1
- package/scripts/codex_capability_bridge.py +171 -0
- package/scripts/codex_compat_materializer.py +1087 -0
- package/scripts/codex_compat_watcher.py +502 -0
- package/scripts/conftest.py +16 -1
- package/scripts/dev_env_scripts_constants/CLAUDE.md +1 -1
- package/scripts/dev_env_scripts_constants/claude_chain_constants.py +9 -0
- package/scripts/dev_env_scripts_constants/code_review_constants.py +37 -0
- package/scripts/invoke_code_review.py +11 -4
- package/scripts/resolve_worker_spawn.py +626 -626
- package/scripts/spawn_grok_batch.py +672 -672
- package/scripts/sync_to_cursor/rules.py +0 -10
- package/scripts/test_claude_chain_runner.py +131 -0
- package/scripts/test_invoke_code_review.py +85 -908
- package/scripts/test_invoke_code_review_chain.py +70 -0
- package/scripts/test_invoke_code_review_cli.py +192 -0
- package/scripts/test_invoke_code_review_contract.py +256 -0
- package/scripts/test_invoke_code_review_git.py +123 -0
- package/scripts/test_invoke_code_review_mode.py +99 -0
- package/scripts/test_resolve_worker_spawn.py +1014 -1014
- package/scripts/tests/test_code_review_constants.py +80 -0
- package/scripts/tests/test_codex_capability_bridge.py +91 -0
- package/scripts/tests/test_codex_compat_materializer.py +632 -0
- package/scripts/tests/test_codex_compat_watcher.py +599 -0
- package/scripts/tests/test_sync_to_cursor.py +0 -1
- package/skills/CLAUDE.md +2 -0
- package/skills/auditing-claude-config/SKILL.md +114 -114
- package/skills/autoconverge/SKILL.md +427 -427
- package/skills/autoconverge/reference/convergence.md +24 -3
- package/skills/autoconverge/workflow/CLAUDE.md +1 -0
- package/skills/autoconverge/workflow/converge.clean-audit.test.mjs +3 -3
- package/skills/autoconverge/workflow/converge.contract.test.mjs +1263 -1263
- package/skills/autoconverge/workflow/converge.mjs +168 -1
- package/skills/autoconverge/workflow/converge.p2-advance.test.mjs +202 -0
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a11d903476b803493.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a26213978adeef6fb.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a3def0d15ed9d9110.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a41f41b1b708ee3b7.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a758b880abecc3ff7.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-a8897b89656b1bd16.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-abd463d744a1437bc.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/subagents/workflows/wf_881252e6-700/agent-ad19d027ae8ee1816.jsonl +2 -2
- package/skills/autoconverge/workflow/fixtures/wf_run/workflows/wf_881252e6-700.json +265 -265
- package/skills/bugteam/reference/copilot-gap-analysis.md +1 -1
- package/skills/closeout/SKILL.md +33 -50
- package/skills/codex-review/scripts/codex_review_scripts_constants/run_constants.py +8 -0
- package/skills/codex-review/scripts/run_codex_review.py +233 -1
- package/skills/codex-review/scripts/test_run_codex_review.py +189 -0
- package/skills/condensing-instructions/SKILL.md +72 -0
- package/skills/copilot-review/SKILL.md +119 -119
- package/skills/e-code-review/SKILL.md +52 -0
- package/skills/e-code-review/reference/fix.md +54 -0
- package/skills/e-code-review/reference/loop.md +43 -0
- package/skills/e-code-review/reference/low.md +57 -0
- package/skills/e-code-review/reference/medium.md +153 -0
- package/skills/e-code-review/reference/xhigh.md +182 -0
- package/skills/e-simplify/SKILL.md +97 -0
- package/skills/fresh-branch/CLAUDE.md +1 -1
- package/skills/fresh-branch/SKILL.md +5 -6
- package/skills/fresh-branch/scripts/create_fresh_branch.py +42 -24
- package/skills/fresh-branch/scripts/fresh_branch_scripts_constants/fresh_branch_cli_constants.py +1 -3
- package/skills/fresh-branch/scripts/test_create_fresh_branch.py +30 -126
- package/skills/issue-tracker/SKILL.md +92 -0
- package/skills/issue-tracker/reference/epic-and-sub-issue-model.md +55 -0
- package/skills/issue-tracker/reference/handoff-schema.md +64 -0
- package/skills/issue-tracker/reference/operation-matrix.md +41 -0
- package/skills/orchestrator/SKILL.md +177 -22
- package/skills/orchestrator/scripts/status_gate.py +625 -0
- package/skills/orchestrator/scripts/status_gate_constants/__init__.py +1 -0
- package/skills/orchestrator/scripts/status_gate_constants/config/__init__.py +1 -0
- package/skills/orchestrator/scripts/status_gate_constants/config/constants.py +47 -0
- package/skills/orchestrator/scripts/test_status_gate.py +439 -0
- package/skills/orchestrator-refresh/SKILL.md +129 -35
- package/skills/plan-to-pr/SKILL.md +155 -0
- package/skills/plan-to-pr/reference/final-validation-tasks.md +15 -0
- package/skills/plan-to-pr/reference/model-routing.md +36 -0
- package/skills/plan-to-pr/reference/packet-contract.md +43 -0
- package/skills/plan-to-pr/reference/packet-schema.json +57 -0
- package/skills/plan-to-pr/reference/process-inventory.md +22 -0
- package/skills/plan-to-pr/reference/review-loop.md +33 -0
- package/skills/plan-to-pr/reference/run-record.schema.json +27 -0
- package/skills/plan-to-pr/reference/self-audit-tasks.md +15 -0
- package/skills/plan-to-pr/reference/task-seeds.md +14 -0
- package/skills/plan-to-pr/reference/task-ticket.md +38 -0
- package/skills/plan-to-pr/scripts/config/__init__.py +1 -0
- package/skills/plan-to-pr/scripts/config/constants.py +193 -0
- package/skills/plan-to-pr/scripts/create_packet.py +173 -0
- package/skills/plan-to-pr/scripts/test_create_packet.py +102 -0
- package/skills/plan-to-pr/scripts/test_validate_packet.py +256 -0
- package/skills/plan-to-pr/scripts/test_validate_protocol.py +135 -0
- package/skills/plan-to-pr/scripts/test_validate_run.py +158 -0
- package/skills/plan-to-pr/scripts/validate_packet.py +655 -0
- package/skills/plan-to-pr/scripts/validate_protocol.py +622 -0
- package/skills/plan-to-pr/scripts/validate_run.py +173 -0
- package/skills/plan-to-pr/test_skill_contract.py +207 -0
- package/skills/plan-to-pr/test_task_ticket_contract.py +151 -0
- package/skills/pr-converge/SKILL.md +472 -469
- package/skills/pr-converge/reference/examples.md +3 -3
- package/skills/pr-converge/reference/fix-protocol.md +1 -1
- package/skills/pr-converge/reference/ground-rules.md +7 -4
- package/skills/pr-converge/reference/multi-pr-orchestration.md +4 -1
- package/skills/pr-converge/reference/per-tick.md +5 -5
- package/skills/pr-converge/reference/progress-checklist.md +1 -1
- package/skills/pr-converge/scripts/check_convergence_gates.py +279 -279
- package/skills/pr-converge/scripts/test_check_convergence_codex.py +507 -507
- package/skills/pr-converge/scripts/test_check_convergence_gates.py +84 -84
- package/skills/pr-converge/test_step5_host_branch.py +1 -1
- package/skills/pr-fix-protocol/SKILL.md +1 -1
- package/skills/privacy-hygiene/SKILL.md +68 -68
- package/skills/privacy-hygiene/reference/sweep-procedure.md +1 -1
- package/skills/prototype/workflows/promotion.md +1 -1
- package/skills/release-notes-html/SKILL.md +164 -0
- package/skills/session-log/SKILL.md +1 -1
- package/skills/task-build/CLAUDE.md +8 -7
- package/skills/task-build/SKILL.md +16 -8
- package/skills/task-build/reference/tool-routing.md +19 -0
- package/rules/claude-md-orphan-file.md +0 -28
- package/rules/cleanup-command-forms.md +0 -23
- package/rules/code-reviews.md +0 -11
- package/rules/env-var-table-code-drift.md +0 -10
- package/rules/gh-body-file.md +0 -5
- package/rules/gh-paginate.md +0 -3
- package/rules/hook-prose-matches-detector.md +0 -15
- package/rules/no-historical-clutter.md +0 -26
- package/rules/no-inline-destructive-literals.md +0 -9
- package/rules/no-justification-noise.md +0 -61
- package/rules/package-inventory-stale-entry.md +0 -25
- package/rules/right-sized-engineering.md +0 -28
- package/rules/self-contained-docs.md +0 -17
- package/rules/shell-invocation-policy.md +0 -5
- package/rules/tdd.md +0 -7
- package/skills/closeout/reference/issue-body-templates.md +0 -108
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
`medium effort → 3+5 angles → 1-vote verify`
|
|
2
|
+
|
|
3
|
+
You are reviewing for **precision** at medium effort: every finding you surface
|
|
4
|
+
should be one a maintainer would act on.
|
|
5
|
+
|
|
6
|
+
## Phase 0 — Gather the diff
|
|
7
|
+
|
|
8
|
+
Run `git diff @{upstream}...HEAD` (or `git diff main...HEAD` / `git diff HEAD~1`
|
|
9
|
+
if there's no upstream) to get the unified diff under review. If there are
|
|
10
|
+
uncommitted changes, or the range diff is empty, also run `git diff HEAD` and
|
|
11
|
+
include the working-tree changes in scope — the review often runs before the
|
|
12
|
+
commit. If a PR number, branch name, or file path was passed as an argument,
|
|
13
|
+
review that target instead. Treat this diff as the review scope.
|
|
14
|
+
|
|
15
|
+
## Phase 1 — Find candidates (3 correctness angles + 3 cleanup angles + 1 altitude angle + 1 conventions angle)
|
|
16
|
+
|
|
17
|
+
Run **8 independent finder angles** via the Agent tool. Each surfaces
|
|
18
|
+
candidate findings with `file`, `line`, a one-line `summary`, and a concrete
|
|
19
|
+
`failure_scenario`. If the Agent tool is not available in your current tool
|
|
20
|
+
set, do not error — perform each angle (and each verification) yourself,
|
|
21
|
+
sequentially, in this context.
|
|
22
|
+
|
|
23
|
+
### Angle A — line-by-line diff scan
|
|
24
|
+
|
|
25
|
+
Read every hunk in the diff, line by line. Then Read the enclosing function for
|
|
26
|
+
each hunk — bugs in unchanged lines of a touched function are in scope (the PR
|
|
27
|
+
re-exposes or fails to fix them). For every line ask: what input, state, timing,
|
|
28
|
+
or platform makes this line wrong? Look for inverted/wrong conditions,
|
|
29
|
+
off-by-one, null/undefined deref, missing `await`, falsy-zero checks,
|
|
30
|
+
wrong-variable copy-paste, error swallowed in catch, unescaped regex metachars.
|
|
31
|
+
|
|
32
|
+
### Angle B — removed-behavior auditor
|
|
33
|
+
|
|
34
|
+
For every line the diff DELETES or replaces, name the invariant or behavior it
|
|
35
|
+
enforced, then search the new code for where that invariant is re-established.
|
|
36
|
+
If you can't find it, that's a candidate: a removed guard, a dropped error
|
|
37
|
+
path, a narrowed validation, a deleted test that was covering a real case.
|
|
38
|
+
|
|
39
|
+
### Angle C — cross-file tracer
|
|
40
|
+
|
|
41
|
+
For each function the diff changes, find its callers (Grep for the symbol) and
|
|
42
|
+
check whether the change breaks any call site: a new precondition, a changed
|
|
43
|
+
return shape, a new exception, a timing/ordering dependency. Also check callees:
|
|
44
|
+
does a parallel change in the same PR make a call unsafe?
|
|
45
|
+
|
|
46
|
+
### Reuse
|
|
47
|
+
|
|
48
|
+
The angles above hunt for bugs; this one and the next two hunt for cleanup in
|
|
49
|
+
the changed code. Flag new code that re-implements something the codebase
|
|
50
|
+
already has — Grep shared/utility modules and files adjacent to the change,
|
|
51
|
+
and name the existing helper to call instead.
|
|
52
|
+
|
|
53
|
+
### Simplification
|
|
54
|
+
|
|
55
|
+
Flag unnecessary complexity the diff adds: redundant or derivable state,
|
|
56
|
+
copy-paste with slight variation, deep nesting, dead code left behind. Name
|
|
57
|
+
the simpler form that does the same job.
|
|
58
|
+
|
|
59
|
+
### Efficiency
|
|
60
|
+
|
|
61
|
+
Flag wasted work the diff introduces: redundant computation or repeated I/O,
|
|
62
|
+
independent operations run sequentially, blocking work added to startup or
|
|
63
|
+
hot paths. Also flag long-lived objects built from closures or captured
|
|
64
|
+
environments — they keep the entire enclosing scope alive for the object's
|
|
65
|
+
lifetime (a memory leak when that scope holds large values); prefer a
|
|
66
|
+
class/struct that copies only the fields it needs. Name the cheaper
|
|
67
|
+
alternative.
|
|
68
|
+
|
|
69
|
+
### Altitude
|
|
70
|
+
|
|
71
|
+
Check that each change is implemented at the right depth, not as a fragile
|
|
72
|
+
bandaid. Special cases layered on shared infrastructure are a sign the fix
|
|
73
|
+
isn't deep enough — prefer generalizing the underlying mechanism over adding
|
|
74
|
+
special cases.
|
|
75
|
+
|
|
76
|
+
### Conventions (CLAUDE.md)
|
|
77
|
+
|
|
78
|
+
Find the CLAUDE.md files that govern the changed code: the user-level
|
|
79
|
+
~/.claude/CLAUDE.md, the repo-root CLAUDE.md, plus any CLAUDE.md or
|
|
80
|
+
CLAUDE.local.md in a directory that is an ancestor of a changed file (a
|
|
81
|
+
directory's CLAUDE.md only applies to files at or below it). Read each one
|
|
82
|
+
that exists, then check the diff for clear violations of the rules they state.
|
|
83
|
+
|
|
84
|
+
Only flag a violation when you can quote the exact rule and the exact line
|
|
85
|
+
that breaks it — no style preferences, no vague "spirit of the doc"
|
|
86
|
+
inferences. In the finding, name the CLAUDE.md path and quote the rule so the
|
|
87
|
+
report can cite it. If no CLAUDE.md applies, return nothing for this angle.
|
|
88
|
+
|
|
89
|
+
Cleanup, altitude, and conventions candidates use the same
|
|
90
|
+
`file`/`line`/`summary` shape; in `failure_scenario`, state the concrete
|
|
91
|
+
cost (what is duplicated, wasted, harder to maintain, or which CLAUDE.md rule
|
|
92
|
+
is broken) instead of a crash. Correctness bugs always outrank cleanup,
|
|
93
|
+
altitude, and conventions findings.
|
|
94
|
+
|
|
95
|
+
Pass every candidate with a nameable failure scenario through — finders that
|
|
96
|
+
silently drop half-believed candidates bypass the verify step and are the
|
|
97
|
+
dominant cause of misses.
|
|
98
|
+
|
|
99
|
+
## Phase 2 — Verify (1-vote, 3-state)
|
|
100
|
+
|
|
101
|
+
Dedup candidates that point at the same line/mechanism, keeping the one with
|
|
102
|
+
the most concrete failure scenario. For each remaining candidate, run **one
|
|
103
|
+
verifier** via the Agent tool: give it the diff, the relevant
|
|
104
|
+
file(s), and the candidate, and have it return exactly one of:
|
|
105
|
+
|
|
106
|
+
- **CONFIRMED** — can name the inputs/state that trigger it and the wrong
|
|
107
|
+
output or crash. Quote the line.
|
|
108
|
+
- **PLAUSIBLE** — mechanism is real, trigger is uncertain (timing, env,
|
|
109
|
+
config). State what would confirm it.
|
|
110
|
+
- **REFUTED** — factually wrong (code doesn't say that) or guarded elsewhere.
|
|
111
|
+
Quote the line that proves it.
|
|
112
|
+
|
|
113
|
+
Keep candidates where the vote is CONFIRMED or PLAUSIBLE.
|
|
114
|
+
|
|
115
|
+
## Output
|
|
116
|
+
|
|
117
|
+
Report this review's results — `{level, findings}` — through the structured
|
|
118
|
+
findings-report call: the mechanism that renders a review's results as a typed
|
|
119
|
+
list in the host UI, ranked most-severe first. Each entry has `file`, `line`,
|
|
120
|
+
`summary`, `short_summary` — the claim compressed to ≤60 characters, no
|
|
121
|
+
rationale or consequence clause — `failure_scenario`, and `category` — a short
|
|
122
|
+
kebab-case slug for the angle that produced it (`correctness`,
|
|
123
|
+
`simplification`, `efficiency`, `reuse`, `altitude`, `conventions`, or a more
|
|
124
|
+
specific slug like `test-coverage` when one fits better) — plus `verdict` when
|
|
125
|
+
a verify pass produced one. If nothing survives verification, make that call
|
|
126
|
+
with an empty array. Do not also print the findings as text, and do not create
|
|
127
|
+
or publish an artifact of the review — the structured call is the report.
|
|
128
|
+
|
|
129
|
+
## Applying fixes (--fix)
|
|
130
|
+
|
|
131
|
+
The `--fix` flag was passed. Follow `reference\fix.md` (relative to this
|
|
132
|
+
skill's folder) for the exact fix, commit-gate, and skip-handling behavior —
|
|
133
|
+
it governs which agent applies each fix, how a fix gets committed, how a skip
|
|
134
|
+
is logged, and how outcomes get reported. Do not repeat the findings as text;
|
|
135
|
+
follow that document's reporting rules once fixes land.
|
|
136
|
+
|
|
137
|
+
## If findings are fixed later
|
|
138
|
+
|
|
139
|
+
Whenever a reported finding is fixed later in this session — the user asks you
|
|
140
|
+
to fix it, or later work fixes it incidentally — follow `reference\fix.md`'s
|
|
141
|
+
reporting rules again: report the same findings through the structured
|
|
142
|
+
findings-report call, each carrying an `outcome`. Do not repeat the findings
|
|
143
|
+
as text. Make that call immediately after the fixes land, before any prose
|
|
144
|
+
summary; the host UI's per-finding status updates only from that call.
|
|
145
|
+
|
|
146
|
+
## Looping (`loop`)
|
|
147
|
+
|
|
148
|
+
The `loop` arg was passed. Follow `reference\loop.md` (relative to this
|
|
149
|
+
skill's folder) for how to re-run Phases 0–2, Output, and (if `--fix` is also
|
|
150
|
+
present) `reference\fix.md`'s fix pass, repeatedly — including its exit
|
|
151
|
+
condition, iteration cap, and re-invocation rules. Do not treat a single pass
|
|
152
|
+
through this document as complete while `loop` is active; hand control to that
|
|
153
|
+
document instead of stopping at Output.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
`xhigh effort → 5+5 angles → 1-vote verify → sweep`
|
|
2
|
+
|
|
3
|
+
You are reviewing for **recall** at extra-high effort: catch every real bug. At
|
|
4
|
+
this level, catching real bugs matters more than avoiding false positives — a
|
|
5
|
+
missed bug ships. Err on the side of surfacing.
|
|
6
|
+
|
|
7
|
+
## Phase 0 — Gather the diff
|
|
8
|
+
|
|
9
|
+
Run `git diff @{upstream}...HEAD` (or `git diff main...HEAD` / `git diff HEAD~1`
|
|
10
|
+
if there's no upstream) to get the unified diff under review. If there are
|
|
11
|
+
uncommitted changes, or the range diff is empty, also run `git diff HEAD` and
|
|
12
|
+
include the working-tree changes in scope — the review often runs before the
|
|
13
|
+
commit. If a PR number, branch name, or file path was passed as an argument,
|
|
14
|
+
review that target instead. Treat this diff as the review scope.
|
|
15
|
+
|
|
16
|
+
## Phase 1 — Find candidates (5 correctness angles + 3 cleanup angles + 1 altitude angle + 1 conventions angle)
|
|
17
|
+
|
|
18
|
+
Run **10 independent finder angles** via the Agent tool. Each surfaces
|
|
19
|
+
candidate findings. Do NOT let one angle's conclusions suppress another's — if
|
|
20
|
+
two angles flag the same line for different reasons, record both. If the Agent
|
|
21
|
+
tool is not available in your current tool set, do not error — perform each
|
|
22
|
+
angle (and each verification) yourself, sequentially, in this context.
|
|
23
|
+
|
|
24
|
+
### Angle A — line-by-line diff scan
|
|
25
|
+
|
|
26
|
+
Read every hunk in the diff, line by line. Then Read the enclosing function for
|
|
27
|
+
each hunk — bugs in unchanged lines of a touched function are in scope (the PR
|
|
28
|
+
re-exposes or fails to fix them). For every line ask: what input, state, timing,
|
|
29
|
+
or platform makes this line wrong? Look for inverted/wrong conditions,
|
|
30
|
+
off-by-one, null/undefined deref, missing `await`, falsy-zero checks,
|
|
31
|
+
wrong-variable copy-paste, error swallowed in catch, unescaped regex metachars.
|
|
32
|
+
|
|
33
|
+
### Angle B — removed-behavior auditor
|
|
34
|
+
|
|
35
|
+
For every line the diff DELETES or replaces, name the invariant or behavior it
|
|
36
|
+
enforced, then search the new code for where that invariant is re-established.
|
|
37
|
+
If you can't find it, that's a candidate: a removed guard, a dropped error
|
|
38
|
+
path, a narrowed validation, a deleted test that was covering a real case.
|
|
39
|
+
|
|
40
|
+
### Angle C — cross-file tracer
|
|
41
|
+
|
|
42
|
+
For each function the diff changes, find its callers (Grep for the symbol) and
|
|
43
|
+
check whether the change breaks any call site: a new precondition, a changed
|
|
44
|
+
return shape, a new exception, a timing/ordering dependency. Also check callees:
|
|
45
|
+
does a parallel change in the same PR make a call unsafe?
|
|
46
|
+
|
|
47
|
+
### Angle D — language-pitfall specialist
|
|
48
|
+
|
|
49
|
+
Scan for the classic pitfalls of the diff's language/framework — for example:
|
|
50
|
+
JS falsy-zero, `==` coercion, closure-captured loop var; Python mutable default
|
|
51
|
+
args, late-binding closures; Go nil-map write, range-var capture; SQL injection;
|
|
52
|
+
timezone/DST drift; float equality. Flag any instance the diff introduces.
|
|
53
|
+
|
|
54
|
+
### Angle E — wrapper/proxy correctness
|
|
55
|
+
|
|
56
|
+
When the PR adds or modifies a type that wraps another (cache, proxy, decorator,
|
|
57
|
+
adapter): check that every method routes to the wrapped instance and not back
|
|
58
|
+
through a registry/session/global — e.g. a caching provider holding a
|
|
59
|
+
`delegate` field that resolves IDs via `session.get(...)` instead of
|
|
60
|
+
`delegate.get(...)` will re-enter the cache or recurse. Also check that the
|
|
61
|
+
wrapper forwards all the methods the callers actually use.
|
|
62
|
+
|
|
63
|
+
### Reuse
|
|
64
|
+
|
|
65
|
+
The angles above hunt for bugs; this one and the next two hunt for cleanup in
|
|
66
|
+
the changed code. Flag new code that re-implements something the codebase
|
|
67
|
+
already has — Grep shared/utility modules and files adjacent to the change,
|
|
68
|
+
and name the existing helper to call instead.
|
|
69
|
+
|
|
70
|
+
### Simplification
|
|
71
|
+
|
|
72
|
+
Flag unnecessary complexity the diff adds: redundant or derivable state,
|
|
73
|
+
copy-paste with slight variation, deep nesting, dead code left behind. Name
|
|
74
|
+
the simpler form that does the same job.
|
|
75
|
+
|
|
76
|
+
### Efficiency
|
|
77
|
+
|
|
78
|
+
Flag wasted work the diff introduces: redundant computation or repeated I/O,
|
|
79
|
+
independent operations run sequentially, blocking work added to startup or
|
|
80
|
+
hot paths. Also flag long-lived objects built from closures or captured
|
|
81
|
+
environments — they keep the entire enclosing scope alive for the object's
|
|
82
|
+
lifetime (a memory leak when that scope holds large values); prefer a
|
|
83
|
+
class/struct that copies only the fields it needs. Name the cheaper
|
|
84
|
+
alternative.
|
|
85
|
+
|
|
86
|
+
### Altitude
|
|
87
|
+
|
|
88
|
+
Check that each change is implemented at the right depth, not as a fragile
|
|
89
|
+
bandaid. Special cases layered on shared infrastructure are a sign the fix
|
|
90
|
+
isn't deep enough — prefer generalizing the underlying mechanism over adding
|
|
91
|
+
special cases.
|
|
92
|
+
|
|
93
|
+
### Conventions (CLAUDE.md)
|
|
94
|
+
|
|
95
|
+
Find the CLAUDE.md files that govern the changed code: the user-level
|
|
96
|
+
~/.claude/CLAUDE.md, the repo-root CLAUDE.md, plus any CLAUDE.md or
|
|
97
|
+
CLAUDE.local.md in a directory that is an ancestor of a changed file (a
|
|
98
|
+
directory's CLAUDE.md only applies to files at or below it). Read each one
|
|
99
|
+
that exists, then check the diff for clear violations of the rules they state.
|
|
100
|
+
|
|
101
|
+
Only flag a violation when you can quote the exact rule and the exact line
|
|
102
|
+
that breaks it — no style preferences, no vague "spirit of the doc"
|
|
103
|
+
inferences. In the finding, name the CLAUDE.md path and quote the rule so the
|
|
104
|
+
report can cite it. If no CLAUDE.md applies, return nothing for this angle.
|
|
105
|
+
|
|
106
|
+
Cleanup, altitude, and conventions candidates use the same
|
|
107
|
+
`file`/`line`/`summary` shape; in `failure_scenario`, state the concrete
|
|
108
|
+
cost (what is duplicated, wasted, harder to maintain, or which CLAUDE.md rule
|
|
109
|
+
is broken) instead of a crash. Correctness bugs always outrank cleanup,
|
|
110
|
+
altitude, and conventions findings.
|
|
111
|
+
|
|
112
|
+
## Phase 2 — Verify (1-vote, 3-state)
|
|
113
|
+
|
|
114
|
+
Dedup candidates that point at the same line/mechanism, keeping the one with
|
|
115
|
+
the most concrete failure scenario. For each remaining candidate, run **one
|
|
116
|
+
verifier** via the Agent tool: give it the diff, the relevant
|
|
117
|
+
file(s), and the candidate, and have it return exactly one of:
|
|
118
|
+
|
|
119
|
+
- **CONFIRMED** — can name the inputs/state that trigger it and the wrong
|
|
120
|
+
output or crash. Quote the line.
|
|
121
|
+
- **PLAUSIBLE** — mechanism is real, trigger is uncertain (timing, env,
|
|
122
|
+
config). State what would confirm it.
|
|
123
|
+
- **REFUTED** — factually wrong (code doesn't say that) or guarded elsewhere.
|
|
124
|
+
Quote the line that proves it.
|
|
125
|
+
|
|
126
|
+
Keep candidates where the vote is CONFIRMED or PLAUSIBLE.
|
|
127
|
+
|
|
128
|
+
This is recall mode — a single non-REFUTED vote carries the finding. Do NOT
|
|
129
|
+
drop on uncertainty.
|
|
130
|
+
|
|
131
|
+
## Phase 3 — Sweep for gaps
|
|
132
|
+
|
|
133
|
+
Run **one more finder** as a fresh reviewer who has the verified list. Re-read
|
|
134
|
+
the diff and enclosing functions looking ONLY for defects not already listed.
|
|
135
|
+
Do not re-derive or re-confirm anything already there — the job is gaps. Focus
|
|
136
|
+
on what the first pass tends to miss: moved/extracted code that dropped a guard
|
|
137
|
+
or anchor; second-tier footguns (dataclass default evaluated once, `hash()`
|
|
138
|
+
non-determinism, lock-scope shrink, predicate methods with side effects);
|
|
139
|
+
setup/teardown asymmetry in tests; config defaults flipped.
|
|
140
|
+
|
|
141
|
+
Surface additional candidates, each naming a defect not already on the list.
|
|
142
|
+
If nothing new, return an empty sweep — do not pad.
|
|
143
|
+
|
|
144
|
+
## Output
|
|
145
|
+
|
|
146
|
+
Report this review's results — `{level, findings}` — through the structured
|
|
147
|
+
findings-report call: the mechanism that renders a review's results as a typed
|
|
148
|
+
list in the host UI, ranked most-severe first. Each entry has `file`, `line`,
|
|
149
|
+
`summary`, `short_summary` — the claim compressed to ≤60 characters, no
|
|
150
|
+
rationale or consequence clause — `failure_scenario`, and `category` — a short
|
|
151
|
+
kebab-case slug for the angle that produced it (`correctness`,
|
|
152
|
+
`simplification`, `efficiency`, `reuse`, `altitude`, `conventions`, or a more
|
|
153
|
+
specific slug like `test-coverage` when one fits better) — plus `verdict` when
|
|
154
|
+
a verify pass produced one. If nothing survives verification, make that call
|
|
155
|
+
with an empty array. Do not also print the findings as text, and do not create
|
|
156
|
+
or publish an artifact of the review — the structured call is the report.
|
|
157
|
+
|
|
158
|
+
## Applying fixes (--fix)
|
|
159
|
+
|
|
160
|
+
The `--fix` flag was passed. Follow `reference\fix.md` (relative to this
|
|
161
|
+
skill's folder) for the exact fix, commit-gate, and skip-handling behavior —
|
|
162
|
+
it governs which agent applies each fix, how a fix gets committed, how a skip
|
|
163
|
+
is logged, and how outcomes get reported. Do not repeat the findings as text;
|
|
164
|
+
follow that document's reporting rules once fixes land.
|
|
165
|
+
|
|
166
|
+
## If findings are fixed later
|
|
167
|
+
|
|
168
|
+
Whenever a reported finding is fixed later in this session — the user asks you
|
|
169
|
+
to fix it, or later work fixes it incidentally — follow `reference\fix.md`'s
|
|
170
|
+
reporting rules again: report the same findings through the structured
|
|
171
|
+
findings-report call, each carrying an `outcome`. Do not repeat the findings
|
|
172
|
+
as text. Make that call immediately after the fixes land, before any prose
|
|
173
|
+
summary; the host UI's per-finding status updates only from that call.
|
|
174
|
+
|
|
175
|
+
## Looping (`loop`)
|
|
176
|
+
|
|
177
|
+
The `loop` arg was passed. Follow `reference\loop.md` (relative to this
|
|
178
|
+
skill's folder) for how to re-run Phases 0–3, Output, and (if `--fix` is also
|
|
179
|
+
present) `reference\fix.md`'s fix pass, repeatedly — including its exit
|
|
180
|
+
condition, iteration cap, and re-invocation rules. Do not treat a single pass
|
|
181
|
+
through this document as complete while `loop` is active; hand control to that
|
|
182
|
+
document instead of stopping at Output.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: e-simplify
|
|
3
|
+
description: >-
|
|
4
|
+
Cleanup-only pass on the current diff — reuse, simplification, efficiency,
|
|
5
|
+
altitude — that fixes what it finds directly; no correctness-bug hunting.
|
|
6
|
+
Triggers: /e-simplify.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# e-simplify
|
|
10
|
+
|
|
11
|
+
**Core principle:** Four parallel cleanup angles (reuse, simplification, efficiency, altitude) over the current diff, applied directly — not a bug hunt, and not a report.
|
|
12
|
+
|
|
13
|
+
## Gotchas
|
|
14
|
+
|
|
15
|
+
- This skill fixes code quality, not correctness. A request for bug-hunting belongs to `/e-code-review`, not here — see the refusal case below.
|
|
16
|
+
- Applying a fix that changes intended behavior, or that reaches well outside the reviewed diff, is worse than leaving a flagged item unfixed — skip and note it instead of stretching the fix to cover it.
|
|
17
|
+
|
|
18
|
+
## When this skill applies
|
|
19
|
+
|
|
20
|
+
Triggers: `/e-simplify` on the current diff (or a PR/branch/path passed as an argument).
|
|
21
|
+
|
|
22
|
+
**Refusal cases — first match wins:**
|
|
23
|
+
|
|
24
|
+
- **Asked to find correctness bugs (crashes, wrong output, security issues) rather than cleanup.** Respond exactly: `That's a correctness review — use /e-code-review, not this skill.`
|
|
25
|
+
|
|
26
|
+
## The process
|
|
27
|
+
|
|
28
|
+
`/simplify → 4 cleanup agents in parallel → apply the fixes`
|
|
29
|
+
|
|
30
|
+
You are improving the quality of the changed code, not hunting for bugs. Review
|
|
31
|
+
it for reuse, simplification, efficiency, and altitude issues, then fix what you
|
|
32
|
+
find. Do not look for correctness bugs — that is what `/code-review` is for.
|
|
33
|
+
|
|
34
|
+
### Phase 0 — Gather the diff
|
|
35
|
+
|
|
36
|
+
Run `git diff @{upstream}...HEAD` (or `git diff main...HEAD` / `git diff HEAD~1`
|
|
37
|
+
if there's no upstream) to get the unified diff under review. If there are
|
|
38
|
+
uncommitted changes, or the range diff is empty, also run `git diff HEAD` and
|
|
39
|
+
include the working-tree changes in scope — the review often runs before the
|
|
40
|
+
commit. If a PR number, branch name, or file path was passed as an argument,
|
|
41
|
+
review that target instead. Treat this diff as the review scope.
|
|
42
|
+
|
|
43
|
+
### Phase 1 — Review (4 cleanup agents in parallel)
|
|
44
|
+
|
|
45
|
+
Launch **4 independent review agents** via the Agent tool, all in a
|
|
46
|
+
single message so they run concurrently. Pass each agent the diff and one of
|
|
47
|
+
the four angles below. Each returns its findings with `file`, `line`, a
|
|
48
|
+
one-line `summary`, and the concrete cost (what is duplicated, wasted, or
|
|
49
|
+
harder to maintain).
|
|
50
|
+
|
|
51
|
+
#### Reuse
|
|
52
|
+
|
|
53
|
+
Flag new code that re-implements something the codebase
|
|
54
|
+
already has — Grep shared/utility modules and files adjacent to the change,
|
|
55
|
+
and name the existing helper to call instead.
|
|
56
|
+
|
|
57
|
+
#### Simplification
|
|
58
|
+
|
|
59
|
+
Flag unnecessary complexity the diff adds: redundant or derivable state,
|
|
60
|
+
copy-paste with slight variation, deep nesting, dead code left behind. Name
|
|
61
|
+
the simpler form that does the same job.
|
|
62
|
+
|
|
63
|
+
#### Efficiency
|
|
64
|
+
|
|
65
|
+
Flag wasted work the diff introduces: redundant computation or repeated I/O,
|
|
66
|
+
independent operations run sequentially, blocking work added to startup or
|
|
67
|
+
hot paths. Also flag long-lived objects built from closures or captured
|
|
68
|
+
environments — they keep the entire enclosing scope alive for the object's
|
|
69
|
+
lifetime (a memory leak when that scope holds large values); prefer a
|
|
70
|
+
class/struct that copies only the fields it needs. Name the cheaper
|
|
71
|
+
alternative.
|
|
72
|
+
|
|
73
|
+
#### Altitude
|
|
74
|
+
|
|
75
|
+
Check that each change is implemented at the right depth, not as a fragile
|
|
76
|
+
bandaid. Special cases layered on shared infrastructure are a sign the fix
|
|
77
|
+
isn't deep enough — prefer generalizing the underlying mechanism over adding
|
|
78
|
+
special cases.
|
|
79
|
+
|
|
80
|
+
### Phase 2 — Apply the fixes
|
|
81
|
+
|
|
82
|
+
Wait for all four agents to complete, dedup findings that point at the same
|
|
83
|
+
line or mechanism, and fix each remaining one directly. Skip any finding whose
|
|
84
|
+
fix would change intended behavior, require changes well outside the reviewed
|
|
85
|
+
diff, or that you judge to be a false positive — note the skip rather than
|
|
86
|
+
arguing with it. Finish with a brief summary of what was fixed and what was
|
|
87
|
+
skipped (or confirm the code was already clean).
|
|
88
|
+
|
|
89
|
+
## File index
|
|
90
|
+
|
|
91
|
+
| File | Purpose |
|
|
92
|
+
|---|---|
|
|
93
|
+
| `SKILL.md` | This hub — the full cleanup procedure, refusal case |
|
|
94
|
+
|
|
95
|
+
## Folder map
|
|
96
|
+
|
|
97
|
+
- `SKILL.md` — hub: full procedure, refusal case.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# fresh-branch
|
|
2
2
|
|
|
3
|
-
Creates a new branch from fresh-fetched `origin/main` inside an isolated worktree under
|
|
3
|
+
Creates a new branch from fresh-fetched `origin/main` inside an isolated worktree under `<repo-root>/.claude/worktrees/<agent>/<branch-name>`. Does not push, open a PR, or run `checkout -b` in the caller tree.
|
|
4
4
|
|
|
5
5
|
## Key files
|
|
6
6
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fresh-branch
|
|
3
3
|
description: >-
|
|
4
|
-
Fresh git branch from origin/main in an isolated
|
|
4
|
+
Fresh git branch from origin/main in an isolated worktree under the repo's .claude/worktrees/ (never checkout -b in the caller tree).
|
|
5
5
|
Triggers: fresh branch, new branch from main, /fresh-branch, start fresh, clean branch off main,
|
|
6
6
|
worktree branch, branch in temp.
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# fresh-branch
|
|
10
10
|
|
|
11
|
-
Creates a new branch from a fresh-fetched `origin/main` inside an isolated git worktree under the agent
|
|
11
|
+
Creates a new branch from a fresh-fetched `origin/main` inside an isolated git worktree under the repository's `.claude/worktrees/<agent>/` root. Shared primitive: other skills invoke `/fresh-branch` when they need a clean branch without touching the caller's dirty tree.
|
|
12
12
|
|
|
13
13
|
**Announce at start:** "Creating a fresh branch from origin/main."
|
|
14
14
|
|
|
@@ -62,15 +62,14 @@ Optional flags:
|
|
|
62
62
|
| Flag | Role |
|
|
63
63
|
|------|------|
|
|
64
64
|
| `--repo <path>` | Source repo (default: current directory) |
|
|
65
|
-
| `--agent <slug>` |
|
|
65
|
+
| `--agent <slug>` | Worktree-root segment: `claude`, `grok`, `cursor`, `codex`, … |
|
|
66
66
|
| `--base <ref>` | Base ref (default: `origin/main`) |
|
|
67
67
|
|
|
68
68
|
Agent resolution inside the script: `--agent` → `FRESH_BRANCH_AGENT` env → host markers → `claude`.
|
|
69
69
|
|
|
70
70
|
Worktree path:
|
|
71
71
|
|
|
72
|
-
-
|
|
73
|
-
- Else: `${tmpdir}/<agent>/<branch-name>`
|
|
72
|
+
- `<repo-root>/.claude/worktrees/<agent>/<branch-name>`, on every platform
|
|
74
73
|
- If the path exists, the script suffixes `-2`, `-3`, …
|
|
75
74
|
|
|
76
75
|
On exit 0, stdout is one JSON object:
|
|
@@ -101,7 +100,7 @@ Further edits for the new branch belong in `worktree_path`, not in the caller's
|
|
|
101
100
|
|
|
102
101
|
## Gotchas
|
|
103
102
|
|
|
104
|
-
- **Dirty caller cwd blocks `checkout -b` and pollutes the tree.** Phase 3 always uses `git worktree add -b` into
|
|
103
|
+
- **Dirty caller cwd blocks `checkout -b` and pollutes the tree.** Phase 3 always uses `git worktree add -b` into `<repo-root>/.claude/worktrees/<agent>/…`. If you reconstruct Phase 3 by hand with `checkout -b` in the session cwd, local modifications block the checkout and leave the user on a half-switched branch.
|
|
105
104
|
- **Caller HEAD must stay put.** After success, the original repo's checked-out branch and dirty files are unchanged; only the new worktree has the new branch.
|
|
106
105
|
- **Branch name collision.** If the branch already exists, the script exits non-zero with `{"error":...}`. Pick a new name; do not delete remote branches unless the user asks.
|
|
107
106
|
- **Path already occupied.** A leftover folder at the preferred worktree path gets a numeric suffix (`-2`, …); report the path from JSON, not the path you assumed.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Create a fresh branch in an isolated git worktree under the
|
|
2
|
+
"""Create a fresh branch in an isolated git worktree under the repository.
|
|
3
3
|
|
|
4
4
|
::
|
|
5
5
|
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"base_commit": "abc...", "agent": "claude", "repo_root": "..."}
|
|
9
9
|
|
|
10
10
|
Never runs ``git checkout -b`` in the caller's working tree. Fetches the base
|
|
11
|
-
ref, then ``git worktree add -b --no-track`` into
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
ref, then ``git worktree add -b --no-track`` into
|
|
12
|
+
``<repo-root>/.claude/worktrees/<agent>/<branch>``. Exit 0 prints success JSON;
|
|
13
|
+
any failure prints ``{"error": ...}`` and exits non-zero.
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
from __future__ import annotations
|
|
@@ -20,7 +20,6 @@ import json
|
|
|
20
20
|
import os
|
|
21
21
|
import re
|
|
22
22
|
import sys
|
|
23
|
-
import tempfile
|
|
24
23
|
from pathlib import Path
|
|
25
24
|
|
|
26
25
|
from fresh_branch_git_commands import (
|
|
@@ -33,7 +32,7 @@ from fresh_branch_git_commands import (
|
|
|
33
32
|
from fresh_branch_scripts_constants.fresh_branch_cli_constants import (
|
|
34
33
|
AGENT_SLUG_PATTERN,
|
|
35
34
|
ALL_AGENT_DETECTION_MARKERS,
|
|
36
|
-
|
|
35
|
+
ALL_REPOSITORY_WORKTREE_ROOT_PARTS,
|
|
37
36
|
DEFAULT_AGENT_SLUG,
|
|
38
37
|
DEFAULT_BASE_REF,
|
|
39
38
|
ERROR_AGENT_SLUG_INVALID,
|
|
@@ -57,8 +56,6 @@ from fresh_branch_scripts_constants.fresh_branch_cli_constants import (
|
|
|
57
56
|
PAYLOAD_KEY_REPO_ROOT,
|
|
58
57
|
PAYLOAD_KEY_WORKTREE_PATH,
|
|
59
58
|
UNIQUE_PATH_SUFFIX_START,
|
|
60
|
-
USERPROFILE_ENV_VAR,
|
|
61
|
-
WINDOWS_PLATFORM_PREFIX,
|
|
62
59
|
)
|
|
63
60
|
|
|
64
61
|
|
|
@@ -94,28 +91,26 @@ def _detect_agent_slug_from_environment() -> str:
|
|
|
94
91
|
return DEFAULT_AGENT_SLUG
|
|
95
92
|
|
|
96
93
|
|
|
97
|
-
def resolve_agent_worktree_root(agent_slug: str) -> Path:
|
|
98
|
-
"""Return
|
|
94
|
+
def resolve_agent_worktree_root(repo_root: Path, agent_slug: str) -> Path:
|
|
95
|
+
"""Return the repository's per-agent worktree root.
|
|
99
96
|
|
|
100
97
|
::
|
|
101
98
|
|
|
102
|
-
#
|
|
103
|
-
resolve_agent_worktree_root("grok")
|
|
99
|
+
# repo_root=/srv/app, agent_slug=grok
|
|
100
|
+
resolve_agent_worktree_root(Path("/srv/app"), "grok")
|
|
101
|
+
# -> /srv/app/.claude/worktrees/grok
|
|
102
|
+
|
|
103
|
+
Every worktree sits under the repository it branches from, so a worktree
|
|
104
|
+
travels with its repository and each agent keeps its own subdirectory.
|
|
104
105
|
|
|
105
106
|
Args:
|
|
107
|
+
repo_root: Absolute path of the repository the branch comes from.
|
|
106
108
|
agent_slug: Short host label (one path segment).
|
|
107
109
|
|
|
108
110
|
Returns:
|
|
109
111
|
Directory that should hold per-branch worktree folders.
|
|
110
112
|
"""
|
|
111
|
-
|
|
112
|
-
user_profile = os.environ.get(USERPROFILE_ENV_VAR)
|
|
113
|
-
if user_profile:
|
|
114
|
-
return Path(user_profile).joinpath(
|
|
115
|
-
*ALL_WINDOWS_USER_SCRATCH_PARTS,
|
|
116
|
-
agent_slug,
|
|
117
|
-
)
|
|
118
|
-
return Path(tempfile.gettempdir()) / agent_slug
|
|
113
|
+
return repo_root.joinpath(*ALL_REPOSITORY_WORKTREE_ROOT_PARTS, agent_slug)
|
|
119
114
|
|
|
120
115
|
|
|
121
116
|
def resolve_unique_worktree_path(preferred_path: Path) -> Path:
|
|
@@ -181,13 +176,33 @@ def create_fresh_branch(
|
|
|
181
176
|
::
|
|
182
177
|
|
|
183
178
|
create_fresh_branch("fix/x", Path("."), "grok", "origin/main")
|
|
179
|
+
|
|
180
|
+
The caller's working tree is never checked out. The worktree lands under
|
|
181
|
+
the repository's ``.claude/worktrees/<agent>/<branch>``, suffixed ``-2``,
|
|
182
|
+
``-3``, … when that path is already taken.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
branch_name: Branch to create; must be a safe relative path.
|
|
186
|
+
repo_path: Any path inside the repository the branch comes from.
|
|
187
|
+
agent_slug: Short host label naming the worktree-root subdirectory.
|
|
188
|
+
base_ref: Ref the branch starts from, such as ``origin/main``.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
The success payload: branch, worktree_path, base_ref, base_commit,
|
|
192
|
+
agent, and repo_root.
|
|
193
|
+
|
|
194
|
+
Raises:
|
|
195
|
+
ValueError: When the branch name or the agent slug is unsafe.
|
|
196
|
+
RuntimeError: When git refuses the fetch or the worktree add.
|
|
184
197
|
"""
|
|
185
198
|
cleaned_branch = _require_safe_branch_name(branch_name)
|
|
186
199
|
normalized_agent_slug = _normalize_agent_slug(agent_slug)
|
|
187
200
|
resolved_base_ref, repo_root, base_commit = _resolve_branch_base(
|
|
188
201
|
repo_path, base_ref,
|
|
189
202
|
)
|
|
190
|
-
worktree_path = _allocate_worktree_path(
|
|
203
|
+
worktree_path = _allocate_worktree_path(
|
|
204
|
+
cleaned_branch, normalized_agent_slug, repo_root,
|
|
205
|
+
)
|
|
191
206
|
create_worktree_branch(
|
|
192
207
|
repo_root,
|
|
193
208
|
branch_name=cleaned_branch,
|
|
@@ -241,8 +256,11 @@ def _require_safe_branch_name(branch_name: str) -> str:
|
|
|
241
256
|
return cleaned_branch
|
|
242
257
|
|
|
243
258
|
|
|
244
|
-
def _allocate_worktree_path(
|
|
245
|
-
|
|
259
|
+
def _allocate_worktree_path(
|
|
260
|
+
branch_name: str, agent_slug: str, repo_root: Path,
|
|
261
|
+
) -> Path:
|
|
262
|
+
agent_worktree_root = resolve_agent_worktree_root(repo_root, agent_slug)
|
|
263
|
+
agent_worktree_root.mkdir(parents=True, exist_ok=True)
|
|
246
264
|
preferred_path = agent_worktree_root / branch_name
|
|
247
265
|
_assert_path_is_under_agent_root(
|
|
248
266
|
candidate_path=preferred_path,
|
|
@@ -324,7 +342,7 @@ def _parse_arguments() -> argparse.Namespace:
|
|
|
324
342
|
parser.add_argument(
|
|
325
343
|
"--agent",
|
|
326
344
|
default=None,
|
|
327
|
-
help="Host label for
|
|
345
|
+
help="Host label for .claude/worktrees/<agent>/ (default: detect from environment).",
|
|
328
346
|
)
|
|
329
347
|
parser.add_argument(
|
|
330
348
|
"--base",
|
package/skills/fresh-branch/scripts/fresh_branch_scripts_constants/fresh_branch_cli_constants.py
CHANGED
|
@@ -23,9 +23,7 @@ ALL_AGENT_DETECTION_MARKERS: tuple[tuple[str, str], ...] = (
|
|
|
23
23
|
PATH_SEGMENT_CURRENT = "."
|
|
24
24
|
PATH_SEGMENT_PARENT = ".."
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
ALL_WINDOWS_USER_SCRATCH_PARTS = ("AppData", "Local", "Temp")
|
|
28
|
-
USERPROFILE_ENV_VAR = "USERPROFILE"
|
|
26
|
+
ALL_REPOSITORY_WORKTREE_ROOT_PARTS = (".claude", "worktrees")
|
|
29
27
|
|
|
30
28
|
MAXIMUM_UNIQUE_PATH_ATTEMPTS = 100
|
|
31
29
|
UNIQUE_PATH_SUFFIX_START = 2
|