claude-dev-env 8.44.0 → 8.44.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-dev-env",
3
- "version": "8.44.0",
3
+ "version": "8.44.1",
4
4
  "description": "Claude Code development standards — rules, hooks, agents, commands, and skills",
5
5
  "type": "module",
6
6
  "bin": {
package/rules/bdd.md CHANGED
@@ -9,6 +9,8 @@ paths:
9
9
 
10
10
  # BDD (discovery-driven development)
11
11
 
12
+ **When:** Starting a non-trivial feature.
13
+
12
14
  For every non-trivial feature, discover what you do not know, illustrate it with concrete examples in chat, formulate each behavior as a narrow "should ..." specification, then build each one through the TDD loop (CODE_RULES §8). Name developer-facing specs and tests as should sentences.
13
15
 
14
16
  **Full text:** [`docs/rule-guides/bdd.md`](../docs/rule-guides/bdd.md), with the long-form BDD references.
@@ -10,6 +10,8 @@ paths:
10
10
 
11
11
  # Code Standards
12
12
 
13
+ **When:** Writing, reviewing, or generating code.
14
+
13
15
  [`CODE_RULES.md`](../docs/CODE_RULES.md) is the review contract for code quality. Load it when you review a pull request, resolve a policy conflict, or generate code. Red, green, refactor is the default loop (CODE_RULES §8). Keep engineering right-sized (CODE_RULES §7).
14
16
 
15
17
  **Enforcement:** the staged policy lint runs `hooks/blocking/code_rules_enforcer.py` over each changed file, and CI runs it against the merge base.
@@ -11,6 +11,8 @@ paths:
11
11
 
12
12
  # Documentation Inventory Integrity
13
13
 
14
+ **When:** Changing code that a document inventories.
15
+
14
16
  A doc that inventories code stays in step with the code, in the same change:
15
17
 
16
18
  1. Every bare filename a per-directory `CLAUDE.md` names in a table cell or a fenced run command exists in its subtree.
@@ -8,6 +8,8 @@ paths:
8
8
 
9
9
  # Windows Filesystem Safety
10
10
 
11
+ **When:** Removing a directory tree or creating a directory in Python or Node.
12
+
11
13
  Call `shutil.rmtree` with an `onexc` (Python 3.12 and later) or `onerror` handler that runs `os.chmod(target_path, stat.S_IWRITE)` and retries. `ignore_errors=True` leaves read-only trees on disk. In Node, call `mkdirSync(targetPath, { recursive: true })` on a path that may exist. Import the shared `force_rmtree` handler trio from its one shared Windows-filesystem module.
12
14
 
13
15
  **Enforcement:** the staged policy lint's `rmtree-safety` rule, which returns the full `force_rmtree` code. CI runs it against the merge base.
@@ -22,6 +22,7 @@ FULL_TEXT_LINK_PATTERN = re.compile(
22
22
  r"^\*\*Full text:\*\*.*?\]\((\.\./docs/rule-guides/[^)#\s]+\.md)\)", re.MULTILINE
23
23
  )
24
24
  TITLE_PATTERN = re.compile(r"^# \S", re.MULTILINE)
25
+ WHEN_LINE_PATTERN = re.compile(r"^\*\*When(?: this applies)?:\*\* \S", re.MULTILINE)
25
26
 
26
27
  MAXIMUM_ENTRY_BYTES = 1_500
27
28
  MAXIMUM_ALWAYS_ON_BYTES = 12_000
@@ -88,6 +89,16 @@ def test_each_entry_opens_with_a_title_after_its_frontmatter() -> None:
88
89
  assert untitled == []
89
90
 
90
91
 
92
+ def test_each_entry_states_when_it_applies() -> None:
93
+ without_when_line = [
94
+ each_path.name
95
+ for each_path in _entry_paths()
96
+ if each_path.name not in POINTER_ENTRY_NAMES | CODEX_VERBATIM_ENTRY_NAMES
97
+ and not WHEN_LINE_PATTERN.search(_entry_text(each_path))
98
+ ]
99
+ assert without_when_line == []
100
+
101
+
91
102
  def _full_text_link_problems(entry_path: Path) -> list[str]:
92
103
  all_guide_names = _linked_guide_names(_entry_text(entry_path))
93
104
  if not all_guide_names: