claude-dev-env 8.65.0 → 8.65.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.
Files changed (163) hide show
  1. package/.agents/skills/grok-spawn/SKILL.md +5 -54
  2. package/.agents/skills/grok-spawn/reference/batch-spec.md +49 -0
  3. package/.agents/skills/orchestrator/test_orchestrator_skill_contract.py +0 -2
  4. package/.agents/skills/pull-request/SKILL.md +5 -49
  5. package/.agents/skills/pull-request/reference/examples.md +13 -0
  6. package/.agents/skills/pull-request/reference/legacy-author-recovery.md +11 -0
  7. package/bin/install.settings-defaults.test.mjs +1 -1
  8. package/docs/references/working-style.md +40 -0
  9. package/hooks/hooks_constants/working_style_prompt_constants.py +6 -35
  10. package/hooks/session/test_working_style_prompt.py +19 -32
  11. package/hooks/session/working_style_prompt.py +3 -6
  12. package/package.json +1 -1
  13. package/scripts/tests/test_rule_load_scopes.py +0 -2
  14. package/settings.json +2 -1
  15. package/.agents/skills/.claude/CLAUDE.md +0 -1
  16. package/.agents/skills/AGENTS.md +0 -1
  17. package/.agents/skills/_shared/.claude/CLAUDE.md +0 -1
  18. package/.agents/skills/_shared/AGENTS.md +0 -1
  19. package/.agents/skills/_shared/advisor/.claude/CLAUDE.md +0 -1
  20. package/.agents/skills/_shared/advisor/AGENTS.md +0 -1
  21. package/.agents/skills/everything-search/.claude/CLAUDE.md +0 -1
  22. package/.agents/skills/everything-search/AGENTS.md +0 -1
  23. package/.agents/skills/fresh-branch/.claude/CLAUDE.md +0 -1
  24. package/.agents/skills/fresh-branch/AGENTS.md +0 -1
  25. package/.agents/skills/grok-spawn/.claude/CLAUDE.md +0 -1
  26. package/.agents/skills/grok-spawn/AGENTS.md +0 -1
  27. package/.agents/skills/orchestrator/.claude/CLAUDE.md +0 -1
  28. package/.agents/skills/orchestrator/AGENTS.md +0 -1
  29. package/.agents/skills/orchestrator/reference/.claude/CLAUDE.md +0 -1
  30. package/.agents/skills/orchestrator/reference/AGENTS.md +0 -1
  31. package/.agents/skills/second-account-workers/.claude/CLAUDE.md +0 -1
  32. package/.agents/skills/second-account-workers/AGENTS.md +0 -1
  33. package/.agents/skills/skill-builder/.claude/CLAUDE.md +0 -1
  34. package/.agents/skills/skill-builder/AGENTS.md +0 -1
  35. package/.agents/skills/task-build/.claude/CLAUDE.md +0 -1
  36. package/.agents/skills/task-build/AGENTS.md +0 -1
  37. package/.agents/skills-archived/AGENTS.md +0 -1
  38. package/.agents/skills-archived/anthropic-plan/.claude/CLAUDE.md +0 -1
  39. package/.agents/skills-archived/anthropic-plan/AGENTS.md +0 -1
  40. package/.agents/skills-archived/anthropic-plan/scripts/.claude/CLAUDE.md +0 -1
  41. package/.agents/skills-archived/anthropic-plan/scripts/AGENTS.md +0 -1
  42. package/.agents/skills-archived/anthropic-plan/scripts/anthropic_plan_scripts_constants/.claude/CLAUDE.md +0 -1
  43. package/.agents/skills-archived/anthropic-plan/scripts/anthropic_plan_scripts_constants/AGENTS.md +0 -1
  44. package/.agents/skills-archived/anthropic-plan/templates/.claude/CLAUDE.md +0 -1
  45. package/.agents/skills-archived/anthropic-plan/templates/AGENTS.md +0 -1
  46. package/.agents/skills-archived/anthropic-plan/workflow/.claude/CLAUDE.md +0 -1
  47. package/.agents/skills-archived/anthropic-plan/workflow/AGENTS.md +0 -1
  48. package/.agents/skills-archived/auditing-claude-config/.claude/CLAUDE.md +0 -1
  49. package/.agents/skills-archived/auditing-claude-config/AGENTS.md +0 -1
  50. package/.agents/skills-archived/bugteam/.claude/CLAUDE.md +0 -1
  51. package/.agents/skills-archived/bugteam/AGENTS.md +0 -1
  52. package/.agents/skills-archived/bugteam/reference/.claude/CLAUDE.md +0 -1
  53. package/.agents/skills-archived/bugteam/reference/AGENTS.md +0 -1
  54. package/.agents/skills-archived/bugteam/reference/obstacles/.claude/CLAUDE.md +0 -1
  55. package/.agents/skills-archived/bugteam/reference/obstacles/AGENTS.md +0 -1
  56. package/.agents/skills-archived/bugteam/scripts/.claude/CLAUDE.md +0 -1
  57. package/.agents/skills-archived/bugteam/scripts/AGENTS.md +0 -1
  58. package/.agents/skills-archived/bugteam/scripts/bugteam_scripts_constants/.claude/CLAUDE.md +0 -1
  59. package/.agents/skills-archived/bugteam/scripts/bugteam_scripts_constants/AGENTS.md +0 -1
  60. package/.agents/skills-archived/codex-review/.claude/CLAUDE.md +0 -1
  61. package/.agents/skills-archived/codex-review/AGENTS.md +0 -1
  62. package/.agents/skills-archived/codex-review/reference/.claude/CLAUDE.md +0 -1
  63. package/.agents/skills-archived/codex-review/reference/AGENTS.md +0 -1
  64. package/.agents/skills-archived/codex-review/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -1
  65. package/.agents/skills-archived/codex-review/scripts/codex_review_scripts_constants/AGENTS.md +0 -1
  66. package/.agents/skills-archived/copilot-review/.claude/CLAUDE.md +0 -1
  67. package/.agents/skills-archived/copilot-review/AGENTS.md +0 -1
  68. package/.agents/skills-archived/pr-converge/.claude/CLAUDE.md +0 -1
  69. package/.agents/skills-archived/pr-converge/AGENTS.md +0 -1
  70. package/.agents/skills-archived/pr-converge/pr_converge_skill_constants/.claude/CLAUDE.md +0 -1
  71. package/.agents/skills-archived/pr-converge/pr_converge_skill_constants/AGENTS.md +0 -1
  72. package/.agents/skills-archived/pr-converge/reference/.claude/CLAUDE.md +0 -1
  73. package/.agents/skills-archived/pr-converge/reference/AGENTS.md +0 -1
  74. package/.agents/skills-archived/pr-converge/reference/obstacles/.claude/CLAUDE.md +0 -1
  75. package/.agents/skills-archived/pr-converge/reference/obstacles/AGENTS.md +0 -1
  76. package/.agents/skills-archived/pr-converge/scripts/.claude/CLAUDE.md +0 -1
  77. package/.agents/skills-archived/pr-converge/scripts/AGENTS.md +0 -1
  78. package/.agents/skills-archived/pr-converge/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -1
  79. package/.agents/skills-archived/pr-converge/scripts/pr_converge_scripts_constants/AGENTS.md +0 -1
  80. package/.agents/skills-archived/pr-converge/workflows/.claude/CLAUDE.md +0 -1
  81. package/.agents/skills-archived/pr-converge/workflows/AGENTS.md +0 -1
  82. package/.agents/skills-archived/recall/.claude/CLAUDE.md +0 -1
  83. package/.agents/skills-archived/recall/AGENTS.md +0 -1
  84. package/.agents/skills-archived/remember/.claude/CLAUDE.md +0 -1
  85. package/.agents/skills-archived/remember/AGENTS.md +0 -1
  86. package/_shared/AGENTS.md +0 -1
  87. package/_shared/CLAUDE.md +0 -1
  88. package/_shared/advisor/AGENTS.md +0 -1
  89. package/_shared/advisor/CLAUDE.md +0 -1
  90. package/_shared/pr-loop/scripts/AGENTS.md +0 -1
  91. package/_shared/pr-loop/scripts/CLAUDE.md +0 -1
  92. package/_shared/pr-loop/scripts/code_rules_gate_parts/AGENTS.md +0 -1
  93. package/_shared/pr-loop/scripts/code_rules_gate_parts/CLAUDE.md +0 -1
  94. package/_shared/pr-loop/scripts/codex_review_scripts_constants/.claude/CLAUDE.md +0 -1
  95. package/_shared/pr-loop/scripts/codex_review_scripts_constants/AGENTS.md +0 -1
  96. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/.claude/CLAUDE.md +0 -1
  97. package/_shared/pr-loop/scripts/pr_converge_scripts_constants/AGENTS.md +0 -1
  98. package/_shared/pr-loop/scripts/pr_converge_skill_constants/.claude/CLAUDE.md +0 -1
  99. package/_shared/pr-loop/scripts/pr_converge_skill_constants/AGENTS.md +0 -1
  100. package/_shared/pr-loop/scripts/pr_loop_shared_constants/AGENTS.md +0 -1
  101. package/_shared/pr-loop/scripts/pr_loop_shared_constants/CLAUDE.md +0 -1
  102. package/_shared/pr-loop/scripts/tests/AGENTS.md +0 -1
  103. package/_shared/pr-loop/scripts/tests/CLAUDE.md +0 -1
  104. package/_shared/process-tree/AGENTS.md +0 -1
  105. package/_shared/process-tree/CLAUDE.md +0 -1
  106. package/audit-rubrics/AGENTS.md +0 -1
  107. package/audit-rubrics/CLAUDE.md +0 -1
  108. package/audit-rubrics/category_rubrics/AGENTS.md +0 -1
  109. package/audit-rubrics/category_rubrics/CLAUDE.md +0 -1
  110. package/audit-rubrics/prompts/AGENTS.md +0 -1
  111. package/audit-rubrics/prompts/CLAUDE.md +0 -1
  112. package/bin/AGENTS.md +0 -1
  113. package/bin/CLAUDE.md +0 -1
  114. package/commands/AGENTS.md +0 -1
  115. package/commands/CLAUDE.md +0 -1
  116. package/docs/AGENTS.md +0 -1
  117. package/docs/CLAUDE.md +0 -1
  118. package/docs/references/AGENTS.md +0 -1
  119. package/docs/references/CLAUDE.md +0 -1
  120. package/hooks/advisory/AGENTS.md +0 -1
  121. package/hooks/advisory/CLAUDE.md +0 -1
  122. package/hooks/blocking/AGENTS.md +0 -1
  123. package/hooks/blocking/CLAUDE.md +0 -1
  124. package/hooks/blocking/claude_md_orphan_file_blocker_parts/AGENTS.md +0 -1
  125. package/hooks/blocking/claude_md_orphan_file_blocker_parts/CLAUDE.md +0 -1
  126. package/hooks/blocking/config/AGENTS.md +0 -1
  127. package/hooks/blocking/config/CLAUDE.md +0 -1
  128. package/hooks/blocking/inventory_intent_records/AGENTS.md +0 -1
  129. package/hooks/blocking/inventory_intent_records/CLAUDE.md +0 -1
  130. package/hooks/blocking/package_inventory_stale_blocker_parts/AGENTS.md +0 -1
  131. package/hooks/blocking/package_inventory_stale_blocker_parts/CLAUDE.md +0 -1
  132. package/hooks/blocking/pii_prevention_blocker_parts/AGENTS.md +0 -1
  133. package/hooks/blocking/pii_prevention_blocker_parts/CLAUDE.md +0 -1
  134. package/hooks/blocking/tdd_enforcer_parts/AGENTS.md +0 -1
  135. package/hooks/blocking/tdd_enforcer_parts/CLAUDE.md +0 -1
  136. package/hooks/git-hooks/AGENTS.md +0 -1
  137. package/hooks/git-hooks/CLAUDE.md +0 -1
  138. package/hooks/git-hooks/git_hooks_constants/AGENTS.md +0 -1
  139. package/hooks/git-hooks/git_hooks_constants/CLAUDE.md +0 -1
  140. package/hooks/hooks_constants/AGENTS.md +0 -1
  141. package/hooks/hooks_constants/CLAUDE.md +0 -1
  142. package/hooks/lifecycle/AGENTS.md +0 -1
  143. package/hooks/lifecycle/CLAUDE.md +0 -1
  144. package/hooks/observability/AGENTS.md +0 -1
  145. package/hooks/observability/CLAUDE.md +0 -1
  146. package/hooks/session/AGENTS.md +0 -1
  147. package/hooks/session/CLAUDE.md +0 -1
  148. package/hooks/validation/AGENTS.md +0 -1
  149. package/hooks/validation/CLAUDE.md +0 -1
  150. package/hooks/validators/AGENTS.md +0 -1
  151. package/hooks/validators/CLAUDE.md +0 -1
  152. package/hooks/workflow/AGENTS.md +0 -1
  153. package/hooks/workflow/CLAUDE.md +0 -1
  154. package/rules/AGENTS.md +0 -1
  155. package/rules/CLAUDE.md +0 -1
  156. package/scripts/AGENTS.md +0 -1
  157. package/scripts/CLAUDE.md +0 -1
  158. package/scripts/dev_env_scripts_constants/AGENTS.md +0 -1
  159. package/scripts/dev_env_scripts_constants/CLAUDE.md +0 -1
  160. package/scripts/tests/AGENTS.md +0 -1
  161. package/scripts/tests/CLAUDE.md +0 -1
  162. package/system-prompts/AGENTS.md +0 -1
  163. package/system-prompts/CLAUDE.md +0 -1
@@ -108,54 +108,10 @@ Flag sets and profile meaning:
108
108
 
109
109
  ### 3. Write the batch JSON spec
110
110
 
111
- Shape:
112
-
113
- ```json
114
- {
115
- "role": "bugteam",
116
- "should_ping": false,
117
- "workers": [
118
- {
119
- "role_name": "investigate-hooks",
120
- "prompt_parts": [
121
- "/abs/path/to/readonly-brief.md",
122
- "/abs/path/to/task-body.md",
123
- "/abs/path/to/report-contract.md"
124
- ],
125
- "cwd": "/abs/path/to/worktree",
126
- "tool_profile": "readonly",
127
- "timeout_seconds": 600,
128
- "is_repo_only": true,
129
- "agent_name": "poteto-agent"
130
- }
131
- ]
132
- }
133
- ```
134
-
135
- | Field | Meaning |
136
- |---|---|
137
- | `role` | Preflight role configuration to check (default `bugteam`) |
138
- | `should_ping` | When true, preflight runs the opt-in live ping |
139
- | `workers` | Non-empty list of worker objects |
140
- | `role_name` | Label on the summary report for this worker |
141
- | `prompt_parts` | Ordered absolute paths to part files |
142
- | `cwd` | Working directory for that worker |
143
- | `tool_profile` | `readonly` or `build` |
144
- | `timeout_seconds` | Per-worker timeout (default 600, ceiling 5400). A spec asking for more is refused |
145
- | `is_repo_only` | Readonly only: when true, also pass `--disable-web-search` |
146
- | `agent_name` | Use `poteto-agent`; prompts carry the worker role. |
147
-
148
- Workers run with no turn cap. The timeout is the only bound on a worker's
149
- length, and a worker that hits it is killed with its whole process tree and
150
- reported as `timeout`.
151
-
152
- A worker entry accepts these fields and no others. Any other key fails the
153
- load with an error naming the stray key and listing the accepted set, so a
154
- misspelled field shows up at startup rather than passing for a setting that
155
- took effect.
156
-
157
- Put the spec file under the run state directory (or any path you pass to
158
- `--spec`).
111
+ Write the spec from the shape and field table in
112
+ [`reference/batch-spec.md`](reference/batch-spec.md). A worker entry accepts
113
+ only the listed fields. Put the spec file under the run state directory (or any
114
+ path you pass to `--spec`).
159
115
 
160
116
  ### 4. Launch the batch
161
117
 
@@ -222,14 +178,9 @@ Build workers stop at stage-ready edits and a written report. They do not run
222
178
  | File | Purpose |
223
179
  |---|---|
224
180
  | `SKILL.md` | Trigger, gotchas, process, batch shape, composition |
225
- | `CLAUDE.md` | Package map for this skill folder |
226
181
  | `reference/worker-briefs.md` | Readonly brief, build brief, report contract templates |
227
182
  | `reference/flag-profiles.md` | Readonly vs build flags, shared flags, socket and stagger rules |
228
-
229
- ## Folder map
230
-
231
- - `SKILL.md` — hub and process.
232
- - `reference/` — brief templates and flag profiles.
183
+ | `reference/batch-spec.md` | Batch JSON spec shape and worker fields |
233
184
 
234
185
  ## Worker advisors
235
186
 
@@ -0,0 +1,49 @@
1
+ # Batch JSON spec
2
+
3
+ Shape:
4
+
5
+ ```json
6
+ {
7
+ "role": "bugteam",
8
+ "should_ping": false,
9
+ "workers": [
10
+ {
11
+ "role_name": "investigate-hooks",
12
+ "prompt_parts": [
13
+ "/abs/path/to/readonly-brief.md",
14
+ "/abs/path/to/task-body.md",
15
+ "/abs/path/to/report-contract.md"
16
+ ],
17
+ "cwd": "/abs/path/to/worktree",
18
+ "tool_profile": "readonly",
19
+ "timeout_seconds": 600,
20
+ "is_repo_only": true,
21
+ "agent_name": "poteto-agent"
22
+ }
23
+ ]
24
+ }
25
+ ```
26
+
27
+ | Field | Meaning |
28
+ |---|---|
29
+ | `role` | Preflight role configuration to check (default `bugteam`) |
30
+ | `should_ping` | When true, preflight runs the opt-in live ping |
31
+ | `workers` | Non-empty list of worker objects |
32
+ | `role_name` | Label on the summary report for this worker |
33
+ | `prompt_parts` | Ordered absolute paths to part files |
34
+ | `cwd` | Working directory for that worker |
35
+ | `tool_profile` | `readonly` or `build` |
36
+ | `timeout_seconds` | Per-worker timeout (default 600, ceiling 5400). A spec asking for more is refused |
37
+ | `is_repo_only` | Readonly only: when true, also pass `--disable-web-search` |
38
+ | `agent_name` | Use `poteto-agent`; prompts carry the worker role. |
39
+
40
+ Workers run with no turn cap. The timeout is the only bound on a worker's
41
+ length, and a worker that hits it is killed with its whole process tree and
42
+ reported as `timeout`.
43
+
44
+ A worker entry accepts these fields and no others. Any other key fails the
45
+ load with an error naming the stray key and listing the accepted set, so a
46
+ misspelled field fails at startup.
47
+
48
+ Put the spec file under the run state directory (or any path you pass to
49
+ `--spec`).
@@ -7,11 +7,9 @@ _SKILL_DIR = Path(__file__).resolve().parent
7
7
  _REFRESH_PATH = _SKILL_DIR.parent / "orchestrator-refresh" / "SKILL.md"
8
8
  _ORCHESTRATOR_PATHS = (
9
9
  _SKILL_DIR / "SKILL.md",
10
- _SKILL_DIR / "AGENTS.md",
11
10
  _SKILL_DIR / "reference" / "consult-the-orchestrator.md",
12
11
  _SKILL_DIR / "reference" / "executor-consult-block.md",
13
12
  _SKILL_DIR / "reference" / "host-detect.md",
14
- _SKILL_DIR / "reference" / "AGENTS.md",
15
13
  _REFRESH_PATH,
16
14
  )
17
15
  _FOREIGN_MARKERS = (
@@ -8,21 +8,6 @@ description: >-
8
8
 
9
9
  # Pull request
10
10
 
11
- ## Contents
12
-
13
- - [Principle](#principle)
14
- - [When this applies](#when-this-applies)
15
- - [Constraints](#constraints)
16
- - [Dependencies](#dependencies)
17
- - [Sub-skills](#sub-skills)
18
- - [Task seeding](#task-seeding)
19
- - [Process](#process)
20
- - [Exit handling](#exit-handling)
21
- - [Examples](#examples)
22
- - [Gotchas](#gotchas)
23
- - [File index](#file-index)
24
- - [Folder map](#folder-map)
25
-
26
11
  ## Principle
27
12
 
28
13
  Publish one GitHub pull request action from validated local files and a
@@ -151,12 +136,8 @@ failure. Never print the value.
151
136
 
152
137
  ### 6. Recover a selected legacy record
153
138
 
154
- Run `.agents/skills/pull-request/scripts/recover_legacy_author.py
155
- <exact-state-file> --confirm-inactive` only when the user selects one legacy
156
- state file. The command checks the record's age, secure file metadata, and
157
- contents. The confirmation flag records that the caller verified inactivity.
158
- Leave every other record untouched. Delete the selected record only after a
159
- successful restore. Mark this step `N/A` when no legacy state file is selected.
139
+ Follow `reference/legacy-author-recovery.md` only when the user selects one
140
+ legacy state file. Mark this step `N/A` otherwise.
160
141
 
161
142
  ### 7. Run the action
162
143
 
@@ -185,24 +166,12 @@ only after remote readback proves the requested state.
185
166
 
186
167
  ## Examples
187
168
 
188
- Create example: the writer produces `pr-body.md`. The linter exits `0` for
189
- `pr-create`. `pull_request.py create` publishes one ready pull request. The
190
- readback matches the title, body, head SHA, and draft state.
191
-
192
- Rejected comment example: the comment body names a worktree file. The linter
193
- returns a non-zero exit. No account lookup or GitHub request runs. Replace the
194
- path with inline text or a permanent artifact URL, then rerun.
195
-
196
- Recovery example: one old record remains after an interrupted legacy account
197
- swap. The user selects that exact file and confirms its session is inactive.
198
- The recovery command restores the named account and deletes only that record.
169
+ Read `reference/examples.md` for a create, a rejected comment, and a recovery.
199
170
 
200
171
  ## Gotchas
201
172
 
202
173
  - Relative body-file paths depend on the caller directory. Use an absolute path
203
174
  when another process or worktree starts the command.
204
- - A record older than 30 minutes can still belong to a live session. Require
205
- `--confirm-inactive` before recovery.
206
175
  - Normal pull request actions never call `gh auth switch`. If that command
207
176
  appears outside explicit recovery, stop.
208
177
  - `gh auth switch`, `login`, and `logout` change the account for every session
@@ -217,6 +186,8 @@ The recovery command restores the named account and deletes only that record.
217
186
  |---|---|
218
187
  | `SKILL.md` | Hub for pull request publication, validation, author selection, recovery, and readback |
219
188
  | `reference/publication-tasks.md` | Ordered tasks for every publication gate |
189
+ | `reference/legacy-author-recovery.md` | Recovery of one selected legacy author record |
190
+ | `reference/examples.md` | Worked create, rejected comment, and recovery examples |
220
191
  | `scripts/pull_request.py` | Command for author selection and create, edit, comment, and review actions |
221
192
  | `scripts/github_pr_command_constants/` | Constants for pull request actions, recovery, exit codes, and generic messages |
222
193
  | `scripts/test_pull_request.py` | Tests for `pull_request.py` |
@@ -226,18 +197,3 @@ The recovery command restores the named account and deletes only that record.
226
197
  | `<managed-root>/scripts/durable_post_lint.py` | Shared action-aware title, body, and path validator |
227
198
  | `scripts/gh_artifact_upload.py` | Helper for permanent GitHub binary evidence URLs |
228
199
  | `scripts/tests/test_gh_artifact_upload.py` | Tests for binary evidence upload |
229
-
230
- ## Folder map
231
-
232
- ```text
233
- pull-request/
234
- ├── SKILL.md
235
- ├── reference/
236
- │ └── publication-tasks.md
237
- └── scripts/
238
- ├── pull_request.py
239
- ├── github_pr_command_constants/
240
- ├── recover_legacy_author.py
241
- ├── test_pull_request.py
242
- └── test_recover_legacy_author.py
243
- ```
@@ -0,0 +1,13 @@
1
+ # Pull request examples
2
+
3
+ Create example: the writer produces `pr-body.md`. The linter exits `0` for
4
+ `pr-create`. `pull_request.py create` publishes one ready pull request. The
5
+ readback matches the title, body, head SHA, and draft state.
6
+
7
+ Rejected comment example: the comment body names a worktree file. The linter
8
+ returns a non-zero exit. No account lookup or GitHub request runs. Replace the
9
+ path with inline text or a permanent artifact URL, then rerun.
10
+
11
+ Recovery example: one old record remains after an interrupted legacy account
12
+ swap. The user selects that exact file and confirms its session is inactive.
13
+ The recovery command restores the named account and deletes only that record.
@@ -0,0 +1,11 @@
1
+ # Recover a selected legacy author record
2
+
3
+ Run `.agents/skills/pull-request/scripts/recover_legacy_author.py
4
+ <exact-state-file> --confirm-inactive` only when the user selects one legacy
5
+ state file. The command checks the record's age, secure file metadata, and
6
+ contents. The confirmation flag records that the caller verified inactivity.
7
+ Leave every other record untouched. Delete the selected record only after a
8
+ successful restore.
9
+
10
+ A record older than 30 minutes can still belong to a live session. Require
11
+ `--confirm-inactive` before recovery.
@@ -32,7 +32,7 @@ const PACKAGE_SETTINGS_PATH = join(PACKAGE_ROOT, 'settings.json');
32
32
  const INSTALL_ENTRY = join(PACKAGE_ROOT, 'bin', 'install.mjs');
33
33
 
34
34
  const EXPECTED_DENY_ENTRIES = [];
35
- const EXPECTED_ALLOW_ENTRIES = ['WebFetch(domain:docs.github.com)'];
35
+ const EXPECTED_ALLOW_ENTRIES = ['WebFetch(domain:docs.github.com)', 'Read(~/.claude/docs/**)'];
36
36
  const PROFILE_ALLOW_ENTRIES = DECLARED_PROFILE_SETTINGS
37
37
  .find((eachEntry) => eachEntry.keyPath.join('.') === 'permissions.allow').items;
38
38
  const SAMPLE_MANAGED_DENY_ENTRIES = ['Edit($HOME/.claude/managed-test/**)'];
@@ -0,0 +1,40 @@
1
+ # Working style
2
+
3
+ The SessionStart hook `hooks/session/working_style_prompt.py` points every session here. Read this file once, before your first reply.
4
+
5
+ ## Records
6
+
7
+ - Document each task in a location that remains easy to find later.
8
+ - Keep a running scratch text ledger as you work.
9
+
10
+ ## Presentation
11
+
12
+ - Use ELI5 for beginner framing, large visuals, minimal text, one stable self-contained HTML artifact, update-in-place continuity, and sharing when a user-facing response needs that presentation.
13
+ - Apply `~/.claude/rules/asd-ste100-language.md` for user-facing word choice, sentence style, tone, punctuation, and prose form.
14
+ - Keep responses focused, brief, and concise. Keep disclaimers and caveats short while giving the main answer most of the response.
15
+ - Give a high-level explanation by default and provide depth when the request calls for it.
16
+ - Match written-document length to the task. Cover the substance and keep every section, summary, and phrase useful.
17
+ - Use current, immediately relevant context. Use full terms and specific names for repository work. Keep all text concise, clear, direct, and useful.
18
+
19
+ ## Replies
20
+
21
+ - On a typed request, state your next action in one sentence before the first tool call.
22
+ - Finish with the outcome in the first sentence.
23
+ - Send the user only what they must act on or need to know.
24
+ - When a background event, such as a task notification, an agent message, or a scheduled wake, starts a turn and nothing in it needs the user, end the turn with no text.
25
+ - A report that a fix is done carries three lines: the fix acknowledged, what changed, and the proof that it works. Put the rest of the detail in the pull request or a linked file.
26
+
27
+ ## Scope
28
+
29
+ - Deliver the requested work at its intended scope. Make routine judgment calls yourself.
30
+ - Ask for direction when different interpretations would produce materially different work.
31
+ - When a request seems mistaken or a better approach exists, state the concern briefly and continue with the requested task.
32
+ - A request to remove something is complete once it is gone. Put nothing in its place, and pass a replacement idea to the requester as a question.
33
+ - Finish the complete task and keep actions within the requested scope.
34
+
35
+ ## Questions
36
+
37
+ - When a request has multiple reasonable interpretations, state your understanding and the assumptions that shape the work.
38
+ - Ask one focused clarification question when the ambiguity changes the outcome, scope, audience, format, or risk.
39
+ - Use a clearly stated low-risk assumption when the intended result remains stable.
40
+ - Pause for the user's choice before making a high-impact decision.
@@ -3,43 +3,14 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  __all__ = [
6
+ "WORKING_STYLE_GUIDE_RELATIVE_PATH",
6
7
  "WORKING_STYLE_PROMPT",
7
8
  ]
8
9
 
10
+ WORKING_STYLE_GUIDE_RELATIVE_PATH = "docs/references/working-style.md"
11
+
9
12
  WORKING_STYLE_PROMPT = (
10
- "Document each task in a location that remains easy to find later. Keep a "
11
- "running scratch text ledger as you work. Use ELI5 for beginner framing, large "
12
- "visuals, minimal text, one stable self-contained HTML artifact, update-in-place "
13
- "continuity, and sharing when a user-facing response needs that presentation. "
14
- "Keep responses focused, brief, and concise. Apply ~/.claude/rules/asd-ste100-language.md for "
15
- "user-facing word choice, sentence style, tone, punctuation, and prose form. "
16
- "Keep disclaimers and caveats short while giving "
17
- "the main answer most of the response. Give a high-level explanation by default "
18
- "and provide depth when the request calls for it. "
19
- "On a typed request, state your next action in one sentence before the first "
20
- "tool call. "
21
- "Finish with the outcome in the first sentence. "
22
- "Send the user only what they must act on or need to know. When a background "
23
- "event, such as a task notification, an agent message, or a scheduled wake, "
24
- "starts a turn and nothing in it needs the user, end the turn with no text. A "
25
- "report that a fix is done carries three lines: the fix acknowledged, what "
26
- "changed, and the proof that it works. Put the rest of the detail in the pull "
27
- "request or a linked file. "
28
- "Match written-document length to the task. Cover the substance and keep every "
29
- "section, summary, and phrase useful. "
30
- "Deliver the requested work at its intended scope. Make routine judgment calls "
31
- "yourself. Ask for direction when different interpretations would produce "
32
- "materially different work. When a request seems mistaken or a better approach "
33
- "exists, state the concern briefly and continue with the requested task. "
34
- "A request to remove something is complete once it is gone. Put nothing in its "
35
- "place, and pass a replacement idea to the requester as a question. Finish "
36
- "the complete task and keep actions within the requested scope. "
37
- "When a request has multiple reasonable interpretations, state your understanding "
38
- "and the assumptions that shape the work. Ask one focused clarification question "
39
- "when the ambiguity changes the outcome, scope, audience, format, or risk. Use a "
40
- "clearly stated low-risk assumption when the intended result remains stable. "
41
- "Pause for the user's choice before making a high-impact decision. "
42
- "Use current, immediately relevant context. "
43
- "Use full terms and specific names for repository work. Keep all "
44
- "text concise, clear, direct, and useful."
13
+ f"Read ~/.claude/{WORKING_STYLE_GUIDE_RELATIVE_PATH} before your first reply. "
14
+ "It sets how you keep task records, present answers, reply, hold scope, and "
15
+ "ask questions."
45
16
  )
@@ -15,9 +15,12 @@ for each_sys_path_entry in (str(_SESSION_DIR), str(_HOOKS_ROOT)):
15
15
  import working_style_prompt as starter
16
16
 
17
17
  from hooks_constants.working_style_prompt_constants import (
18
+ WORKING_STYLE_GUIDE_RELATIVE_PATH,
18
19
  WORKING_STYLE_PROMPT,
19
20
  )
20
21
 
22
+ WORKING_STYLE_GUIDE_PATH = _HOOKS_ROOT.parent / WORKING_STYLE_GUIDE_RELATIVE_PATH
23
+
21
24
 
22
25
  def _run_main() -> str:
23
26
  """Return stdout produced by running the hook's main()."""
@@ -38,38 +41,22 @@ class TestWorkingStylePrompt:
38
41
  emitted = json.loads(_run_main())
39
42
  assert emitted["hookSpecificOutput"]["additionalContext"] == WORKING_STYLE_PROMPT
40
43
 
41
- def test_emitted_prompt_contains_canonical_policy_and_scope_guidance(self) -> None:
42
- emitted = json.loads(_run_main())
43
- prompt_text = emitted["hookSpecificOutput"]["additionalContext"]
44
- assert "Document each task in a location that remains easy to find later." in prompt_text
45
- assert "Deliver the requested work at its intended scope." in prompt_text
46
- assert "A request to remove something is complete once it is gone." in prompt_text
47
- assert "pass a replacement idea to the requester as a question." in prompt_text
48
- assert "Use ELI5 for beginner framing, large visuals, minimal text" in prompt_text
49
- assert "one stable self-contained HTML artifact" in prompt_text
50
- assert "update-in-place continuity, and sharing" in prompt_text
51
- assert "Apply ~/.claude/rules/asd-ste100-language.md for user-facing word choice" in prompt_text
52
- assert "Use current, immediately relevant context." in prompt_text
53
- assert "Use full terms and specific names for repository work." in prompt_text
54
- assert "When a request has multiple reasonable interpretations" in prompt_text
55
- assert "Ask one focused clarification question" in prompt_text
56
- assert "Pause for the user's choice before making a high-impact decision." in prompt_text
57
-
58
- def test_prompt_limits_replies_to_what_the_user_must_act_on_or_know(self) -> None:
59
- assert "Send the user only what they must act on or need to know." in WORKING_STYLE_PROMPT
60
- assert "starts a turn and nothing in it needs the user, end the turn with no text." in WORKING_STYLE_PROMPT
61
- assert "On a typed request, state your next action in one sentence" in WORKING_STYLE_PROMPT
62
- assert "Before your first tool call, state your next action" not in WORKING_STYLE_PROMPT
63
- assert (
64
- "A report that a fix is done carries three lines: the fix acknowledged, "
65
- "what changed, and the proof that it works."
66
- ) in WORKING_STYLE_PROMPT
67
- assert "Put the rest of the detail in the pull request or a linked file." in WORKING_STYLE_PROMPT
68
-
69
- def test_prompt_drops_the_clauses_that_invite_surplus_detail(self) -> None:
70
- assert "supporting detail for readers who want it" not in WORKING_STYLE_PROMPT
71
- assert "give brief updates when you find important information" not in WORKING_STYLE_PROMPT
72
- assert "Name each action, fact, reason, and outcome." not in WORKING_STYLE_PROMPT
44
+ def test_prompt_points_at_the_working_style_guide(self) -> None:
45
+ assert f"~/.claude/{WORKING_STYLE_GUIDE_RELATIVE_PATH}" in WORKING_STYLE_PROMPT
46
+ assert WORKING_STYLE_GUIDE_PATH.is_file()
47
+
48
+ def test_prompt_stays_a_short_pointer(self) -> None:
49
+ assert len(WORKING_STYLE_PROMPT) < len(WORKING_STYLE_GUIDE_PATH.read_text(encoding="utf-8")) // 10
50
+
51
+ def test_guide_carries_the_policy_and_scope_guidance(self) -> None:
52
+ guide_text = WORKING_STYLE_GUIDE_PATH.read_text(encoding="utf-8")
53
+ assert "Document each task in a location that remains easy to find later." in guide_text
54
+ assert "Deliver the requested work at its intended scope." in guide_text
55
+ assert "A request to remove something is complete once it is gone." in guide_text
56
+ assert "Send the user only what they must act on or need to know." in guide_text
57
+ assert "starts a turn and nothing in it needs the user, end the turn with no text." in guide_text
58
+ assert "On a typed request, state your next action in one sentence" in guide_text
59
+ assert "Pause for the user's choice before making a high-impact decision." in guide_text
73
60
 
74
61
  def test_build_session_directive_returns_the_shared_constant(self) -> None:
75
62
  assert starter.build_session_directive() == WORKING_STYLE_PROMPT
@@ -1,12 +1,9 @@
1
1
  #!/usr/bin/env python3
2
2
  """SessionStart hook — inject working-style guidance into the session.
3
3
 
4
- At session start this hook emits an ``additionalContext`` block carrying a fixed
5
- working-style prompt: use ELI5 for the beginner presentation envelope, follow
6
- ``~/.claude/rules/asd-ste100-language.md`` for sentence prose, keep a running
7
- ledger, narrate before the first tool call on a typed request, lead with the
8
- outcome, send only what the user must act on or know, stay silent on a
9
- background-event turn that needs nothing, and stay at the asked scope.
4
+ At session start this hook emits an ``additionalContext`` line that points the
5
+ session at ``docs/references/working-style.md``, the guide for task records,
6
+ presentation, replies, scope, and questions.
10
7
  The hook writes nothing and runs no tools itself.
11
8
  """
12
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-dev-env",
3
- "version": "8.65.0",
3
+ "version": "8.65.1",
4
4
  "description": "Claude Code development standards — rules, hooks, agents, commands, and skills",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,8 +8,6 @@ SKILLS_DIRECTORY = PACKAGE_ROOT / ".agents" / "skills"
8
8
 
9
9
  ALWAYS_ON_RULE_NAMES = frozenset(
10
10
  {
11
- "AGENTS.md",
12
- "CLAUDE.md",
13
11
  "asd-ste100-language.md",
14
12
  "cleanup-temp-files.md",
15
13
  "correction-lens.md",
package/settings.json CHANGED
@@ -2,7 +2,8 @@
2
2
  "agent": "dev-env-session",
3
3
  "permissions": {
4
4
  "allow": [
5
- "WebFetch(domain:docs.github.com)"
5
+ "WebFetch(domain:docs.github.com)",
6
+ "Read(~/.claude/docs/**)"
6
7
  ]
7
8
  },
8
9
  "advisorModel": "fable",
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
-
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md
@@ -1 +0,0 @@
1
- @../AGENTS.md