mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-17 15:43:30 +08:00
Compare commits
4 Commits
b994a076c2
...
6090401ccd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6090401ccd | ||
|
|
e3314f41e4 | ||
|
|
036d8e872c | ||
|
|
27ee3a449b |
18
README.md
18
README.md
@@ -38,24 +38,6 @@ Works across **Claude Code**, **Codex**, **Cowork**, and other AI agent harnesse
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Traction & Distribution
|
|
||||||
|
|
||||||
Use these live signals when presenting ECC to sponsors, platforms, or ecosystem partners:
|
|
||||||
|
|
||||||
- **Main package installs:** [`ecc-universal` on npm](https://www.npmjs.com/package/ecc-universal)
|
|
||||||
- **Security companion installs:** [`ecc-agentshield` on npm](https://www.npmjs.com/package/ecc-agentshield)
|
|
||||||
- **GitHub App distribution:** [ECC Tools marketplace listing](https://github.com/marketplace/ecc-tools)
|
|
||||||
- **Automated monthly metrics issue:** powered by `.github/workflows/monthly-metrics.yml`
|
|
||||||
- **Repo adoption signal:** stars/forks/contributors badges at the top of this README
|
|
||||||
|
|
||||||
Download counts for Claude Code plugin installs are not currently exposed as a public API. For partner reporting, combine npm metrics with GitHub App installs and repository traffic/fork growth.
|
|
||||||
|
|
||||||
For a sponsor-call metrics checklist and command snippets, see [`docs/business/metrics-and-sponsorship.md`](docs/business/metrics-and-sponsorship.md).
|
|
||||||
|
|
||||||
[**Sponsor ECC**](https://github.com/sponsors/affaan-m) | [Sponsor Tiers](SPONSORS.md) | [Sponsorship Program](SPONSORING.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## The Guides
|
## The Guides
|
||||||
|
|
||||||
This repo is the raw code only. The guides explain everything.
|
This repo is the raw code only. The guides explain everything.
|
||||||
|
|||||||
@@ -251,19 +251,20 @@ async function runTests() {
|
|||||||
assert.ok(result.stderr.includes('[PreCompact]'), 'Should output to stderr with prefix');
|
assert.ok(result.stderr.includes('[PreCompact]'), 'Should output to stderr with prefix');
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
if (await asyncTest('blocking hooks output BLOCKED message', async () => {
|
if (await asyncTest('dev server hook transforms command to tmux session', async () => {
|
||||||
// Test the dev server blocking hook — must send a matching command
|
// Test the auto-tmux dev hook — transforms dev commands to run in tmux
|
||||||
const blockingCommand = hooks.hooks.PreToolUse[0].hooks[0].command;
|
const hookCommand = hooks.hooks.PreToolUse[0].hooks[0].command;
|
||||||
const result = await runHookCommand(blockingCommand, {
|
const result = await runHookCommand(hookCommand, {
|
||||||
tool_input: { command: 'npm run dev' }
|
tool_input: { command: 'npm run dev' }
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hook only blocks on non-Windows platforms (tmux is Unix-only)
|
assert.strictEqual(result.code, 0, 'Hook should exit 0 (transforms, does not block)');
|
||||||
if (process.platform === 'win32') {
|
// On Unix with tmux, stdout contains transformed JSON with tmux command
|
||||||
assert.strictEqual(result.code, 0, 'On Windows, hook should not block (exit 0)');
|
// On Windows or without tmux, stdout contains original JSON passthrough
|
||||||
} else {
|
const output = result.stdout.trim();
|
||||||
assert.ok(result.stderr.includes('BLOCKED'), 'Blocking hook should output BLOCKED');
|
if (output) {
|
||||||
assert.strictEqual(result.code, 2, 'Blocking hook should exit with code 2');
|
const parsed = JSON.parse(output);
|
||||||
|
assert.ok(parsed.tool_input, 'Should output valid JSON with tool_input');
|
||||||
}
|
}
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
@@ -277,18 +278,20 @@ async function runTests() {
|
|||||||
assert.strictEqual(result.code, 0, 'Non-blocking hook should exit 0');
|
assert.strictEqual(result.code, 0, 'Non-blocking hook should exit 0');
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
if (await asyncTest('blocking hooks exit with code 2', async () => {
|
if (await asyncTest('dev server hook transforms yarn dev to tmux session', async () => {
|
||||||
// The dev server blocker blocks when a dev server command is detected
|
// The auto-tmux dev hook transforms dev commands (yarn dev, npm run dev, etc.)
|
||||||
const blockingCommand = hooks.hooks.PreToolUse[0].hooks[0].command;
|
const hookCommand = hooks.hooks.PreToolUse[0].hooks[0].command;
|
||||||
const result = await runHookCommand(blockingCommand, {
|
const result = await runHookCommand(hookCommand, {
|
||||||
tool_input: { command: 'yarn dev' }
|
tool_input: { command: 'yarn dev' }
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hook only blocks on non-Windows platforms (tmux is Unix-only)
|
// Hook always exits 0 — it transforms, never blocks
|
||||||
if (process.platform === 'win32') {
|
assert.strictEqual(result.code, 0, 'Hook should exit 0 (transforms, does not block)');
|
||||||
assert.strictEqual(result.code, 0, 'On Windows, hook should not block (exit 0)');
|
const output = result.stdout.trim();
|
||||||
} else {
|
if (output) {
|
||||||
assert.strictEqual(result.code, 2, 'Blocking hook should exit 2');
|
const parsed = JSON.parse(output);
|
||||||
|
assert.ok(parsed.tool_input, 'Should output valid JSON with tool_input');
|
||||||
|
assert.ok(parsed.tool_input.command, 'Should have a command in output');
|
||||||
}
|
}
|
||||||
})) passed++; else failed++;
|
})) passed++; else failed++;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user