mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-30 22:13:28 +08:00
fix: add no-hooks minimal install path
This commit is contained in:
committed by
Affaan Mustafa
parent
d26d66fd3b
commit
5881554a1c
28
README.md
28
README.md
@@ -179,6 +179,34 @@ Most Claude Code users should use exactly one install path:
|
|||||||
|
|
||||||
If you already layered multiple installs and things look duplicated, skip straight to [Reset / Uninstall ECC](#reset--uninstall-ecc).
|
If you already layered multiple installs and things look duplicated, skip straight to [Reset / Uninstall ECC](#reset--uninstall-ecc).
|
||||||
|
|
||||||
|
### Low-context / no-hooks path
|
||||||
|
|
||||||
|
If hooks feel too global or you only want ECC's rules, agents, commands, and core workflow skills, skip the plugin and use the minimal manual profile:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./install.sh --profile minimal --target claude
|
||||||
|
```
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
.\install.ps1 --profile minimal --target claude
|
||||||
|
# or
|
||||||
|
npx ecc-install --profile minimal --target claude
|
||||||
|
```
|
||||||
|
|
||||||
|
This profile intentionally excludes `hooks-runtime`.
|
||||||
|
|
||||||
|
If you want the normal core profile but need hooks off, use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./install.sh --profile core --without baseline:hooks --target claude
|
||||||
|
```
|
||||||
|
|
||||||
|
Add hooks later only if you want runtime enforcement:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./install.sh --target claude --modules hooks-runtime
|
||||||
|
```
|
||||||
|
|
||||||
### Step 1: Install the Plugin (Recommended)
|
### Step 1: Install the Plugin (Recommended)
|
||||||
|
|
||||||
> NOTE: The plugin is convenient, but the OSS installer below is still the most reliable path if your Claude Code build has trouble resolving self-hosted marketplace entries.
|
> NOTE: The plugin is convenient, but the OSS installer below is still the most reliable path if your Claude Code build has trouble resolving self-hosted marketplace entries.
|
||||||
|
|||||||
@@ -1,6 +1,16 @@
|
|||||||
{
|
{
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"profiles": {
|
"profiles": {
|
||||||
|
"minimal": {
|
||||||
|
"description": "Low-context Claude Code setup with rules, agents, commands, platform configs, and quality workflow support, but no hook runtime.",
|
||||||
|
"modules": [
|
||||||
|
"rules-core",
|
||||||
|
"agents-core",
|
||||||
|
"commands-core",
|
||||||
|
"platform-configs",
|
||||||
|
"workflow-quality"
|
||||||
|
]
|
||||||
|
},
|
||||||
"core": {
|
"core": {
|
||||||
"description": "Minimal harness baseline with commands, hooks, platform configs, and quality workflow support.",
|
"description": "Minimal harness baseline with commands, hooks, platform configs, and quality workflow support.",
|
||||||
"modules": [
|
"modules": [
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ function runTests() {
|
|||||||
|
|
||||||
if (test('lists install profiles from the real project', () => {
|
if (test('lists install profiles from the real project', () => {
|
||||||
const profiles = listInstallProfiles();
|
const profiles = listInstallProfiles();
|
||||||
|
assert.ok(profiles.some(profile => profile.id === 'minimal'), 'Should include minimal profile');
|
||||||
assert.ok(profiles.some(profile => profile.id === 'core'), 'Should include core profile');
|
assert.ok(profiles.some(profile => profile.id === 'core'), 'Should include core profile');
|
||||||
assert.ok(profiles.some(profile => profile.id === 'full'), 'Should include full profile');
|
assert.ok(profiles.some(profile => profile.id === 'full'), 'Should include full profile');
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
@@ -212,6 +213,22 @@ function runTests() {
|
|||||||
assert.strictEqual(plan.targetRoot, path.join(projectRoot, '.agent'));
|
assert.strictEqual(plan.targetRoot, path.join(projectRoot, '.agent'));
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
if (test('resolves minimal profile without the hook runtime', () => {
|
||||||
|
const plan = resolveInstallPlan({
|
||||||
|
profileId: 'minimal',
|
||||||
|
target: 'claude',
|
||||||
|
projectRoot: '/workspace/app',
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepStrictEqual(
|
||||||
|
plan.selectedModuleIds,
|
||||||
|
['rules-core', 'agents-core', 'commands-core', 'platform-configs', 'workflow-quality']
|
||||||
|
);
|
||||||
|
assert.ok(!plan.selectedModuleIds.includes('hooks-runtime'),
|
||||||
|
'minimal profile should not install hooks-runtime');
|
||||||
|
assert.ok(plan.operations.length > 0, 'Should include install operations');
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
if (test('resolves explicit modules with dependency expansion', () => {
|
if (test('resolves explicit modules with dependency expansion', () => {
|
||||||
const plan = resolveInstallPlan({ moduleIds: ['security'] });
|
const plan = resolveInstallPlan({ moduleIds: ['security'] });
|
||||||
assert.ok(plan.selectedModuleIds.includes('security'), 'Should include requested module');
|
assert.ok(plan.selectedModuleIds.includes('security'), 'Should include requested module');
|
||||||
|
|||||||
@@ -271,6 +271,24 @@ function runTests() {
|
|||||||
}
|
}
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
if (test('supports minimal profile dry-runs without hooks through the installer', () => {
|
||||||
|
const homeDir = createTempDir('install-apply-home-');
|
||||||
|
const projectDir = createTempDir('install-apply-project-');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = run(['--profile', 'minimal', '--dry-run'], { cwd: projectDir, homeDir });
|
||||||
|
assert.strictEqual(result.code, 0, result.stderr);
|
||||||
|
assert.ok(result.stdout.includes('Mode: manifest'));
|
||||||
|
assert.ok(result.stdout.includes('Profile: minimal'));
|
||||||
|
assert.ok(result.stdout.includes('Selected modules: rules-core, agents-core, commands-core, platform-configs, workflow-quality'));
|
||||||
|
assert.ok(!result.stdout.includes('hooks-runtime'));
|
||||||
|
assert.ok(!fs.existsSync(path.join(homeDir, '.claude', 'ecc', 'install-state.json')));
|
||||||
|
} finally {
|
||||||
|
cleanup(homeDir);
|
||||||
|
cleanup(projectDir);
|
||||||
|
}
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
if (test('installs manifest profiles and writes non-legacy install-state', () => {
|
if (test('installs manifest profiles and writes non-legacy install-state', () => {
|
||||||
const homeDir = createTempDir('install-apply-home-');
|
const homeDir = createTempDir('install-apply-home-');
|
||||||
const projectDir = createTempDir('install-apply-project-');
|
const projectDir = createTempDir('install-apply-project-');
|
||||||
|
|||||||
@@ -70,6 +70,29 @@ function runTests() {
|
|||||||
);
|
);
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
if (test('README documents low-context no-hooks install path', () => {
|
||||||
|
assert.ok(
|
||||||
|
readme.includes('### Low-context / no-hooks path'),
|
||||||
|
'README should surface a low-context no-hooks install option near Quick Start'
|
||||||
|
);
|
||||||
|
assert.ok(
|
||||||
|
readme.includes('./install.sh --profile minimal --target claude'),
|
||||||
|
'README should document the shell minimal profile command'
|
||||||
|
);
|
||||||
|
assert.ok(
|
||||||
|
readme.includes('npx ecc-install --profile minimal --target claude'),
|
||||||
|
'README should document the npx minimal profile command'
|
||||||
|
);
|
||||||
|
assert.ok(
|
||||||
|
readme.includes('--profile core --without baseline:hooks --target claude'),
|
||||||
|
'README should document the hook opt-out path for the core profile'
|
||||||
|
);
|
||||||
|
assert.ok(
|
||||||
|
readme.includes('This profile intentionally excludes `hooks-runtime`.'),
|
||||||
|
'README should state that the minimal profile excludes hooks'
|
||||||
|
);
|
||||||
|
})) passed++; else failed++;
|
||||||
|
|
||||||
if (test('README explains plugin-path cleanup and rules scoping', () => {
|
if (test('README explains plugin-path cleanup and rules scoping', () => {
|
||||||
assert.ok(
|
assert.ok(
|
||||||
readme.includes('remove the plugin from Claude Code'),
|
readme.includes('remove the plugin from Claude Code'),
|
||||||
|
|||||||
Reference in New Issue
Block a user