claude-dev-env 8.85.0 → 8.85.2

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 (32) hide show
  1. package/.agents/skills/efficient-review/SKILL.md +79 -0
  2. package/.agents/skills/efficient-review/defaults.json +12 -0
  3. package/.agents/skills/efficient-review/reference/cloud-session.md +13 -0
  4. package/bin/codex-skill-load-block.mjs +27 -28
  5. package/bin/codex-skill-load-block.test.mjs +62 -30
  6. package/bin/codex-trimmed-sol.test.mjs +1 -0
  7. package/bin/ever-shipped-skills.mjs +1 -0
  8. package/bin/install-deepstack-plugin.mjs +300 -0
  9. package/bin/install-deepstack-plugin.test.mjs +98 -0
  10. package/bin/install-pstack-plugin.mjs +3 -5
  11. package/bin/install-pstack-plugin.test.mjs +28 -0
  12. package/bin/install.agents-home.test.mjs +1 -0
  13. package/bin/install.codex-rules.test.mjs +2 -0
  14. package/bin/install.cursor-rules.test.mjs +1 -0
  15. package/bin/install.mjs +27 -3
  16. package/bin/install.profile-settings.test.mjs +1 -0
  17. package/bin/install.prune.test.mjs +20 -0
  18. package/bin/install.question-presentation.test.mjs +7 -3
  19. package/bin/install.settings-defaults.test.mjs +1 -0
  20. package/bin/install.shared-settings.test.mjs +1 -0
  21. package/bin/install.test.mjs +79 -10
  22. package/bin/install.transaction.test.mjs +8 -0
  23. package/bin/install.uninstall-transaction.test.mjs +2 -0
  24. package/bin/install.update-keeps-hooks.test.mjs +1 -0
  25. package/docs/decisions/deepstack-install.md +9 -0
  26. package/docs/rule-guides/deepstack-wording.md +23 -0
  27. package/package.json +1 -1
  28. package/rules/deepstack-wording.md +15 -0
  29. package/scripts/deepstack_inventory.py +348 -0
  30. package/scripts/dev_env_scripts_constants/deepstack_inventory_constants.py +42 -0
  31. package/scripts/test_deepstack_inventory.py +137 -0
  32. package/scripts/test_deepstack_wording_rule.py +20 -0
@@ -63,6 +63,7 @@ function runInstallerInSandbox(sandboxHome, installerArguments = []) {
63
63
  CLAUDE_CONFIG_DIR: undefined,
64
64
  LLM_SETTINGS_PROFILES_ROOT: undefined,
65
65
  CDE_INSTALL_PSTACK: '0',
66
+ CDE_INSTALL_DEEPSTACK: '0',
66
67
  CDE_INSTALL_USAGE_WRAPUP: '0',
67
68
  CDE_INSTALL_SUBAGENT_MODELS: '0',
68
69
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -31,6 +31,7 @@ function installEnvironment(homeDirectory) {
31
31
  CLAUDE_CONFIG_DIR: '',
32
32
  GIT_CONFIG_GLOBAL: join(homeDirectory, '.gitconfig'),
33
33
  CDE_INSTALL_PSTACK: '0',
34
+ CDE_INSTALL_DEEPSTACK: '0',
34
35
  CDE_INSTALL_USAGE_WRAPUP: '0',
35
36
  CDE_INSTALL_SUBAGENT_MODELS: '0',
36
37
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -57,12 +57,12 @@ import {
57
57
  } from './install.mjs';
58
58
  import { EVER_SHIPPED_SKILL_NAMES } from './ever-shipped-skills.mjs';
59
59
  import {
60
+ DEEPEN_GUIDANCE_BLOCK_START,
60
61
  PACKAGE_GUIDANCE_BLOCK_END,
61
62
  PACKAGE_GUIDANCE_BLOCK_START,
62
- SKILL_LOAD_BLOCK_START,
63
- SKILL_LOAD_INSTRUCTION,
64
63
  QUESTION_PRESENTATION_BLOCK_START,
65
- withSkillLoadBlock,
64
+ SKILL_LOAD_BLOCK_END,
65
+ SKILL_LOAD_BLOCK_START,
66
66
  } from './codex-skill-load-block.mjs';
67
67
 
68
68
 
@@ -262,6 +262,11 @@ test('CORE_SKILLS ships deepen so the first-task skill installs with core', () =
262
262
  assert.equal(INSTALL_GROUPS.core.skills.includes('deepen'), true);
263
263
  });
264
264
 
265
+ test('CORE_SKILLS ships efficient-review so a core install includes the skill', () => {
266
+ assert.ok(CORE_SKILLS.includes('efficient-review'), 'efficient-review must be in CORE_SKILLS');
267
+ assert.equal(INSTALL_GROUPS.core.skills.includes('efficient-review'), true);
268
+ });
269
+
265
270
  test('CORE_SKILLS ships test-runner for explicit Django and Playwright readiness checks', () => {
266
271
  assert.ok(CORE_SKILLS.includes('test-runner'));
267
272
  assert.equal(INSTALL_GROUPS.core.skills.includes('test-runner'), true);
@@ -3040,6 +3045,7 @@ test('a failed update preserves an existing skills lookup pointer', () => {
3040
3045
  CLAUDE_CONFIG_DIR: '',
3041
3046
  GIT_CONFIG_GLOBAL: join(homeDirectory, '.gitconfig'),
3042
3047
  CDE_INSTALL_PSTACK: '0',
3048
+ CDE_INSTALL_DEEPSTACK: '0',
3043
3049
  CDE_INSTALL_USAGE_WRAPUP: '0',
3044
3050
  CDE_INSTALL_SUBAGENT_MODELS: '0',
3045
3051
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -3094,6 +3100,7 @@ function runPstackInstaller(homeDirectory, extraArguments, environmentOverrides
3094
3100
  CLAUDE_CONFIG_DIR: join(homeDirectory, '.claude'),
3095
3101
  GIT_CONFIG_GLOBAL: join(homeDirectory, '.gitconfig'),
3096
3102
  CDE_INSTALL_PSTACK: '1',
3103
+ CDE_INSTALL_DEEPSTACK: '0',
3097
3104
  CDE_INSTALL_USAGE_WRAPUP: '0',
3098
3105
  CDE_INSTALL_SUBAGENT_MODELS: '0',
3099
3106
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -3124,6 +3131,17 @@ function pstackPluginSandbox(t) {
3124
3131
  };
3125
3132
  }
3126
3133
 
3134
+ const STALE_SKILL_LOAD_SENTENCE = 'Load the pstack:poteto-mode skill before your first tool call or reply: '
3135
+ + 'open its SKILL.md from your skills list and follow it. This binds every Codex agent, '
3136
+ + 'including a helper started with spawn_agent, whatever its task message says.';
3137
+
3138
+ function assertOmitsSkillLoadSentence(codexGuidance) {
3139
+ assert.equal(codexGuidance.includes(SKILL_LOAD_BLOCK_START), false);
3140
+ assert.equal(codexGuidance.includes(SKILL_LOAD_BLOCK_END), false);
3141
+ assert.equal(codexGuidance.includes('pstack:poteto-mode'), false);
3142
+ assert.equal(codexGuidance.includes(STALE_SKILL_LOAD_SENTENCE), false);
3143
+ }
3144
+
3127
3145
  test('a full install adds the pstack marketplace and plugin on both hosts', t => {
3128
3146
  const sandbox = pstackPluginSandbox(t);
3129
3147
 
@@ -3145,9 +3163,10 @@ test('a full install adds the pstack marketplace and plugin on both hosts', t =>
3145
3163
  const sheet = readFileSync(join(codexHome, 'pstack-models.md'), 'utf8');
3146
3164
  const agents = readFileSync(join(codexHome, 'AGENTS.md'), 'utf8');
3147
3165
  assert.match(sheet, /^session hook: on$/m);
3166
+ assert.match(agents, /^# pstack model configuration\n/);
3148
3167
  assert.match(agents, /^feature, refactoring: gpt-6-sol$/m);
3149
3168
  assert.doesNotMatch(agents, /^session hook:/m);
3150
- assert.ok(agents.startsWith(`${SKILL_LOAD_BLOCK_START}\n${SKILL_LOAD_INSTRUCTION}\n`));
3169
+ assertOmitsSkillLoadSentence(agents);
3151
3170
  assert.equal(existsSync(join(sandbox.homeDirectory, '.claude', 'pstack-models.md')), false);
3152
3171
  const manifestPath = join(sandbox.homeDirectory, '.claude', '.claude-dev-env-manifest.json');
3153
3172
  const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
@@ -3155,18 +3174,66 @@ test('a full install adds the pstack marketplace and plugin on both hosts', t =>
3155
3174
  assert.equal(manifest.files.includes(join(codexHome, 'AGENTS.md')), false);
3156
3175
  });
3157
3176
 
3177
+ test('a full install adds DeepStack for Claude, Codex, and Cursor', t => {
3178
+ const sandbox = pstackPluginSandbox(t);
3179
+ const sourceDirectory = join(sandbox.homeDirectory, 'deepstack-source');
3180
+ mkdirSync(join(sourceDirectory, 'skills', 'deepstack-mode'), { recursive: true });
3181
+ mkdirSync(join(sourceDirectory, 'hooks'), { recursive: true });
3182
+ writeFileSync(join(sourceDirectory, 'skills', 'deepstack-mode', 'SKILL.md'), 'DeepStack intake\n');
3183
+ writeFileSync(join(sourceDirectory, 'hooks', 'session-start.sh'), '#!/bin/sh\n', { mode: 0o755 });
3184
+
3185
+ const installerOutput = runPstackInstaller(sandbox.homeDirectory, [], {
3186
+ ...sandbox.environment,
3187
+ CDE_INSTALL_PSTACK: '0',
3188
+ CDE_INSTALL_DEEPSTACK: '1',
3189
+ CDE_DEEPSTACK_SOURCE: sourceDirectory,
3190
+ });
3191
+
3192
+ assert.deepEqual(sandbox.recordedCommands(), [
3193
+ 'claude plugin uninstall deepstack@DeepStack',
3194
+ 'claude plugin marketplace remove DeepStack',
3195
+ 'claude plugin marketplace add jl-cmd-projects/DeepStack',
3196
+ 'claude plugin install deepstack@DeepStack',
3197
+ 'codex plugin remove deepstack@DeepStack',
3198
+ 'codex plugin marketplace remove DeepStack',
3199
+ 'codex plugin marketplace add jl-cmd-projects/DeepStack',
3200
+ 'codex plugin add deepstack@DeepStack',
3201
+ ]);
3202
+ assert.match(installerOutput, /DeepStack \(claude\): installed/);
3203
+ assert.match(installerOutput, /DeepStack \(codex\): installed/);
3204
+ assert.match(installerOutput, /DeepStack \(cursor\): installed/);
3205
+ const cursorPlugin = join(sandbox.homeDirectory, '.cursor', 'plugins', 'deepstack');
3206
+ assert.equal(
3207
+ readFileSync(join(cursorPlugin, 'skills', 'deepstack-mode', 'SKILL.md'), 'utf8'),
3208
+ 'DeepStack intake\n',
3209
+ );
3210
+ const hooks = JSON.parse(readFileSync(join(sandbox.homeDirectory, '.cursor', 'hooks.json'), 'utf8'));
3211
+ const hookText = JSON.stringify(hooks);
3212
+ assert.match(hookText, /session-start\.sh/);
3213
+ assert.match(hookText, /SessionStart/);
3214
+ assert.match(hookText, /deepen_first_prompt\.py/);
3215
+ assert.match(hookText, /UserPromptSubmit/);
3216
+ const sheet = readFileSync(join(sandbox.homeDirectory, '.codex', 'deepstack-models.md'), 'utf8');
3217
+ assert.match(sheet, /^session hook: on$/m);
3218
+ });
3219
+
3158
3220
  test('a repeat install preserves Codex pstack configuration', t => {
3159
3221
  const sandbox = pstackPluginSandbox(t);
3160
3222
  const codexHome = join(sandbox.homeDirectory, '.codex');
3161
3223
  runPstackInstaller(sandbox.homeDirectory, [], sandbox.environment);
3162
- writeFileSync(join(codexHome, 'AGENTS.md'), 'Custom Codex guidance\n');
3224
+ writeFileSync(
3225
+ join(codexHome, 'AGENTS.md'),
3226
+ `${SKILL_LOAD_BLOCK_START}\n${STALE_SKILL_LOAD_SENTENCE}\n${SKILL_LOAD_BLOCK_END}\nCustom Codex guidance\n`,
3227
+ );
3163
3228
  writeFileSync(join(codexHome, 'pstack-models.md'), 'session hook: off\n');
3164
3229
 
3165
3230
  runPstackInstaller(sandbox.homeDirectory, [], sandbox.environment);
3166
3231
 
3167
3232
  const codexGuidance = readFileSync(join(codexHome, 'AGENTS.md'), 'utf8');
3168
- assert.ok(codexGuidance.startsWith(withSkillLoadBlock('Custom Codex guidance\n')));
3233
+ assert.ok(codexGuidance.startsWith('Custom Codex guidance\n'));
3234
+ assertOmitsSkillLoadSentence(codexGuidance);
3169
3235
  assert.ok(codexGuidance.includes(QUESTION_PRESENTATION_BLOCK_START));
3236
+ assert.ok(codexGuidance.includes(DEEPEN_GUIDANCE_BLOCK_START));
3170
3237
  assert.equal(readFileSync(join(codexHome, 'pstack-models.md'), 'utf8'), 'session hook: off\n');
3171
3238
  });
3172
3239
 
@@ -3185,7 +3252,7 @@ test('a Codex guidance link to the retired Claude copy becomes a file Codex can
3185
3252
  );
3186
3253
  assert.equal(lstatSync(codexAgentsPath).isSymbolicLink(), false);
3187
3254
  const codexGuidance = readFileSync(codexAgentsPath, 'utf8');
3188
- assert.ok(codexGuidance.startsWith(`${SKILL_LOAD_BLOCK_START}\n${SKILL_LOAD_INSTRUCTION}\n`));
3255
+ assertOmitsSkillLoadSentence(codexGuidance);
3189
3256
  assert.ok(codexGuidance.includes(packageGuidance));
3190
3257
  });
3191
3258
 
@@ -3248,8 +3315,9 @@ test('a fresh full install writes the package guidance into Codex AGENTS.md', t
3248
3315
 
3249
3316
  const codexGuidance = readFileSync(join(sandbox.homeDirectory, '.codex', 'AGENTS.md'), 'utf8');
3250
3317
  assertHoldsPackageGuidance(codexGuidance);
3251
- assert.ok(codexGuidance.startsWith(`${SKILL_LOAD_BLOCK_START}\n${SKILL_LOAD_INSTRUCTION}\n`));
3318
+ assertOmitsSkillLoadSentence(codexGuidance);
3252
3319
  assert.ok(codexGuidance.includes(QUESTION_PRESENTATION_BLOCK_START));
3320
+ assert.ok(codexGuidance.includes(DEEPEN_GUIDANCE_BLOCK_START));
3253
3321
  });
3254
3322
 
3255
3323
  test('--no-pstack writes package and question guidance without the skill-load block', t => {
@@ -3329,9 +3397,10 @@ test('a pstack install after a --no-pstack install seeds the Codex model sheet',
3329
3397
  assert.match(readFileSync(join(codexHome, 'pstack-models.md'), 'utf8'), /^session hook: on$/m);
3330
3398
  const codexGuidance = readFileSync(join(codexHome, 'AGENTS.md'), 'utf8');
3331
3399
  assert.match(codexGuidance, /^feature, refactoring: gpt-6-sol$/m);
3332
- assert.ok(codexGuidance.startsWith(`${SKILL_LOAD_BLOCK_START}\n${SKILL_LOAD_INSTRUCTION}\n`));
3400
+ assertOmitsSkillLoadSentence(codexGuidance);
3333
3401
  assertHoldsPackageGuidance(codexGuidance);
3334
3402
  assert.ok(codexGuidance.includes(QUESTION_PRESENTATION_BLOCK_START));
3403
+ assert.ok(codexGuidance.includes(DEEPEN_GUIDANCE_BLOCK_START));
3335
3404
  });
3336
3405
 
3337
3406
  const USAGE_WRAPUP_CLAUDE_COMMANDS = Object.freeze([
@@ -3408,7 +3477,7 @@ test('the help output names the usage-wrapup opt-out beside the pstack one', ()
3408
3477
  });
3409
3478
 
3410
3479
  assert.equal(helpRun.status, 0, helpRun.stderr);
3411
- assert.match(helpRun.stdout, /--no-pstack .*\n.*--no-usage-wrapup .*CDE_INSTALL_USAGE_WRAPUP=0/);
3480
+ assert.match(helpRun.stdout, /--no-pstack .*\n.*--no-deepstack .*CDE_INSTALL_DEEPSTACK=0.*\n.*--no-usage-wrapup .*CDE_INSTALL_USAGE_WRAPUP=0/);
3412
3481
  assert.match(helpRun.stdout, /--no-deepen-first-prompt .*CDE_INSTALL_DEEPEN_FIRST_PROMPT=0/);
3413
3482
  });
3414
3483
 
@@ -88,6 +88,7 @@ test('capture and restore recover settings, manifest, files, and hooksPath', ()
88
88
  CLAUDE_CONFIG_DIR: undefined,
89
89
  LLM_SETTINGS_PROFILES_ROOT: undefined,
90
90
  CDE_INSTALL_PSTACK: '0',
91
+ CDE_INSTALL_DEEPSTACK: '0',
91
92
  CDE_INSTALL_USAGE_WRAPUP: '0',
92
93
  CDE_INSTALL_SUBAGENT_MODELS: '0',
93
94
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -154,6 +155,7 @@ test('capture and restore recover an additional host settings file', () => {
154
155
  CLAUDE_CONFIG_DIR: undefined,
155
156
  LLM_SETTINGS_PROFILES_ROOT: undefined,
156
157
  CDE_INSTALL_PSTACK: '0',
158
+ CDE_INSTALL_DEEPSTACK: '0',
157
159
  CDE_INSTALL_USAGE_WRAPUP: '0',
158
160
  CDE_INSTALL_SUBAGENT_MODELS: '0',
159
161
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -193,6 +195,7 @@ test('runWithInstallTransaction restores prior state on injected fault', () => {
193
195
  CLAUDE_CONFIG_DIR: undefined,
194
196
  LLM_SETTINGS_PROFILES_ROOT: undefined,
195
197
  CDE_INSTALL_PSTACK: '0',
198
+ CDE_INSTALL_DEEPSTACK: '0',
196
199
  CDE_INSTALL_USAGE_WRAPUP: '0',
197
200
  CDE_INSTALL_SUBAGENT_MODELS: '0',
198
201
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -251,6 +254,7 @@ test('runWithInstallTransaction commits and discards journal on success', () =>
251
254
  CLAUDE_CONFIG_DIR: undefined,
252
255
  LLM_SETTINGS_PROFILES_ROOT: undefined,
253
256
  CDE_INSTALL_PSTACK: '0',
257
+ CDE_INSTALL_DEEPSTACK: '0',
254
258
  CDE_INSTALL_USAGE_WRAPUP: '0',
255
259
  CDE_INSTALL_SUBAGENT_MODELS: '0',
256
260
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -298,6 +302,7 @@ function runInstaller(homeDirectory, extraArguments, options = {}) {
298
302
  CLAUDE_CONFIG_DIR: undefined,
299
303
  LLM_SETTINGS_PROFILES_ROOT: undefined,
300
304
  CDE_INSTALL_PSTACK: '0',
305
+ CDE_INSTALL_DEEPSTACK: '0',
301
306
  CDE_INSTALL_USAGE_WRAPUP: '0',
302
307
  CDE_INSTALL_SUBAGENT_MODELS: '0',
303
308
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -335,6 +340,7 @@ test('a later install fault removes newly seeded Codex pstack files', () => {
335
340
  faultPhase: FAULT_PHASES.AFTER_MANIFEST_WRITE,
336
341
  environment: {
337
342
  CDE_INSTALL_PSTACK: '1',
343
+ CDE_INSTALL_DEEPSTACK: '0',
338
344
  CDE_INSTALL_USAGE_WRAPUP: '0',
339
345
  CDE_INSTALL_SUBAGENT_MODELS: '0',
340
346
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -482,6 +488,7 @@ test('installer fault after_git_config restores prior core.hooksPath', () => {
482
488
  CLAUDE_CONFIG_DIR: undefined,
483
489
  LLM_SETTINGS_PROFILES_ROOT: undefined,
484
490
  CDE_INSTALL_PSTACK: '0',
491
+ CDE_INSTALL_DEEPSTACK: '0',
485
492
  CDE_INSTALL_USAGE_WRAPUP: '0',
486
493
  CDE_INSTALL_SUBAGENT_MODELS: '0',
487
494
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -503,6 +510,7 @@ test('installer fault after_git_config restores prior core.hooksPath', () => {
503
510
  CLAUDE_CONFIG_DIR: undefined,
504
511
  LLM_SETTINGS_PROFILES_ROOT: undefined,
505
512
  CDE_INSTALL_PSTACK: '0',
513
+ CDE_INSTALL_DEEPSTACK: '0',
506
514
  CDE_INSTALL_USAGE_WRAPUP: '0',
507
515
  CDE_INSTALL_SUBAGENT_MODELS: '0',
508
516
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -74,6 +74,7 @@ function runInstaller(homeDirectory, extraArguments, options = {}) {
74
74
  CLAUDE_CONFIG_DIR: undefined,
75
75
  LLM_SETTINGS_PROFILES_ROOT: undefined,
76
76
  CDE_INSTALL_PSTACK: '0',
77
+ CDE_INSTALL_DEEPSTACK: '0',
77
78
  CDE_INSTALL_USAGE_WRAPUP: '0',
78
79
  CDE_INSTALL_SUBAGENT_MODELS: '0',
79
80
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -312,6 +313,7 @@ test('uninstall fault after_git_config restores prior core.hooksPath', () => {
312
313
  CLAUDE_CONFIG_DIR: undefined,
313
314
  LLM_SETTINGS_PROFILES_ROOT: undefined,
314
315
  CDE_INSTALL_PSTACK: '0',
316
+ CDE_INSTALL_DEEPSTACK: '0',
315
317
  CDE_INSTALL_USAGE_WRAPUP: '0',
316
318
  CDE_INSTALL_SUBAGENT_MODELS: '0',
317
319
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -25,6 +25,7 @@ function installerEnvironment(homeDirectory) {
25
25
  CLAUDE_CONFIG_DIR: undefined,
26
26
  LLM_SETTINGS_PROFILES_ROOT: undefined,
27
27
  CDE_INSTALL_PSTACK: '0',
28
+ CDE_INSTALL_DEEPSTACK: '0',
28
29
  CDE_INSTALL_USAGE_WRAPUP: '0',
29
30
  CDE_INSTALL_SUBAGENT_MODELS: '0',
30
31
  CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
@@ -0,0 +1,9 @@
1
+ # DeepStack install
2
+
3
+ The plugin lives in `jl-cmd-projects/DeepStack`. `npx claude-dev-env` installs plugin id `deepstack@DeepStack` for Claude Code and Codex, and copies it to `~/.cursor/plugins/deepstack` with the SessionStart hook and the first-task gate.
4
+
5
+ The entry skill in that repository names these triggers:
6
+
7
+ - DeepStack intake
8
+ - DeepStack search leaf
9
+ - DeepStack reproducible-check leaf
@@ -0,0 +1,23 @@
1
+ Back to the [rules index](../../rules/index.md).
2
+
3
+ # DeepStack wording
4
+
5
+ ## In brief
6
+
7
+ A deepened task uses the three DeepStack labels and puts `CDE_DEEPEN:v1` on line 1. The gate in `hooks/session/deepen_first_prompt.py` is the check. This guide cites that gate.
8
+
9
+ **When this applies:** Writing a deepened task, a worker prompt, or a sentence that names the three DeepStack lines.
10
+
11
+ ## Labels
12
+
13
+ - `SCOPE (role):` names the standing job in one sentence.
14
+ - `EXAMPLES (illustration only):` lists each example, or `none`.
15
+ - `ZOOM-IN BLOCKER:` names why the standing job cannot proceed, or `none`.
16
+
17
+ Say "the user" in public text.
18
+
19
+ ## Where it is enforced
20
+
21
+ | Surface | What runs |
22
+ |---|---|
23
+ | A first-task rewrite | `hooks/session/deepen_first_prompt.py` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-dev-env",
3
- "version": "8.85.0",
3
+ "version": "8.85.2",
4
4
  "description": "Claude Code development standards — rules, hooks, agents, commands, and skills",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,15 @@
1
+ ---
2
+ paths:
3
+ - "**/*.md"
4
+ - "**/commands/**"
5
+ ---
6
+
7
+ # DeepStack wording
8
+
9
+ **When:** Writing a deepened task, a worker prompt, or a line that names the three DeepStack lines.
10
+
11
+ Use these labels: `SCOPE (role):`, `EXAMPLES (illustration only):`, and `ZOOM-IN BLOCKER:`. Put `CDE_DEEPEN:v1` on line 1. Say "the user".
12
+
13
+ **Enforcement:** `hooks/session/deepen_first_prompt.py` is the gate. This rule cites that gate.
14
+
15
+ **Full text:** [guide](../docs/rule-guides/deepstack-wording.md). Read it when you write the three lines.