claude-dev-env 8.85.1 → 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.
- package/.agents/skills/efficient-review/SKILL.md +79 -0
- package/.agents/skills/efficient-review/defaults.json +12 -0
- package/.agents/skills/efficient-review/reference/cloud-session.md +13 -0
- package/bin/codex-trimmed-sol.test.mjs +1 -0
- package/bin/ever-shipped-skills.mjs +1 -0
- package/bin/install-deepstack-plugin.mjs +300 -0
- package/bin/install-deepstack-plugin.test.mjs +98 -0
- package/bin/install-pstack-plugin.mjs +3 -5
- package/bin/install-pstack-plugin.test.mjs +28 -0
- package/bin/install.agents-home.test.mjs +1 -0
- package/bin/install.codex-rules.test.mjs +2 -0
- package/bin/install.cursor-rules.test.mjs +1 -0
- package/bin/install.mjs +24 -0
- package/bin/install.profile-settings.test.mjs +1 -0
- package/bin/install.prune.test.mjs +20 -0
- package/bin/install.question-presentation.test.mjs +4 -0
- package/bin/install.settings-defaults.test.mjs +1 -0
- package/bin/install.shared-settings.test.mjs +1 -0
- package/bin/install.test.mjs +51 -1
- package/bin/install.transaction.test.mjs +8 -0
- package/bin/install.uninstall-transaction.test.mjs +2 -0
- package/bin/install.update-keeps-hooks.test.mjs +1 -0
- package/docs/decisions/deepstack-install.md +9 -0
- package/docs/rule-guides/deepstack-wording.md +23 -0
- package/package.json +1 -1
- package/rules/deepstack-wording.md +15 -0
- package/scripts/deepstack_inventory.py +348 -0
- package/scripts/dev_env_scripts_constants/deepstack_inventory_constants.py +42 -0
- package/scripts/test_deepstack_inventory.py +137 -0
- package/scripts/test_deepstack_wording_rule.py +20 -0
package/bin/install.mjs
CHANGED
|
@@ -60,6 +60,10 @@ import {
|
|
|
60
60
|
installMarketplacePlugins,
|
|
61
61
|
shouldInstallMarketplacePlugin,
|
|
62
62
|
} from './install-pstack-plugin.mjs';
|
|
63
|
+
import {
|
|
64
|
+
DEEPSTACK_PLUGIN_SPEC,
|
|
65
|
+
installDeepStackForHosts,
|
|
66
|
+
} from './install-deepstack-plugin.mjs';
|
|
63
67
|
import { seedCodexPstackModels } from './seed-codex-pstack-models.mjs';
|
|
64
68
|
import {
|
|
65
69
|
codexSolSettingSnapshotPaths,
|
|
@@ -227,6 +231,7 @@ export const CORE_SKILLS = [
|
|
|
227
231
|
'task-build',
|
|
228
232
|
'eli5',
|
|
229
233
|
'deepen',
|
|
234
|
+
'efficient-review',
|
|
230
235
|
];
|
|
231
236
|
|
|
232
237
|
export function collectPackageSourceConflicts(packageDirectory) {
|
|
@@ -2938,6 +2943,24 @@ function executeInstallPlanMutations(plan, transactionHelpers) {
|
|
|
2938
2943
|
}
|
|
2939
2944
|
printPluginHostOutcomes([PSTACK_PLUGIN_SPEC], pstackPlugin);
|
|
2940
2945
|
}
|
|
2946
|
+
if (!selectedGroups && shouldInstallMarketplacePlugin(DEEPSTACK_PLUGIN_SPEC)) {
|
|
2947
|
+
const deepStackPlugin = installDeepStackForHosts({
|
|
2948
|
+
claudeRoot: CLAUDE_HOME,
|
|
2949
|
+
codexHome: INSTALL_ROOT_RESOLUTION.codexHomeDirectory,
|
|
2950
|
+
cursorDirectory: INSTALL_ROOT_RESOLUTION.cursorInstallDirectory,
|
|
2951
|
+
firstTaskHookPath: join(
|
|
2952
|
+
INSTALL_ROOT_RESOLUTION.hooksInstallDirectory,
|
|
2953
|
+
'session',
|
|
2954
|
+
'deepen_first_prompt.py',
|
|
2955
|
+
),
|
|
2956
|
+
});
|
|
2957
|
+
summary.deepStackPlugin = deepStackPlugin;
|
|
2958
|
+
printPluginHostOutcomes([DEEPSTACK_PLUGIN_SPEC], deepStackPlugin);
|
|
2959
|
+
const cursorOutcome = deepStackPlugin.cursor;
|
|
2960
|
+
console.log(cursorOutcome.warning
|
|
2961
|
+
? ` DeepStack (cursor): ${cursorOutcome.status} — ${cursorOutcome.warning}`
|
|
2962
|
+
: ` DeepStack (cursor): ${cursorOutcome.status}`);
|
|
2963
|
+
}
|
|
2941
2964
|
const allRepositoryPluginSpecs = [
|
|
2942
2965
|
USAGE_WRAPUP_PLUGIN_SPEC,
|
|
2943
2966
|
SUBAGENT_MODELS_PLUGIN_SPEC,
|
|
@@ -3484,6 +3507,7 @@ Usage:
|
|
|
3484
3507
|
npx ${PACKAGE_NAME} --profile ID Install into one named profile root (under the profiles root)
|
|
3485
3508
|
npx ${PACKAGE_NAME} --profiles A,B Install into each selected profile (one ownership manifest per target)
|
|
3486
3509
|
npx ${PACKAGE_NAME} --no-pstack Full install without the pstack plugin (also CDE_INSTALL_PSTACK=0)
|
|
3510
|
+
npx ${PACKAGE_NAME} --no-deepstack Full install without the DeepStack plugin (also CDE_INSTALL_DEEPSTACK=0)
|
|
3487
3511
|
npx ${PACKAGE_NAME} --no-usage-wrapup Full install without the usage-wrapup plugin (also CDE_INSTALL_USAGE_WRAPUP=0)
|
|
3488
3512
|
npx ${PACKAGE_NAME} --no-subagent-models Full install without the subagent-models plugin (also CDE_INSTALL_SUBAGENT_MODELS=0)
|
|
3489
3513
|
npx ${PACKAGE_NAME} --no-deepen-first-prompt Full install without the deepen-first-prompt plugin (also CDE_INSTALL_DEEPEN_FIRST_PROMPT=0)
|
|
@@ -64,6 +64,7 @@ const CORE_SKILL_DIRECTORIES = [
|
|
|
64
64
|
'issue-tracker',
|
|
65
65
|
'task-build',
|
|
66
66
|
'eli5',
|
|
67
|
+
'efficient-review',
|
|
67
68
|
];
|
|
68
69
|
const PRIOR_RUN_BACKUP_DIRECTORY_NAMES = [
|
|
69
70
|
'2020-01-01T00-00-00-000Z',
|
|
@@ -262,6 +263,7 @@ function resolveInstallerInvocation(homeDirectory) {
|
|
|
262
263
|
CLAUDE_CONFIG_DIR: undefined,
|
|
263
264
|
LLM_SETTINGS_PROFILES_ROOT: undefined,
|
|
264
265
|
CDE_INSTALL_PSTACK: '0',
|
|
266
|
+
CDE_INSTALL_DEEPSTACK: '0',
|
|
265
267
|
CDE_INSTALL_USAGE_WRAPUP: '0',
|
|
266
268
|
CDE_INSTALL_SUBAGENT_MODELS: '0',
|
|
267
269
|
CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
|
|
@@ -802,6 +804,24 @@ test('a scoped --only install records the skill names it installed', () => {
|
|
|
802
804
|
}
|
|
803
805
|
});
|
|
804
806
|
|
|
807
|
+
test('a fresh scoped core install includes efficient-review', () => {
|
|
808
|
+
const sandbox = createSandbox();
|
|
809
|
+
try {
|
|
810
|
+
runInstaller(sandbox.homeDirectory, ['--only', 'core']);
|
|
811
|
+
const skillPath = join(sandbox.skillsDirectory, 'efficient-review', 'SKILL.md');
|
|
812
|
+
const skillText = readFileSync(skillPath, 'utf8');
|
|
813
|
+
assert.match(skillText, /^name: efficient-review$/m);
|
|
814
|
+
assert.match(skillText, /\/efficient-review/);
|
|
815
|
+
assert.equal(readManifest(sandbox.manifestPath).skills.includes('efficient-review'), true);
|
|
816
|
+
assert.equal(
|
|
817
|
+
existsSync(join(sandbox.skillsDirectory, 'efficient-review', 'defaults.json')),
|
|
818
|
+
true,
|
|
819
|
+
);
|
|
820
|
+
} finally {
|
|
821
|
+
rmSync(sandbox.homeDirectory, { recursive: true, force: true });
|
|
822
|
+
}
|
|
823
|
+
});
|
|
824
|
+
|
|
805
825
|
test('a fresh scoped core install ships active skills and omits retired skills', () => {
|
|
806
826
|
const sandbox = createSandbox();
|
|
807
827
|
try {
|
|
@@ -25,6 +25,7 @@ function installInScratchHome(homeDirectory, argumentsList = [], extraEnvironmen
|
|
|
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',
|
|
@@ -182,6 +183,7 @@ test('a successful pstack install omits the retired skill block and gains the qu
|
|
|
182
183
|
|
|
183
184
|
const installation = installInScratchHome(homeDirectory, [], {
|
|
184
185
|
CDE_INSTALL_PSTACK: '1',
|
|
186
|
+
CDE_INSTALL_DEEPSTACK: '0',
|
|
185
187
|
CDE_INSTALL_USAGE_WRAPUP: '0',
|
|
186
188
|
CDE_INSTALL_SUBAGENT_MODELS: '0',
|
|
187
189
|
CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
|
|
@@ -211,6 +213,7 @@ test('enabling pstack after a pstack-off install preserves question guidance', (
|
|
|
211
213
|
|
|
212
214
|
const secondInstallation = installInScratchHome(homeDirectory, [], {
|
|
213
215
|
CDE_INSTALL_PSTACK: '1',
|
|
216
|
+
CDE_INSTALL_DEEPSTACK: '0',
|
|
214
217
|
CDE_INSTALL_USAGE_WRAPUP: '0',
|
|
215
218
|
CDE_INSTALL_SUBAGENT_MODELS: '0',
|
|
216
219
|
CDE_INSTALL_DEEPEN_FIRST_PROMPT: '0',
|
|
@@ -241,6 +244,7 @@ test('a failed pstack transition restores question-only guidance and removes its
|
|
|
241
244
|
|
|
242
245
|
const failedInstallation = installInScratchHome(homeDirectory, [], {
|
|
243
246
|
CDE_INSTALL_PSTACK: '1',
|
|
247
|
+
CDE_INSTALL_DEEPSTACK: '0',
|
|
244
248
|
CDE_INSTALL_USAGE_WRAPUP: '0',
|
|
245
249
|
CDE_INSTALL_SUBAGENT_MODELS: '0',
|
|
246
250
|
CDE_INSTALL_DEEPEN_FIRST_PROMPT: '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',
|
package/bin/install.test.mjs
CHANGED
|
@@ -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',
|
|
@@ -3167,6 +3174,49 @@ test('a full install adds the pstack marketplace and plugin on both hosts', t =>
|
|
|
3167
3174
|
assert.equal(manifest.files.includes(join(codexHome, 'AGENTS.md')), false);
|
|
3168
3175
|
});
|
|
3169
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
|
+
|
|
3170
3220
|
test('a repeat install preserves Codex pstack configuration', t => {
|
|
3171
3221
|
const sandbox = pstackPluginSandbox(t);
|
|
3172
3222
|
const codexHome = join(sandbox.homeDirectory, '.codex');
|
|
@@ -3427,7 +3477,7 @@ test('the help output names the usage-wrapup opt-out beside the pstack one', ()
|
|
|
3427
3477
|
});
|
|
3428
3478
|
|
|
3429
3479
|
assert.equal(helpRun.status, 0, helpRun.stderr);
|
|
3430
|
-
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/);
|
|
3431
3481
|
assert.match(helpRun.stdout, /--no-deepen-first-prompt .*CDE_INSTALL_DEEPEN_FIRST_PROMPT=0/);
|
|
3432
3482
|
});
|
|
3433
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
|
@@ -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.
|