claude-dev-env 2.4.0 → 2.5.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 +53 -49
- package/_shared/pr-loop/scripts/_claude_permissions_common.py +84 -0
- package/_shared/pr-loop/scripts/code_rules_gate.py +4 -2
- 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/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 +2 -1
- 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 +0 -1
- 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/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/commands/implement.md +1 -1
- package/commands/right-size.md +1 -1
- package/docs/CLAUDE.md +1 -0
- package/docs/host-pool-health-monitor.md +102 -0
- package/docs/references/CLAUDE.md +4 -2
- package/docs/references/advisor-tool.md +13 -0
- package/docs/references/code-review-enforcement.md +10 -0
- package/docs/references/team-advisor-skill.md +14 -0
- package/hooks/blocking/CLAUDE.md +1 -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 +4 -1
- package/hooks/blocking/config/test_code_review_enforcement_constants.py +5 -0
- package/hooks/blocking/config/verified_commit_constants.py +160 -159
- package/hooks/blocking/orchestrator_refresh_reschedule_gate.py +256 -0
- package/hooks/blocking/pre_tool_use_dispatcher.py +24 -24
- 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_orchestrator_refresh_reschedule_gate.py +231 -0
- package/hooks/blocking/test_pre_tool_use_dispatcher.py +10 -1
- package/hooks/blocking/test_verdict_directory_write_blocker.py +808 -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/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/test_pre_push.py +25 -0
- package/hooks/hooks.json +10 -0
- package/hooks/hooks_constants/CLAUDE.md +2 -1
- package/hooks/hooks_constants/enter_worktree_prefetch_constants.py +18 -18
- package/hooks/hooks_constants/orchestrator_refresh_reschedule_gate_constants.py +48 -0
- package/hooks/hooks_constants/ruff_integration_constants.py +16 -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 +10 -2
- package/rules/CLAUDE.md +1 -0
- package/rules/docstring-prose-matches-implementation.md +45 -44
- package/rules/state-what-is.md +25 -0
- package/rules/verified-commit-gate-skip.md +1 -1
- package/scripts/CLAUDE.md +1 -0
- package/scripts/Capture-PoolHealth.ps1 +410 -0
- package/scripts/_code_review_test_support.py +404 -0
- package/scripts/claude_chain_runner.py +141 -1
- 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/resolve_worker_spawn.py +626 -626
- package/scripts/spawn_grok_batch.py +672 -672
- package/scripts/test_claude_chain_runner.py +131 -0
- 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/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 +167 -0
- 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/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 +81 -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/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 +162 -21
- 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 +110 -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/prototype/workflows/promotion.md +1 -1
- package/skills/release-notes-html/SKILL.md +164 -0
- 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/scripts/test_invoke_code_review.py +0 -966
- package/skills/closeout/reference/issue-body-templates.md +0 -108
package/CLAUDE.md
CHANGED
|
@@ -1,84 +1,88 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Development Assistant
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Advisor consultation
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
When the `advisor()` tool is available, reference `~/.claude/docs/references/advisor-tool.md`. For complex tasks, reference `~/.claude/docs/references/team-advisor-skill.md` and use the `/team-advisor` skill.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Communication
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Use direct affirmative framing that states the desired action clearly and positively. Contrastive negation is banned.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Write concise, ADHD-friendly responses.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
- Always say what is, rather than what is not.
|
|
14
|
+
- Lead with the outcome.
|
|
15
|
+
- Use short, active sentences with one idea each.
|
|
16
|
+
- Put meaning before mechanism.
|
|
17
|
+
- Explain jargon on first use.
|
|
18
|
+
- Use plain-claim headings and bold leads.
|
|
19
|
+
- Limit bullets to two sentences and paragraphs to three.
|
|
20
|
+
- Omit repetition, narration, unnecessary options, and trailing notes.
|
|
21
|
+
- End with what the reader must know or decide.
|
|
14
22
|
|
|
15
|
-
##
|
|
23
|
+
## Execution and security
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
For code tasks, execute available steps directly and minimize manual work.
|
|
18
26
|
|
|
19
|
-
|
|
27
|
+
Always execute as many parallel workers as you can, when tasks do not overlap or conflict.
|
|
20
28
|
|
|
21
|
-
|
|
29
|
+
Ask when ambiguity materially changes scope or implementation. Collect credentials through secure UI only; never request secrets in chat.
|
|
22
30
|
|
|
23
|
-
|
|
31
|
+
A runtime value that is itself private — a host, an SSH user or port, an owner scope, an account ID — lives in git-ignored local configuration with a committed placeholder in its place. Source files never carry the real value.
|
|
24
32
|
|
|
25
|
-
##
|
|
33
|
+
## Documentation
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+
Describe only the current system state. Keep documentation self-contained and free of historical, transitional, conversational, or version-transition language. Never use negative prose or antipatterns. Always state what to do, specifically.
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
Follow:
|
|
30
38
|
|
|
31
|
-
|
|
39
|
+
- `~/.claude/rules/no-historical-clutter.md`
|
|
40
|
+
- `~/.claude/rules/self-contained-docs.md`
|
|
41
|
+
- `~/.claude/skills/condensing-instructions/SKILL.md`
|
|
32
42
|
|
|
33
|
-
|
|
43
|
+
## File edits
|
|
34
44
|
|
|
35
|
-
|
|
45
|
+
`Edit` changes an existing file. `Write` creates a new file. Default to `Edit`; reach for `Write` only when the path is genuinely new.
|
|
36
46
|
|
|
37
|
-
|
|
47
|
+
## Files and workspaces
|
|
38
48
|
|
|
39
|
-
|
|
49
|
+
Put all work in an isolated git worktree, created outside the primary checkout.
|
|
40
50
|
|
|
41
|
-
|
|
51
|
+
### Code and tests
|
|
42
52
|
|
|
43
|
-
|
|
44
|
-
2. **Commit-gate preflight** — before spawning `code-verifier`, the branch must be merge-clean vs base and CODE_RULES-clean on added working-tree lines (committed on the branch or uncommitted). The `code_verifier_spawn_preflight_gate` enforces this on Agent/Task spawns with `subagent_type` `code-verifier`; do not spawn the verifier until those gates are green.
|
|
45
|
-
3. **Verification** — the main session spawns the `code-verifier` agent in a fresh context, but you must first verify that their work is based on upstream's origin main (aka: the commit live on github). It derives and runs the checks itself rather than trusting coder reports: the task's named gates, tests against baselines recorded before the coders ran, and a two-way diff-vs-assignment reading (every task item maps to a hunk, every hunk maps to a task item, nothing missing). A finding must cite a failing command or a named task item. Before it emits the verdict, it puts the draft through one strongest-tier validation subagent — selected per the advisor protocol's host detection and tier ladder — that tries to refute it, and it re-checks and corrects any part the validator overturns. Source: the fresh-context review step in Claude Code best practices (https://code.claude.com/docs/en/best-practices) — the agent doing the work isn't the one grading it.
|
|
53
|
+
Tests exercise real behavior, real data, and production paths.
|
|
46
54
|
|
|
47
|
-
|
|
55
|
+
For multi-step code tasks:
|
|
48
56
|
|
|
49
|
-
|
|
57
|
+
- Assign each scope to its own coder agent.
|
|
58
|
+
- A coder consults a tool-less advisor agent when blocked.
|
|
59
|
+
- A fresh-context verifier agent runs named gates, baseline checks, and a two-way task-to-diff review.
|
|
60
|
+
- Repair only reported findings, then re-verify after every repair.
|
|
50
61
|
|
|
51
|
-
|
|
62
|
+
Do not commit, push, or open a PR until verification is clean and the verified-commit gate covers the current diff. The verification requirement is waived only for a non-code diff, or when the Python AST is unchanged after removing docstrings.
|
|
52
63
|
|
|
53
|
-
|
|
64
|
+
Keep changes within scope. Prefer durable systemic fixes for reusable behavior. Do not rewrite entire files or rename public parameters without need.
|
|
54
65
|
|
|
55
|
-
|
|
66
|
+
### Reviews and convergence
|
|
56
67
|
|
|
57
|
-
|
|
68
|
+
Report only findings verified against the code. Verify every sub-agent file list, count, description, and finding against the repository and the diff before using it.
|
|
58
69
|
|
|
59
|
-
|
|
70
|
+
Do not commit untracked files unless explicitly instructed.
|
|
60
71
|
|
|
61
|
-
|
|
72
|
+
### Research and delegation
|
|
62
73
|
|
|
63
|
-
|
|
74
|
+
Delegate fact extraction when multiple files or search patterns are required. Request precise file-and-line answers.
|
|
64
75
|
|
|
65
|
-
|
|
76
|
+
Use fresh parallel subagents, each named for its task, for unrelated questions at whatever effort level the task needs.
|
|
66
77
|
|
|
67
|
-
|
|
78
|
+
Read or search directly only in files you will actually modify this turn. Delegate broader fact-finding to a subagent instead of reading widely yourself.
|
|
68
79
|
|
|
69
|
-
|
|
70
|
-
Before any coding task, call the `initial_instructions` tool to load the Serena Instructions Manual.
|
|
80
|
+
For code navigation, prefer a semantic code-navigation tool (an MCP server such as Serena, when available) or a fast file-search tool (such as Everything's `es.exe` on Windows, when available), then fall back to content search or globbing. Scope every search to a project directory. Never scan an entire drive or network share.
|
|
71
81
|
|
|
72
|
-
###
|
|
73
|
-
- **Symbol declaration** → `mcp__serena__find_declaration`
|
|
74
|
-
- **All references to a symbol** → `mcp__serena__find_referencing_symbols`
|
|
75
|
-
- **Implementations of an interface/class** → `mcp__serena__find_implementations`
|
|
76
|
-
- **Rename across codebase** → `mcp__serena__rename_symbol`
|
|
77
|
-
- **Targeted body replacement / insertion** → `replace_symbol_body`, `insert_after_symbol`, `insert_before_symbol`
|
|
78
|
-
- **Safe symbol removal (no references)** → `mcp__serena__safe_delete_symbol`
|
|
79
|
-
- **File diagnostics** → `mcp__serena__get_diagnostics_for_file`
|
|
82
|
+
### Task tracking
|
|
80
83
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
Track every task with the harness's task tool (TaskCreate/TaskUpdate) or the `task-build` skill: `~/.claude/skills/task-build/SKILL.md`.
|
|
85
|
+
|
|
86
|
+
## Definitions
|
|
87
|
+
|
|
88
|
+
Warm agent: any agent who has acted within the past 30 minutes.
|
|
@@ -18,9 +18,11 @@ from pathlib import Path
|
|
|
18
18
|
from typing import NoReturn
|
|
19
19
|
|
|
20
20
|
from pr_loop_shared_constants.claude_permissions_constants import (
|
|
21
|
+
ALL_INERT_FILE_PERMISSION_TOOLS,
|
|
21
22
|
ALL_TRUST_ENTRY_PROJECT_PATH_BOUNDARY_QUOTE_CHARACTERS,
|
|
22
23
|
CLAUDE_SETTINGS_DIRECTORY_NAME,
|
|
23
24
|
GIT_DIRECTORY_NAME,
|
|
25
|
+
HOME_PROJECT_PATH_ALIAS,
|
|
24
26
|
TEXT_FILE_ENCODING as TEXT_FILE_ENCODING,
|
|
25
27
|
UNIQUE_TEMPORARY_SUFFIX_BYTE_LENGTH,
|
|
26
28
|
)
|
|
@@ -80,6 +82,88 @@ def get_current_project_path() -> str:
|
|
|
80
82
|
return normalized_project_path
|
|
81
83
|
|
|
82
84
|
|
|
85
|
+
def permission_rule_tool_name(permission_rule: object) -> str | None:
|
|
86
|
+
"""Return the tool name prefix of a Claude permission rule, or None.
|
|
87
|
+
|
|
88
|
+
::
|
|
89
|
+
|
|
90
|
+
permission_rule_tool_name("Edit(/repo/.claude/**)") # ok: "Edit"
|
|
91
|
+
permission_rule_tool_name(42) # ok: None
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
permission_rule: A Claude settings allow/deny rule value.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
The tool name before the first ``(``, or None when the value is not a
|
|
98
|
+
well-formed rule string.
|
|
99
|
+
"""
|
|
100
|
+
if not isinstance(permission_rule, str):
|
|
101
|
+
return None
|
|
102
|
+
opening_parenthesis_index = permission_rule.find("(")
|
|
103
|
+
if opening_parenthesis_index <= 0:
|
|
104
|
+
return None
|
|
105
|
+
return permission_rule[:opening_parenthesis_index]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def is_inert_file_permission_rule(permission_rule: object) -> bool:
|
|
109
|
+
"""Return True when a rule uses Write/Glob/NotebookEdit (ignored for files).
|
|
110
|
+
|
|
111
|
+
::
|
|
112
|
+
|
|
113
|
+
is_inert_file_permission_rule("Write(/wt/.claude/**)") # ok: True
|
|
114
|
+
is_inert_file_permission_rule("Edit(/repo/.claude/**)") # ok: False
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
permission_rule: A Claude settings allow/deny rule value.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
True when the rule's tool is in ALL_INERT_FILE_PERMISSION_TOOLS.
|
|
121
|
+
"""
|
|
122
|
+
tool_name = permission_rule_tool_name(permission_rule)
|
|
123
|
+
if tool_name is None:
|
|
124
|
+
return False
|
|
125
|
+
return tool_name in ALL_INERT_FILE_PERMISSION_TOOLS
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def all_project_path_aliases_for_reap(
|
|
129
|
+
project_path: str,
|
|
130
|
+
home_directory_path: str | None = None,
|
|
131
|
+
) -> tuple[str, ...]:
|
|
132
|
+
"""Return project path forms a revoke run should match when removing rules.
|
|
133
|
+
|
|
134
|
+
::
|
|
135
|
+
|
|
136
|
+
all_project_path_aliases_for_reap("/repo") # ok: ("/repo",)
|
|
137
|
+
all_project_path_aliases_for_reap("/home/u", home_directory_path="/home/u")
|
|
138
|
+
# ok: ("/home/u", "$HOME")
|
|
139
|
+
|
|
140
|
+
Always includes the absolute POSIX project path. When that path is the
|
|
141
|
+
user home directory, also includes ``$HOME`` so grant shapes like
|
|
142
|
+
``Edit($HOME/.claude/**)`` are reaped from home cwd.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
project_path: POSIX-style project root path from get_current_project_path.
|
|
146
|
+
home_directory_path: Optional home path for tests; defaults to Path.home().
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Ordered unique path aliases used when building project-scoped remove rules.
|
|
150
|
+
"""
|
|
151
|
+
normalized_project_path = project_path.replace("\\", "/").rstrip("/")
|
|
152
|
+
resolved_home_directory_path = (
|
|
153
|
+
home_directory_path
|
|
154
|
+
if home_directory_path is not None
|
|
155
|
+
else str(Path.home())
|
|
156
|
+
).replace("\\", "/").rstrip("/")
|
|
157
|
+
all_path_aliases: list[str] = [normalized_project_path]
|
|
158
|
+
if normalized_project_path.lower() == resolved_home_directory_path.lower():
|
|
159
|
+
all_path_aliases.append(HOME_PROJECT_PATH_ALIAS)
|
|
160
|
+
all_unique_path_aliases: list[str] = []
|
|
161
|
+
for each_path_alias in all_path_aliases:
|
|
162
|
+
if each_path_alias not in all_unique_path_aliases:
|
|
163
|
+
all_unique_path_aliases.append(each_path_alias)
|
|
164
|
+
return tuple(all_unique_path_aliases)
|
|
165
|
+
|
|
166
|
+
|
|
83
167
|
def build_permission_rule(tool_name: str, project_path: str) -> str:
|
|
84
168
|
return f"{tool_name}({project_path}/.claude/**)"
|
|
85
169
|
|
|
@@ -296,8 +296,9 @@ def _run_diff_mode(
|
|
|
296
296
|
"""Validate the merge-base diff joined with the untracked files.
|
|
297
297
|
|
|
298
298
|
Zero candidates means nothing was inspected (bad wiring looks the same),
|
|
299
|
-
so that run refuses loudly. A set emptied
|
|
300
|
-
|
|
299
|
+
so that run refuses loudly. A set emptied by the ``--only-under`` scope or
|
|
300
|
+
left with no code files after the code-path filter flows through
|
|
301
|
+
``run_gate`` over zero files and exits clean.
|
|
301
302
|
"""
|
|
302
303
|
all_candidate_paths = _deduplicate_paths(
|
|
303
304
|
paths_from_git_diff(repository_root, arguments.base)
|
|
@@ -308,6 +309,7 @@ def _run_diff_mode(
|
|
|
308
309
|
file_paths = filter_paths_under_prefixes(
|
|
309
310
|
all_candidate_paths, repository_root, arguments.only_under
|
|
310
311
|
)
|
|
312
|
+
file_paths = [each_path for each_path in file_paths if is_code_path(each_path)]
|
|
311
313
|
scoped_added_lines = (
|
|
312
314
|
added_lines_by_file(repository_root, arguments.base, file_paths) if file_paths else {}
|
|
313
315
|
)
|