diff --git a/tests/helpers/hermetic-home.mjs b/tests/helpers/hermetic-home.mjs new file mode 100644 index 0000000..7ffaab7 --- /dev/null +++ b/tests/helpers/hermetic-home.mjs @@ -0,0 +1,40 @@ +/** + * Hermetic HOME for snapshot / byte-stability tests. + * + * The COL collision-scanner and the CLAUDE.md cascade resolve ~/.claude from + * process.env.HOME (see scanners/lib/active-config-reader.mjs — enumeratePlugins, + * enumerateSkills, walkClaudeMdCascade). A CLI spawned with the developer's real + * HOME picks up their installed plugins/skills and user CLAUDE.md, which makes + * byte-snapshots machine- and time-dependent: the snapshots seeded on one machine + * drift the moment another machine (or the same machine, later) has a different + * ~/.claude. Pointing HOME at an empty temp dir isolates every snapshot/byte test + * from user state, exactly as tests/scanners/collision.test.mjs already does for + * the COL unit test. + * + * Writes any CLI may make under HOME (sessions, baselines) land in the temp dir, + * never in the repo. + */ +import { mkdtempSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; + +export const HERMETIC_HOME = mkdtempSync(join(tmpdir(), 'config-audit-hermetic-home-')); + +/** Subprocess env with HOME/USERPROFILE redirected to the empty hermetic dir. */ +export function hermeticEnv(extra = {}) { + return { ...process.env, HOME: HERMETIC_HOME, USERPROFILE: HERMETIC_HOME, ...extra }; +} + +/** Run an in-process callback with process.env.HOME pointed at the hermetic dir. */ +export async function withHermeticHome(fn) { + const originalHome = process.env.HOME; + const originalProfile = process.env.USERPROFILE; + process.env.HOME = HERMETIC_HOME; + process.env.USERPROFILE = HERMETIC_HOME; + try { + return await fn(); + } finally { + if (originalHome === undefined) delete process.env.HOME; else process.env.HOME = originalHome; + if (originalProfile === undefined) delete process.env.USERPROFILE; else process.env.USERPROFILE = originalProfile; + } +} diff --git a/tests/json-backcompat.test.mjs b/tests/json-backcompat.test.mjs index 592d21b..975cdc9 100644 --- a/tests/json-backcompat.test.mjs +++ b/tests/json-backcompat.test.mjs @@ -26,16 +26,20 @@ import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; -import { readFile, access, mkdir } from 'node:fs/promises'; +import { readFile, writeFile, access, mkdir } from 'node:fs/promises'; import { homedir } from 'node:os'; +import { hermeticEnv, HERMETIC_HOME } from './helpers/hermetic-home.mjs'; const exec = promisify(execFile); const __dirname = dirname(fileURLToPath(import.meta.url)); const REPO = resolve(__dirname, '..'); const FIXTURE = resolve(REPO, 'tests/fixtures/marketplace-medium'); const SNAPSHOT_DIR = resolve(REPO, 'tests/snapshots/v5.0.0'); -const BASELINE_DIR = resolve(homedir(), '.config-audit/baselines'); +// Baseline lives under the hermetic HOME so drift output is isolated from +// the developer's ~/.config-audit state, matching the scan env below. +const BASELINE_DIR = resolve(HERMETIC_HOME, '.config-audit/baselines'); const DEFAULT_BASELINE = resolve(BASELINE_DIR, 'default.json'); +const SEED = process.env.SEED_SNAPSHOT === '1'; async function runCli(scriptPath, args) { try { @@ -43,6 +47,7 @@ async function runCli(scriptPath, args) { timeout: 60000, cwd: REPO, maxBuffer: 10 * 1024 * 1024, + env: hermeticEnv(), }); return { stdout: stdout || '', stderr: stderr || '' }; } catch (err) { @@ -198,7 +203,12 @@ describe('SC-6 JSON backwards-compatibility — fixture-deterministic CLIs', () const script = resolve(REPO, cli.script); const { stdout } = await runCli(script, [FIXTURE, '--json']); const actual = JSON.parse(stdout); - const expected = JSON.parse(await readFile(resolve(SNAPSHOT_DIR, cli.snapshot), 'utf8')); + const snapshotPath = resolve(SNAPSHOT_DIR, cli.snapshot); + if (SEED) { + await writeFile(snapshotPath, JSON.stringify(actual, null, 2) + '\n', 'utf8'); + return; + } + const expected = JSON.parse(await readFile(snapshotPath, 'utf8')); assert.deepStrictEqual(cli.normalize(actual), cli.normalize(expected)); }); } @@ -219,7 +229,12 @@ describe('SC-6 JSON backwards-compatibility — drift-cli', () => { const script = resolve(REPO, 'scanners/drift-cli.mjs'); const { stdout } = await runCli(script, [FIXTURE, '--json']); const actual = JSON.parse(stdout); - const expected = JSON.parse(await readFile(resolve(SNAPSHOT_DIR, 'drift.json'), 'utf8')); + const snapshotPath = resolve(SNAPSHOT_DIR, 'drift.json'); + if (SEED) { + await writeFile(snapshotPath, JSON.stringify(actual, null, 2) + '\n', 'utf8'); + return; + } + const expected = JSON.parse(await readFile(snapshotPath, 'utf8')); assert.deepStrictEqual(normalizeDrift(actual), normalizeDrift(expected)); }); }); diff --git a/tests/raw-backcompat.test.mjs b/tests/raw-backcompat.test.mjs index b69de4b..96bd2e3 100644 --- a/tests/raw-backcompat.test.mjs +++ b/tests/raw-backcompat.test.mjs @@ -23,8 +23,9 @@ import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; -import { readFile, access, mkdir } from 'node:fs/promises'; +import { readFile, writeFile, access, mkdir } from 'node:fs/promises'; import { homedir } from 'node:os'; +import { hermeticEnv, HERMETIC_HOME } from './helpers/hermetic-home.mjs'; const exec = promisify(execFile); const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -32,8 +33,10 @@ const REPO = resolve(__dirname, '..'); const FIXTURE = resolve(REPO, 'tests/fixtures/marketplace-medium'); const SNAPSHOT_DIR = resolve(REPO, 'tests/snapshots/v5.0.0'); const STDERR_SNAPSHOT_DIR = resolve(REPO, 'tests/snapshots/v5.0.0-stderr'); -const BASELINE_DIR = resolve(homedir(), '.config-audit/baselines'); +// Baseline under the hermetic HOME so drift is isolated from ~/.config-audit. +const BASELINE_DIR = resolve(HERMETIC_HOME, '.config-audit/baselines'); const DEFAULT_BASELINE = resolve(BASELINE_DIR, 'default.json'); +const SEED = process.env.SEED_SNAPSHOT === '1'; async function runCli(scriptPath, args) { try { @@ -41,6 +44,7 @@ async function runCli(scriptPath, args) { timeout: 60000, cwd: REPO, maxBuffer: 10 * 1024 * 1024, + env: hermeticEnv(), }); return { stdout: stdout || '', stderr: stderr || '' }; } catch (err) { @@ -263,7 +267,12 @@ describe('SC-7 --raw posture stderr scorecard verbatim', () => { it('posture --raw stderr matches tests/snapshots/v5.0.0-stderr/posture.txt (modulo Xms)', async () => { const script = resolve(REPO, 'scanners/posture.mjs'); const { stderr } = await runCli(script, [FIXTURE, '--raw']); - const expected = await readFile(resolve(STDERR_SNAPSHOT_DIR, 'posture.txt'), 'utf8'); + const stderrSnapshotPath = resolve(STDERR_SNAPSHOT_DIR, 'posture.txt'); + if (SEED) { + await writeFile(stderrSnapshotPath, stderr, 'utf8'); + return; + } + const expected = await readFile(stderrSnapshotPath, 'utf8'); assert.equal( normalizeStderrDurations(stderr.trim()), normalizeStderrDurations(expected.trim()), diff --git a/tests/scanners/cli-humanizer.test.mjs b/tests/scanners/cli-humanizer.test.mjs index 20d242e..716194a 100644 --- a/tests/scanners/cli-humanizer.test.mjs +++ b/tests/scanners/cli-humanizer.test.mjs @@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { readFile, writeFile, unlink, mkdir, access } from 'node:fs/promises'; -import { homedir } from 'node:os'; +import { hermeticEnv, HERMETIC_HOME } from '../helpers/hermetic-home.mjs'; const exec = promisify(execFile); const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -13,7 +13,7 @@ const REPO = resolve(__dirname, '../..'); const FIXTURE = resolve(REPO, 'tests/fixtures/marketplace-medium'); const BROKEN_PLUGIN = resolve(REPO, 'tests/fixtures/broken-plugin'); -const BASELINE_DIR = resolve(homedir(), '.config-audit/baselines'); +const BASELINE_DIR = resolve(HERMETIC_HOME, '.config-audit/baselines'); const DEFAULT_BASELINE = resolve(BASELINE_DIR, 'default.json'); /** @@ -25,7 +25,7 @@ async function runCli(cliPath, args, env = {}) { const { stdout, stderr } = await exec('node', [cliPath, ...args], { timeout: 60000, cwd: REPO, - env: { ...process.env, ...env }, + env: hermeticEnv(env), maxBuffer: 10 * 1024 * 1024, }); return { stdout: stdout || '', stderr: stderr || '', code: 0 }; diff --git a/tests/scanners/lint-default-output.test.mjs b/tests/scanners/lint-default-output.test.mjs index d5261bf..3bfeaa4 100644 --- a/tests/scanners/lint-default-output.test.mjs +++ b/tests/scanners/lint-default-output.test.mjs @@ -3,6 +3,7 @@ import assert from 'node:assert/strict'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { lint } from '../lint-default-output.mjs'; +import { withHermeticHome } from '../helpers/hermetic-home.mjs'; const __dirname = dirname(fileURLToPath(import.meta.url)); const REPO = resolve(__dirname, '../..'); @@ -10,7 +11,9 @@ const FIXTURE = resolve(REPO, 'tests/fixtures/marketplace-medium'); describe('SC-3 forbidden-words lint (default-output)', () => { it('produces no tier1 or tier3 violations across the 6 prose CLIs', async () => { - const { failures, warnings } = await lint(FIXTURE); + // lint() spawns the prose CLIs inheriting process.env; HOME isolation keeps + // the COL collision scanner off the developer's real ~/.claude. + const { failures, warnings } = await withHermeticHome(() => lint(FIXTURE)); const failureSummary = failures .map((f) => `[${f.cli}] tier${f.tier} "${f.word}" × ${f.count}`) .join('\n '); diff --git a/tests/scanners/posture-humanizer.test.mjs b/tests/scanners/posture-humanizer.test.mjs index 5c1181f..84ec489 100644 --- a/tests/scanners/posture-humanizer.test.mjs +++ b/tests/scanners/posture-humanizer.test.mjs @@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { readFile, unlink } from 'node:fs/promises'; +import { hermeticEnv } from '../helpers/hermetic-home.mjs'; const exec = promisify(execFile); const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -49,6 +50,7 @@ async function runPosture(flags) { const proc = await exec('node', [CLI, FIXTURE, ...flags], { timeout: 60000, cwd: REPO, + env: hermeticEnv(), }).catch(err => err); // posture exits non-zero on findings — capture either way return { stdout: proc.stdout || '', diff --git a/tests/scanners/scan-orchestrator-humanizer.test.mjs b/tests/scanners/scan-orchestrator-humanizer.test.mjs index 0381cbc..493c0ef 100644 --- a/tests/scanners/scan-orchestrator-humanizer.test.mjs +++ b/tests/scanners/scan-orchestrator-humanizer.test.mjs @@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { readFile, unlink } from 'node:fs/promises'; +import { hermeticEnv } from '../helpers/hermetic-home.mjs'; const exec = promisify(execFile); const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -44,6 +45,7 @@ async function runOrchestrator(flags) { await exec('node', [CLI, FIXTURE, '--output-file', out, ...flags], { timeout: 60000, cwd: REPO, + env: hermeticEnv(), }); const written = await readFile(out, 'utf-8'); return JSON.parse(written); diff --git a/tests/snapshot-default-output.test.mjs b/tests/snapshot-default-output.test.mjs index 9007746..dd1db6e 100644 --- a/tests/snapshot-default-output.test.mjs +++ b/tests/snapshot-default-output.test.mjs @@ -23,6 +23,7 @@ import { fileURLToPath } from 'node:url'; import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { readFile, writeFile } from 'node:fs/promises'; +import { hermeticEnv } from './helpers/hermetic-home.mjs'; const exec = promisify(execFile); const __dirname = dirname(fileURLToPath(import.meta.url)); @@ -38,6 +39,7 @@ async function runCli(scriptPath, args) { timeout: 60000, cwd: REPO, maxBuffer: 10 * 1024 * 1024, + env: hermeticEnv(), }); return { stdout: stdout || '', stderr: stderr || '' }; } catch (err) { diff --git a/tests/snapshots/default-output/posture.json b/tests/snapshots/default-output/posture.json index 127003d..b34af99 100644 --- a/tests/snapshots/default-output/posture.json +++ b/tests/snapshots/default-output/posture.json @@ -1,4 +1,4 @@ { "kind": "text", - "payload": "`[CML] CLAUDE.md Linter`: 0 finding(s) (0ms)\n `[SET] Settings Validator`: 0 finding(s) (0ms)\n `[HKV] Hook Validator`: 0 finding(s) (0ms)\n `[RUL] Rules Validator`: 0 finding(s) (0ms)\n `[MCP] MCP Config Validator`: 0 finding(s) (0ms)\n `[IMP] Import Resolver`: 0 finding(s) (0ms)\n `[CNF] Conflict Detector`: 0 finding(s) (0ms)\n `[GAP] Feature Gap Scanner`: 17 finding(s) (0ms)\n `[TOK] Token Hotspots`: 1 finding(s) (0ms)\n `[CPS] Cache-Prefix Stability`: 0 finding(s) (0ms)\n `[DIS] Disabled-In-Schema`: 1 finding(s) (0ms)\n `[COL] Plugin Skill Collision`: 1 finding(s) (0ms)\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n Configuration health\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Health: A (97/100) — Healthy setup, only minor polish needed\n 9 areas reviewed\n\n Area scores\n ───────────\n `CLAUDE.md` ........... A (100) `Settings` ............ A (90)\n `Hooks` ............... A (100) `Rules` ............... A (100)\n `MCP` ................. A (100) `Imports` ............. A (100)\n `Conflicts` ........... A (100) `Token Efficiency` .... A (90)\n `Plugin Hygiene` ...... A (90)\n\n 17 ways you could get more out of Claude Code — see /config-audit feature-gap\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + "payload": "`[CML] CLAUDE.md Linter`: 1 finding(s) (0ms)\n `[SET] Settings Validator`: 0 finding(s) (0ms)\n `[HKV] Hook Validator`: 0 finding(s) (0ms)\n `[RUL] Rules Validator`: 0 finding(s) (0ms)\n `[MCP] MCP Config Validator`: 0 finding(s) (0ms)\n `[IMP] Import Resolver`: 0 finding(s) (0ms)\n `[CNF] Conflict Detector`: 0 finding(s) (0ms)\n `[GAP] Feature Gap Scanner`: 17 finding(s) (0ms)\n `[TOK] Token Hotspots`: 1 finding(s) (0ms)\n `[CPS] Cache-Prefix Stability`: 0 finding(s) (0ms)\n `[DIS] Disabled-In-Schema`: 1 finding(s) (0ms)\n `[COL] Plugin Skill Collision`: 0 finding(s) (0ms)\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n Configuration health\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Health: A (97/100) — Healthy setup, only minor polish needed\n 9 areas reviewed\n\n Area scores\n ───────────\n `CLAUDE.md` ........... A (90) `Settings` ............ A (90)\n `Hooks` ............... A (100) `Rules` ............... A (100)\n `MCP` ................. A (100) `Imports` ............. A (100)\n `Conflicts` ........... A (100) `Token Efficiency` .... A (90)\n `Plugin Hygiene` ...... A (100)\n\n 17 ways you could get more out of Claude Code — see /config-audit feature-gap\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" } diff --git a/tests/snapshots/default-output/scan-orchestrator.json b/tests/snapshots/default-output/scan-orchestrator.json index fa0dc8e..8474bd6 100644 --- a/tests/snapshots/default-output/scan-orchestrator.json +++ b/tests/snapshots/default-output/scan-orchestrator.json @@ -13,12 +13,29 @@ "status": "ok", "files_scanned": 1, "duration_ms": 0, - "findings": [], + "findings": [ + { + "id": "CA-CML-001", + "scanner": "CML", + "severity": "low", + "title": "Your instructions file is missing common sections", + "description": "Sections like Project Overview, Commands, and Conventions help Claude apply your guidance consistently across tasks.", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "line": null, + "evidence": "Present sections: Marketplace Medium, Plugins, Commands, Conventions", + "category": null, + "recommendation": "Add the missing sections noted in the details.", + "autoFixable": false, + "userImpactCategory": "Configuration mistake", + "userActionLanguage": "Optional cleanup", + "relevanceContext": "test-fixture-no-impact" + } + ], "counts": { "critical": 0, "high": 0, "medium": 0, - "low": 0, + "low": 1, "info": 0 } }, @@ -432,69 +449,53 @@ "Review whether this source needs to load on every turn." ] }, - { - "source": "mcp:sadhguru-wisdom (plugin:sadhguru-wisdom)", - "estimated_tokens": 500, - "rank": 2, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, - { - "source": "mcp:vegnorm-rag (plugin:vegnormalene)", - "estimated_tokens": 500, - "rank": 3, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, { "source": "CLAUDE.md", "estimated_tokens": 116, - "rank": 4, + "rank": 2, "recommendations": [ "Move volatile top-of-file content to the bottom or extract to an @import-ed file.", "Split overlong CLAUDE.md into focused @imports (≤200 lines each)." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" }, { "source": "hooks/hooks.json", "estimated_tokens": 81, + "rank": 3, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" + }, + { + "source": ".claude/settings.json", + "estimated_tokens": 59, + "rank": 4, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" + }, + { + "source": ".mcp.json", + "estimated_tokens": 53, "rank": 5, "recommendations": [ "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", "Move rarely-used permissions to a project-local override." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" - }, - { - "source": ".claude/settings.json", - "estimated_tokens": 59, - "rank": 6, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" - }, - { - "source": ".mcp.json", - "estimated_tokens": 53, - "rank": 7, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.mcp.json" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.mcp.json" } ], - "total_estimated_tokens": 1809, + "total_estimated_tokens": 809, "activeConfig": { "claudeMdEstimatedTokens": "", - "mcpServerCount": 3, - "pluginCount": 41, - "skillCount": 65 + "mcpServerCount": 1, + "pluginCount": 0, + "skillCount": 0 } }, { @@ -523,7 +524,7 @@ "severity": "low", "title": "A tool is in both the let-in list and the shut-out list", "description": "When a tool is in both lists, the shut-out always wins, so the let-in entry does nothing. It looks like the tool is approved, but it isn't.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", "line": null, "evidence": "Read: allow=\"Read(src/**)\" + deny=\"Read(./.env)\"", "category": "permissions-hygiene", @@ -545,45 +546,14 @@ { "scanner": "COL", "status": "ok", - "files_scanned": 65, + "files_scanned": 0, "duration_ms": 0, - "findings": [ - { - "id": "CA-COL-001", - "scanner": "COL", - "severity": "low", - "title": "Two plugins both define a skill with the same name", - "description": "When two plugins offer the same skill name, only one wins, and which one is hard to predict.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "line": null, - "evidence": "name=\"okr-offentlig-sektor\"; plugins=okr,okr", - "category": "plugin-hygiene", - "recommendation": "Rename the skill in one of the plugins, or disable the one you don't use.", - "autoFixable": false, - "userImpactCategory": "Conflict", - "userActionLanguage": "Optional cleanup", - "relevanceContext": "affects-everyone", - "details": { - "namespaces": [ - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - }, - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - } - ] - } - } - ], + "findings": [], "counts": { "critical": 0, "high": 0, "medium": 0, - "low": 1, + "low": 0, "info": 0 } } diff --git a/tests/snapshots/default-output/token-hotspots.json b/tests/snapshots/default-output/token-hotspots.json index 17d032a..d7cd374 100644 --- a/tests/snapshots/default-output/token-hotspots.json +++ b/tests/snapshots/default-output/token-hotspots.json @@ -5,7 +5,7 @@ "status": "ok", "files_scanned": 2, "duration_ms": 0, - "total_estimated_tokens": 1809, + "total_estimated_tokens": 809, "hotspots": [ { "source": "mcp:memory (.mcp.json)", @@ -15,61 +15,45 @@ "Review whether this source needs to load on every turn." ] }, - { - "source": "mcp:sadhguru-wisdom (plugin:sadhguru-wisdom)", - "estimated_tokens": 500, - "rank": 2, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, - { - "source": "mcp:vegnorm-rag (plugin:vegnormalene)", - "estimated_tokens": 500, - "rank": 3, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, { "source": "CLAUDE.md", "estimated_tokens": 116, - "rank": 4, + "rank": 2, "recommendations": [ "Move volatile top-of-file content to the bottom or extract to an @import-ed file.", "Split overlong CLAUDE.md into focused @imports (≤200 lines each)." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" }, { "source": "hooks/hooks.json", "estimated_tokens": 81, + "rank": 3, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" + }, + { + "source": ".claude/settings.json", + "estimated_tokens": 59, + "rank": 4, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" + }, + { + "source": ".mcp.json", + "estimated_tokens": 53, "rank": 5, "recommendations": [ "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", "Move rarely-used permissions to a project-local override." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" - }, - { - "source": ".claude/settings.json", - "estimated_tokens": 59, - "rank": 6, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" - }, - { - "source": ".mcp.json", - "estimated_tokens": 53, - "rank": 7, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.mcp.json" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.mcp.json" } ], "findings": [ diff --git a/tests/snapshots/v5.0.0-stderr/posture.txt b/tests/snapshots/v5.0.0-stderr/posture.txt index a4b8829..d605446 100644 --- a/tests/snapshots/v5.0.0-stderr/posture.txt +++ b/tests/snapshots/v5.0.0-stderr/posture.txt @@ -1,15 +1,15 @@ - [CML] CLAUDE.md Linter: 0 finding(s) (9ms) - [SET] Settings Validator: 0 finding(s) (0ms) - [HKV] Hook Validator: 0 finding(s) (2ms) - [RUL] Rules Validator: 0 finding(s) (0ms) - [MCP] MCP Config Validator: 0 finding(s) (1ms) + [CML] CLAUDE.md Linter: 1 finding(s) (13ms) + [SET] Settings Validator: 0 finding(s) (1ms) + [HKV] Hook Validator: 0 finding(s) (1ms) + [RUL] Rules Validator: 0 finding(s) (1ms) + [MCP] MCP Config Validator: 0 finding(s) (0ms) [IMP] Import Resolver: 0 finding(s) (1ms) [CNF] Conflict Detector: 0 finding(s) (1ms) - [GAP] Feature Gap Scanner: 17 finding(s) (3ms) - [TOK] Token Hotspots: 1 finding(s) (116ms) + [GAP] Feature Gap Scanner: 17 finding(s) (2ms) + [TOK] Token Hotspots: 1 finding(s) (8ms) [CPS] Cache-Prefix Stability: 0 finding(s) (1ms) [DIS] Disabled-In-Schema: 1 finding(s) (1ms) - [COL] Plugin Skill Collision: 1 finding(s) (77ms) + [COL] Plugin Skill Collision: 0 finding(s) (0ms) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Config-Audit Health Score @@ -19,11 +19,11 @@ Area Scores ─────────── - CLAUDE.md ........... A (100) Settings ............ A (90) + CLAUDE.md ........... A (90) Settings ............ A (90) Hooks ............... A (100) Rules ............... A (100) MCP ................. A (100) Imports ............. A (100) Conflicts ........... A (100) Token Efficiency .... A (90) - Plugin Hygiene ...... A (90) + Plugin Hygiene ...... A (100) 17 opportunities available — run /config-audit feature-gap for recommendations diff --git a/tests/snapshots/v5.0.0/drift.json b/tests/snapshots/v5.0.0/drift.json index 78785b8..9ff166a 100644 --- a/tests/snapshots/v5.0.0/drift.json +++ b/tests/snapshots/v5.0.0/drift.json @@ -2,6 +2,19 @@ "newFindings": [], "resolvedFindings": [], "unchangedFindings": [ + { + "id": "CA-CML-001", + "scanner": "CML", + "severity": "low", + "title": "Missing recommended sections", + "description": "CLAUDE.md is missing: Project overview, Architecture", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "line": null, + "evidence": "Present sections: Marketplace Medium, Plugins, Commands, Conventions", + "category": null, + "recommendation": "Add sections for: Project overview, Architecture", + "autoFixable": false + }, { "id": "CA-GAP-001", "scanner": "GAP", @@ -242,39 +255,12 @@ "severity": "low", "title": "Tool listed in both permissions.deny and permissions.allow", "description": ".claude/settings.json contains 1 tool present in both deny and allow lists. The deny list wins — the allow entries are dead config but still load on every turn and may confuse future readers about intent.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", "line": null, "evidence": "Read: allow=\"Read(src/**)\" + deny=\"Read(./.env)\"", "category": "permissions-hygiene", "recommendation": "Remove the redundant allow entries. If you actually want this tool enabled, remove it from the deny list instead. Settings should express intent clearly.", "autoFixable": false - }, - { - "id": "CA-COL-001", - "scanner": "COL", - "severity": "low", - "title": "Skill name \"okr-offentlig-sektor\" used by multiple plugins", - "description": "2 plugins (okr, okr) expose a skill named \"okr-offentlig-sektor\". Even when invocation is namespaced via /plugin:skill, shared names create ambiguity in error messages, search results, and the plugin-skills enumeration.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "line": null, - "evidence": "name=\"okr-offentlig-sektor\"; plugins=okr,okr", - "category": "plugin-hygiene", - "recommendation": "Coordinate naming across plugins, or rename one to clarify intent. The shared name forces every reader to disambiguate by source.", - "autoFixable": false, - "details": { - "namespaces": [ - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - }, - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - } - ] - } } ], "movedFindings": [], @@ -293,11 +279,11 @@ { "name": "CLAUDE.md", "before": { - "score": 100, + "score": 90, "grade": "A" }, "after": { - "score": 100, + "score": 90, "grade": "A" }, "delta": 0 @@ -401,11 +387,11 @@ { "name": "Plugin Hygiene", "before": { - "score": 90, + "score": 100, "grade": "A" }, "after": { - "score": 90, + "score": 100, "grade": "A" }, "delta": 0 diff --git a/tests/snapshots/v5.0.0/fix-cli.json b/tests/snapshots/v5.0.0/fix-cli.json index acdf49d..5d45a67 100644 --- a/tests/snapshots/v5.0.0/fix-cli.json +++ b/tests/snapshots/v5.0.0/fix-cli.json @@ -5,6 +5,12 @@ "verified": [], "regressions": [], "manual": [ + { + "findingId": "CA-CML-001", + "title": "Missing recommended sections", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "recommendation": "Add sections for: Project overview, Architecture" + }, { "findingId": "CA-GAP-001", "title": "No custom skills or commands", @@ -116,14 +122,8 @@ { "findingId": "CA-DIS-001", "title": "Tool listed in both permissions.deny and permissions.allow", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", "recommendation": "Remove the redundant allow entries. If you actually want this tool enabled, remove it from the deny list instead. Settings should express intent clearly." - }, - { - "findingId": "CA-COL-001", - "title": "Skill name \"okr-offentlig-sektor\" used by multiple plugins", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "recommendation": "Coordinate naming across plugins, or rename one to clarify intent. The shared name forces every reader to disambiguate by source." } ], "backupId": null diff --git a/tests/snapshots/v5.0.0/manifest.json b/tests/snapshots/v5.0.0/manifest.json index 5ab8aff..bed665f 100644 --- a/tests/snapshots/v5.0.0/manifest.json +++ b/tests/snapshots/v5.0.0/manifest.json @@ -1,610 +1,16 @@ { "meta": { "tool": "config-audit:manifest", - "repoPath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium", - "generatedAt": "2026-05-01T14:44:33.062Z", - "durationMs": 116 + "repoPath": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium", + "generatedAt": "2026-06-18T10:24:47.910Z", + "durationMs": 8 }, "sources": [ - { - "kind": "plugin", - "name": "plugin-dev", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev", - "estimated_tokens": 27574 - }, - { - "kind": "plugin", - "name": "ms-ai-architect", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect", - "estimated_tokens": 21982 - }, - { - "kind": "plugin", - "name": "linkedin-thought-leadership", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership", - "estimated_tokens": 19852 - }, - { - "kind": "plugin", - "name": "content-machine", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine", - "estimated_tokens": 11367 - }, - { - "kind": "plugin", - "name": "mcp-server-dev", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/mcp-server-dev", - "estimated_tokens": 9836 - }, - { - "kind": "plugin", - "name": "skill-creator", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/skill-creator", - "estimated_tokens": 8292 - }, - { - "kind": "skill", - "name": "skill-creator", - "source": "plugin:skill-creator", - "estimated_tokens": 8292 - }, - { - "kind": "plugin", - "name": "harness", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness", - "estimated_tokens": 7032 - }, - { - "kind": "plugin", - "name": "ralph-wiggum", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum", - "estimated_tokens": 5783 - }, - { - "kind": "skill", - "name": "skill-development", - "source": "plugin:plugin-dev", - "estimated_tokens": 5707 - }, - { - "kind": "plugin", - "name": "config-audit", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit", - "estimated_tokens": 5589 - }, - { - "kind": "plugin", - "name": "newsletter", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/newsletter", - "estimated_tokens": 5443 - }, - { - "kind": "plugin", - "name": "kiur", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur", - "estimated_tokens": 5050 - }, - { - "kind": "skill", - "name": "capability-auditor", - "source": "user", - "estimated_tokens": 5036 - }, - { - "kind": "plugin", - "name": "math-olympiad", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/math-olympiad", - "estimated_tokens": 4991 - }, - { - "kind": "skill", - "name": "math-olympiad", - "source": "plugin:math-olympiad", - "estimated_tokens": 4991 - }, - { - "kind": "skill", - "name": "build-mcp-app", - "source": "plugin:mcp-server-dev", - "estimated_tokens": 4848 - }, - { - "kind": "skill", - "name": "command-development", - "source": "plugin:plugin-dev", - "estimated_tokens": 4809 - }, - { - "kind": "plugin", - "name": "okr", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr", - "estimated_tokens": 4775 - }, - { - "kind": "plugin", - "name": "okr", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr", - "estimated_tokens": 4775 - }, - { - "kind": "plugin", - "name": "llm-security", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security", - "estimated_tokens": 4492 - }, - { - "kind": "skill", - "name": "story", - "source": "user", - "estimated_tokens": 4214 - }, - { - "kind": "skill", - "name": "ms-ai-infrastructure", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 4185 - }, - { - "kind": "skill", - "name": "ms-ai-governance", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 4073 - }, - { - "kind": "skill", - "name": "hook-development", - "source": "plugin:plugin-dev", - "estimated_tokens": 4062 - }, - { - "kind": "plugin", - "name": "ultraplan-local", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local", - "estimated_tokens": 3780 - }, - { - "kind": "plugin", - "name": "ultra-cc-architect", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultra-cc-architect", - "estimated_tokens": 3676 - }, - { - "kind": "skill", - "name": "plugin-structure", - "source": "plugin:plugin-dev", - "estimated_tokens": 3449 - }, - { - "kind": "plugin", - "name": "hookify", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify", - "estimated_tokens": 3148 - }, - { - "kind": "skill", - "name": "mcp-integration", - "source": "plugin:plugin-dev", - "estimated_tokens": 3130 - }, - { - "kind": "skill", - "name": "plugin-settings", - "source": "plugin:plugin-dev", - "estimated_tokens": 3025 - }, - { - "kind": "skill", - "name": "ms-ai-security", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 3024 - }, - { - "kind": "skill", - "name": "build-mcp-server", - "source": "plugin:mcp-server-dev", - "estimated_tokens": 3021 - }, - { - "kind": "skill", - "name": "gpt-prompting-expert", - "source": "user", - "estimated_tokens": 2951 - }, - { - "kind": "skill", - "name": "pptx", - "source": "user", - "estimated_tokens": 2898 - }, - { - "kind": "skill", - "name": "agent-development", - "source": "plugin:plugin-dev", - "estimated_tokens": 2792 - }, - { - "kind": "plugin", - "name": "claude-code-setup", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/claude-code-setup", - "estimated_tokens": 2714 - }, - { - "kind": "skill", - "name": "claude-automation-recommender", - "source": "plugin:claude-code-setup", - "estimated_tokens": 2714 - }, - { - "kind": "skill", - "name": "claude-code-changelog", - "source": "user", - "estimated_tokens": 2697 - }, - { - "kind": "skill", - "name": "ms-ai-advisor", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 2658 - }, { "kind": "claude-md", - "name": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/CLAUDE.md", + "name": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/CLAUDE.md", "source": "project", - "estimated_tokens": 2537 - }, - { - "kind": "skill", - "name": "linkedin-strategy", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 2509 - }, - { - "kind": "skill", - "name": "linkedin-content-creation", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 2503 - }, - { - "kind": "skill", - "name": "ms-ai-engineering", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 2496 - }, - { - "kind": "plugin", - "name": "claude-code-to-copilot", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-to-copilot", - "estimated_tokens": 2466 - }, - { - "kind": "skill", - "name": "convert-to-copilot", - "source": "plugin:claude-code-to-copilot", - "estimated_tokens": 2466 - }, - { - "kind": "skill", - "name": "kiur", - "source": "plugin:kiur", - "estimated_tokens": 2402 - }, - { - "kind": "claude-md", - "name": "/Users/ktg/.claude/CLAUDE.md", - "source": "user", - "estimated_tokens": 2381 - }, - { - "kind": "skill", - "name": "harness", - "source": "plugin:harness", - "estimated_tokens": 2347 - }, - { - "kind": "plugin", - "name": "vegnormalene", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/vegnormalene", - "estimated_tokens": 2301 - }, - { - "kind": "skill", - "name": "mcp-builder", - "source": "user", - "estimated_tokens": 2273 - }, - { - "kind": "skill", - "name": "linkedin-thought-leadership", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 2227 - }, - { - "kind": "skill", - "name": "agent-browser", - "source": "user", - "estimated_tokens": 2199 - }, - { - "kind": "skill", - "name": "cc-architect-catalog", - "source": "plugin:ultra-cc-architect", - "estimated_tokens": 2176 - }, - { - "kind": "skill", - "name": "writing-rules", - "source": "plugin:hookify", - "estimated_tokens": 2106 - }, - { - "kind": "skill", - "name": "learning-design", - "source": "plugin:content-machine", - "estimated_tokens": 2032 - }, - { - "kind": "skill", - "name": "build-mcpb", - "source": "plugin:mcp-server-dev", - "estimated_tokens": 1967 - }, - { - "kind": "plugin", - "name": "sadhguru-wisdom", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/sadhguru-wisdom", - "estimated_tokens": 1919 - }, - { - "kind": "skill", - "name": "linkedin-analytics", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 1915 - }, - { - "kind": "skill", - "name": "okr-offentlig-sektor", - "source": "plugin:okr", - "estimated_tokens": 1854 - }, - { - "kind": "skill", - "name": "okr-offentlig-sektor", - "source": "plugin:okr", - "estimated_tokens": 1854 - }, - { - "kind": "plugin", - "name": "code-modernization", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/code-modernization", - "estimated_tokens": 1800 - }, - { - "kind": "skill", - "name": "linkedin-voice", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 1786 - }, - { - "kind": "skill", - "name": "linkedin-networking", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 1668 - }, - { - "kind": "plugin", - "name": "claude-md-management", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/claude-md-management", - "estimated_tokens": 1657 - }, - { - "kind": "skill", - "name": "image-style-guide", - "source": "plugin:content-machine", - "estimated_tokens": 1628 - }, - { - "kind": "skill", - "name": "brand-voice", - "source": "plugin:content-machine", - "estimated_tokens": 1622 - }, - { - "kind": "skill", - "name": "claude-md-improver", - "source": "plugin:claude-md-management", - "estimated_tokens": 1507 - }, - { - "kind": "plugin", - "name": "graceful-handoff", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/graceful-handoff", - "estimated_tokens": 1479 - }, - { - "kind": "skill", - "name": "repo-init", - "source": "user", - "estimated_tokens": 1393 - }, - { - "kind": "skill", - "name": "seo-intelligence", - "source": "plugin:content-machine", - "estimated_tokens": 1348 - }, - { - "kind": "skill", - "name": "graceful-handoff", - "source": "plugin:graceful-handoff", - "estimated_tokens": 1291 - }, - { - "kind": "plugin", - "name": "example-plugin", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/example-plugin", - "estimated_tokens": 1139 - }, - { - "kind": "skill", - "name": "tier-requirements", - "source": "plugin:content-machine", - "estimated_tokens": 1111 - }, - { - "kind": "plugin", - "name": "frontend-design", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/frontend-design", - "estimated_tokens": 1069 - }, - { - "kind": "skill", - "name": "frontend-design", - "source": "plugin:frontend-design", - "estimated_tokens": 1069 - }, - { - "kind": "skill", - "name": "security-controls", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 1064 - }, - { - "kind": "plugin", - "name": "pr-review-toolkit", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/pr-review-toolkit", - "estimated_tokens": 1050 - }, - { - "kind": "plugin", - "name": "ai-psychosis", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis", - "estimated_tokens": 1017 - }, - { - "kind": "plugin", - "name": "playground", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/playground", - "estimated_tokens": 956 - }, - { - "kind": "skill", - "name": "playground", - "source": "plugin:playground", - "estimated_tokens": 956 - }, - { - "kind": "skill", - "name": "persona-creator", - "source": "user", - "estimated_tokens": 931 - }, - { - "kind": "skill", - "name": "sadhana-privacy", - "source": "plugin:content-machine", - "estimated_tokens": 926 - }, - { - "kind": "skill", - "name": "youtube-analyse", - "source": "user", - "estimated_tokens": 922 - }, - { - "kind": "plugin", - "name": "az-900-skill", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/az-900-skill", - "estimated_tokens": 865 - }, - { - "kind": "skill", - "name": "az-900", - "source": "plugin:az-900-skill", - "estimated_tokens": 865 - }, - { - "kind": "skill", - "name": "config-hierarchy", - "source": "plugin:config-audit", - "estimated_tokens": 850 - }, - { - "kind": "skill", - "name": "sadhguru-persona", - "source": "plugin:sadhguru-wisdom", - "estimated_tokens": 800 - }, - { - "kind": "skill", - "name": "newsletter-workflow", - "source": "plugin:newsletter", - "estimated_tokens": 793 - }, - { - "kind": "skill", - "name": "prepare-release", - "source": "user", - "estimated_tokens": 692 - }, - { - "kind": "skill", - "name": "example-skill", - "source": "plugin:example-plugin", - "estimated_tokens": 682 - }, - { - "kind": "skill", - "name": "prd-writing", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 618 - }, - { - "kind": "claude-md", - "name": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/CLAUDE.md", - "source": "project", - "estimated_tokens": 614 - }, - { - "kind": "plugin", - "name": "feature-dev", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/feature-dev", - "estimated_tokens": 600 - }, - { - "kind": "skill", - "name": "ai-psychosis", - "source": "plugin:ai-psychosis", - "estimated_tokens": 591 - }, - { - "kind": "skill", - "name": "vegnorm-expert", - "source": "plugin:vegnormalene", - "estimated_tokens": 582 - }, - { - "kind": "skill", - "name": "autonomous-loop", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 562 - }, - { - "kind": "skill", - "name": "e2e-verification", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 549 - }, - { - "kind": "plugin", - "name": "ralph-loop", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/ralph-loop", - "estimated_tokens": 534 - }, - { - "kind": "plugin", - "name": "claude-code-essentials", - "source": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-essentials", - "estimated_tokens": 500 + "estimated_tokens": 1455 }, { "kind": "mcp-server", @@ -612,642 +18,18 @@ "source": ".mcp.json", "estimated_tokens": 500 }, - { - "kind": "mcp-server", - "name": "sadhguru-wisdom", - "source": "plugin:sadhguru-wisdom", - "estimated_tokens": 500 - }, - { - "kind": "mcp-server", - "name": "vegnorm-rag", - "source": "plugin:vegnormalene", - "estimated_tokens": 500 - }, - { - "kind": "plugin", - "name": "agent-sdk-dev", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/agent-sdk-dev", - "estimated_tokens": 450 - }, - { - "kind": "plugin", - "name": "commit-commands", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/commit-commands", - "estimated_tokens": 450 - }, - { - "kind": "skill", - "name": "essentials", - "source": "plugin:claude-code-essentials", - "estimated_tokens": 362 - }, - { - "kind": "skill", - "name": "example-command", - "source": "plugin:example-plugin", - "estimated_tokens": 307 - }, - { - "kind": "plugin", - "name": "code-review", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/code-review", - "estimated_tokens": 150 - }, - { - "kind": "plugin", - "name": "code-simplifier", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/code-simplifier", - "estimated_tokens": 150 - }, { "kind": "claude-md", - "name": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "name": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", "source": "project", "estimated_tokens": 116 }, - { - "kind": "plugin", - "name": "security-guidance", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/security-guidance", - "estimated_tokens": 110 - }, - { - "kind": "plugin", - "name": "explanatory-output-style", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/explanatory-output-style", - "estimated_tokens": 93 - }, - { - "kind": "plugin", - "name": "learning-output-style", - "source": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/learning-output-style", - "estimated_tokens": 92 - }, { "kind": "claude-md", - "name": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/shared.md", + "name": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/shared.md", "source": "import", "estimated_tokens": 68 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Edit|Write", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Edit|Write", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:mcp__*", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:*", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Bash", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "user", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:explanatory-output-style", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse", - "source": "plugin:hookify", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse", - "source": "plugin:hookify", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:hookify", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:hookify", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:learning-output-style", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:ralph-loop", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Edit|Write|MultiEdit", - "source": "plugin:security-guidance", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:ai-psychosis", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:ai-psychosis", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse", - "source": "plugin:ai-psychosis", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionEnd", - "source": "plugin:ai-psychosis", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Edit|Write", - "source": "plugin:config-audit", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Edit|Write", - "source": "plugin:config-audit", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:config-audit", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:config-audit", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:graceful-handoff", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:graceful-handoff", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Write", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Notification:idle_prompt", - "source": "plugin:linkedin-thought-leadership", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Edit|Write", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:llm-security", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:ms-ai-architect", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:ultraplan-local", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write", - "source": "plugin:ultraplan-local", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:ultraplan-local", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Bash", - "source": "plugin:ultraplan-local", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:ultraplan-local", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:claude-code-essentials", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Edit|Write", - "source": "plugin:claude-code-essentials", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionEnd", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SubagentStop", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:EnterPlanMode", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Write|Edit", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Write|Edit", - "source": "plugin:harness", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:kiur", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:kiur", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PostToolUse:Bash", - "source": "plugin:kiur", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SubagentStop", - "source": "plugin:kiur", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:kiur", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionEnd", - "source": "plugin:kiur", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreCompact", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:okr", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "UserPromptSubmit", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Bash", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "PreToolUse:Write|Edit", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "Stop", - "source": "plugin:ralph-wiggum", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:sadhguru-wisdom", - "estimated_tokens": 15 - }, - { - "kind": "hook", - "name": "SessionStart", - "source": "plugin:vegnormalene", - "estimated_tokens": 15 } ], - "total": 334986 -} \ No newline at end of file + "total": 2139 +} diff --git a/tests/snapshots/v5.0.0/plugin-health.json b/tests/snapshots/v5.0.0/plugin-health.json index 9158d70..7296a2e 100644 --- a/tests/snapshots/v5.0.0/plugin-health.json +++ b/tests/snapshots/v5.0.0/plugin-health.json @@ -1,14 +1,28 @@ { "scanner": "PLH", "status": "ok", - "files_scanned": 1, - "duration_ms": 17, - "findings": [], + "files_scanned": 0, + "duration_ms": 2, + "findings": [ + { + "id": "CA-PLH-001", + "scanner": "PLH", + "severity": "info", + "title": "No plugins found", + "description": "No Claude Code plugins found under tests/fixtures/marketplace-medium", + "file": null, + "line": null, + "evidence": null, + "category": null, + "recommendation": "Ensure plugins have .claude-plugin/plugin.json", + "autoFixable": false + } + ], "counts": { "critical": 0, "high": 0, "medium": 0, "low": 0, - "info": 0 + "info": 1 } } diff --git a/tests/snapshots/v5.0.0/posture.json b/tests/snapshots/v5.0.0/posture.json index 8198e55..603da98 100644 --- a/tests/snapshots/v5.0.0/posture.json +++ b/tests/snapshots/v5.0.0/posture.json @@ -17,8 +17,8 @@ "id": "claude_md", "name": "CLAUDE.md", "grade": "A", - "score": 100, - "findingCount": 0 + "score": 90, + "findingCount": 1 }, { "id": "settings", @@ -80,8 +80,8 @@ "id": "plugin_hygiene", "name": "Plugin Hygiene", "grade": "A", - "score": 90, - "findingCount": 1 + "score": 100, + "findingCount": 0 } ], "overallGrade": "A", @@ -93,8 +93,8 @@ "opportunityCount": 17, "scannerEnvelope": { "meta": { - "target": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium", - "timestamp": "2026-05-01T14:44:22.725Z", + "target": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium", + "timestamp": "2026-06-18T10:18:35.634Z", "version": "2.2.0", "tool": "config-audit" }, @@ -103,13 +103,27 @@ "scanner": "CML", "status": "ok", "files_scanned": 1, - "duration_ms": 1, - "findings": [], + "duration_ms": 3, + "findings": [ + { + "id": "CA-CML-001", + "scanner": "CML", + "severity": "low", + "title": "Missing recommended sections", + "description": "CLAUDE.md is missing: Project overview, Architecture", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "line": null, + "evidence": "Present sections: Marketplace Medium, Plugins, Commands, Conventions", + "category": null, + "recommendation": "Add sections for: Project overview, Architecture", + "autoFixable": false + } + ], "counts": { "critical": 0, "high": 0, "medium": 0, - "low": 0, + "low": 1, "info": 0 } }, @@ -117,7 +131,7 @@ "scanner": "SET", "status": "ok", "files_scanned": 1, - "duration_ms": 0, + "duration_ms": 1, "findings": [], "counts": { "critical": 0, @@ -145,7 +159,7 @@ "scanner": "RUL", "status": "skipped", "files_scanned": 0, - "duration_ms": 1, + "duration_ms": 0, "findings": [], "counts": { "critical": 0, @@ -173,7 +187,7 @@ "scanner": "IMP", "status": "ok", "files_scanned": 1, - "duration_ms": 1, + "duration_ms": 2, "findings": [], "counts": { "critical": 0, @@ -187,7 +201,7 @@ "scanner": "CNF", "status": "ok", "files_scanned": 2, - "duration_ms": 1, + "duration_ms": 0, "findings": [], "counts": { "critical": 0, @@ -201,7 +215,7 @@ "scanner": "GAP", "status": "ok", "files_scanned": 4, - "duration_ms": 3, + "duration_ms": 2, "findings": [ { "id": "CA-GAP-001", @@ -437,7 +451,7 @@ "scanner": "TOK", "status": "ok", "files_scanned": 2, - "duration_ms": 167, + "duration_ms": 8, "findings": [ { "id": "CA-TOK-001", @@ -469,69 +483,53 @@ "Review whether this source needs to load on every turn." ] }, - { - "source": "mcp:sadhguru-wisdom (plugin:sadhguru-wisdom)", - "estimated_tokens": 500, - "rank": 2, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, - { - "source": "mcp:vegnorm-rag (plugin:vegnormalene)", - "estimated_tokens": 500, - "rank": 3, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, { "source": "CLAUDE.md", "estimated_tokens": 116, - "rank": 4, + "rank": 2, "recommendations": [ "Move volatile top-of-file content to the bottom or extract to an @import-ed file.", "Split overlong CLAUDE.md into focused @imports (≤200 lines each)." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" }, { "source": "hooks/hooks.json", "estimated_tokens": 81, + "rank": 3, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" + }, + { + "source": ".claude/settings.json", + "estimated_tokens": 59, + "rank": 4, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" + }, + { + "source": ".mcp.json", + "estimated_tokens": 53, "rank": 5, "recommendations": [ "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", "Move rarely-used permissions to a project-local override." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" - }, - { - "source": ".claude/settings.json", - "estimated_tokens": 59, - "rank": 6, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" - }, - { - "source": ".mcp.json", - "estimated_tokens": 53, - "rank": 7, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.mcp.json" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.mcp.json" } ], - "total_estimated_tokens": 1809, + "total_estimated_tokens": 809, "activeConfig": { - "claudeMdEstimatedTokens": 5716, - "mcpServerCount": 3, - "pluginCount": 41, - "skillCount": 65 + "claudeMdEstimatedTokens": 1639, + "mcpServerCount": 1, + "pluginCount": 0, + "skillCount": 0 } }, { @@ -560,7 +558,7 @@ "severity": "low", "title": "Tool listed in both permissions.deny and permissions.allow", "description": ".claude/settings.json contains 1 tool present in both deny and allow lists. The deny list wins — the allow entries are dead config but still load on every turn and may confuse future readers about intent.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", "line": null, "evidence": "Read: allow=\"Read(src/**)\" + deny=\"Read(./.env)\"", "category": "permissions-hygiene", @@ -579,42 +577,14 @@ { "scanner": "COL", "status": "ok", - "files_scanned": 65, - "duration_ms": 107, - "findings": [ - { - "id": "CA-COL-001", - "scanner": "COL", - "severity": "low", - "title": "Skill name \"okr-offentlig-sektor\" used by multiple plugins", - "description": "2 plugins (okr, okr) expose a skill named \"okr-offentlig-sektor\". Even when invocation is namespaced via /plugin:skill, shared names create ambiguity in error messages, search results, and the plugin-skills enumeration.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "line": null, - "evidence": "name=\"okr-offentlig-sektor\"; plugins=okr,okr", - "category": "plugin-hygiene", - "recommendation": "Coordinate naming across plugins, or rename one to clarify intent. The shared name forces every reader to disambiguate by source.", - "autoFixable": false, - "details": { - "namespaces": [ - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - }, - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - } - ] - } - } - ], + "files_scanned": 0, + "duration_ms": 0, + "findings": [], "counts": { "critical": 0, "high": 0, "medium": 0, - "low": 1, + "low": 0, "info": 0 } } @@ -636,4 +606,4 @@ "scanners_skipped": 1 } } -} \ No newline at end of file +} diff --git a/tests/snapshots/v5.0.0/scan-orchestrator.json b/tests/snapshots/v5.0.0/scan-orchestrator.json index ba109a9..af1d507 100644 --- a/tests/snapshots/v5.0.0/scan-orchestrator.json +++ b/tests/snapshots/v5.0.0/scan-orchestrator.json @@ -1,7 +1,7 @@ { "meta": { - "target": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium", - "timestamp": "2026-05-01T14:44:16.877Z", + "target": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium", + "timestamp": "2026-06-18T10:18:35.439Z", "version": "2.2.0", "tool": "config-audit" }, @@ -11,12 +11,26 @@ "status": "ok", "files_scanned": 1, "duration_ms": 2, - "findings": [], + "findings": [ + { + "id": "CA-CML-001", + "scanner": "CML", + "severity": "low", + "title": "Missing recommended sections", + "description": "CLAUDE.md is missing: Project overview, Architecture", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "line": null, + "evidence": "Present sections: Marketplace Medium, Plugins, Commands, Conventions", + "category": null, + "recommendation": "Add sections for: Project overview, Architecture", + "autoFixable": false + } + ], "counts": { "critical": 0, "high": 0, "medium": 0, - "low": 0, + "low": 1, "info": 0 } }, @@ -24,7 +38,7 @@ "scanner": "SET", "status": "ok", "files_scanned": 1, - "duration_ms": 1, + "duration_ms": 0, "findings": [], "counts": { "critical": 0, @@ -80,7 +94,7 @@ "scanner": "IMP", "status": "ok", "files_scanned": 1, - "duration_ms": 0, + "duration_ms": 2, "findings": [], "counts": { "critical": 0, @@ -344,7 +358,7 @@ "scanner": "TOK", "status": "ok", "files_scanned": 2, - "duration_ms": 120, + "duration_ms": 8, "findings": [ { "id": "CA-TOK-001", @@ -376,76 +390,60 @@ "Review whether this source needs to load on every turn." ] }, - { - "source": "mcp:sadhguru-wisdom (plugin:sadhguru-wisdom)", - "estimated_tokens": 500, - "rank": 2, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, - { - "source": "mcp:vegnorm-rag (plugin:vegnormalene)", - "estimated_tokens": 500, - "rank": 3, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, { "source": "CLAUDE.md", "estimated_tokens": 116, - "rank": 4, + "rank": 2, "recommendations": [ "Move volatile top-of-file content to the bottom or extract to an @import-ed file.", "Split overlong CLAUDE.md into focused @imports (≤200 lines each)." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" }, { "source": "hooks/hooks.json", "estimated_tokens": 81, + "rank": 3, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" + }, + { + "source": ".claude/settings.json", + "estimated_tokens": 59, + "rank": 4, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" + }, + { + "source": ".mcp.json", + "estimated_tokens": 53, "rank": 5, "recommendations": [ "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", "Move rarely-used permissions to a project-local override." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" - }, - { - "source": ".claude/settings.json", - "estimated_tokens": 59, - "rank": 6, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" - }, - { - "source": ".mcp.json", - "estimated_tokens": 53, - "rank": 7, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.mcp.json" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.mcp.json" } ], - "total_estimated_tokens": 1809, + "total_estimated_tokens": 809, "activeConfig": { - "claudeMdEstimatedTokens": 5716, - "mcpServerCount": 3, - "pluginCount": 41, - "skillCount": 65 + "claudeMdEstimatedTokens": 1639, + "mcpServerCount": 1, + "pluginCount": 0, + "skillCount": 0 } }, { "scanner": "CPS", "status": "ok", "files_scanned": 1, - "duration_ms": 0, + "duration_ms": 1, "findings": [], "counts": { "critical": 0, @@ -459,7 +457,7 @@ "scanner": "DIS", "status": "ok", "files_scanned": 1, - "duration_ms": 0, + "duration_ms": 1, "findings": [ { "id": "CA-DIS-001", @@ -467,7 +465,7 @@ "severity": "low", "title": "Tool listed in both permissions.deny and permissions.allow", "description": ".claude/settings.json contains 1 tool present in both deny and allow lists. The deny list wins — the allow entries are dead config but still load on every turn and may confuse future readers about intent.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", + "file": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", "line": null, "evidence": "Read: allow=\"Read(src/**)\" + deny=\"Read(./.env)\"", "category": "permissions-hygiene", @@ -486,42 +484,14 @@ { "scanner": "COL", "status": "ok", - "files_scanned": 65, - "duration_ms": 91, - "findings": [ - { - "id": "CA-COL-001", - "scanner": "COL", - "severity": "low", - "title": "Skill name \"okr-offentlig-sektor\" used by multiple plugins", - "description": "2 plugins (okr, okr) expose a skill named \"okr-offentlig-sektor\". Even when invocation is namespaced via /plugin:skill, shared names create ambiguity in error messages, search results, and the plugin-skills enumeration.", - "file": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "line": null, - "evidence": "name=\"okr-offentlig-sektor\"; plugins=okr,okr", - "category": "plugin-hygiene", - "recommendation": "Coordinate naming across plugins, or rename one to clarify intent. The shared name forces every reader to disambiguate by source.", - "autoFixable": false, - "details": { - "namespaces": [ - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - }, - { - "source": "plugin:okr", - "name": "okr-offentlig-sektor", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/skills/okr-offentlig-sektor/SKILL.md" - } - ] - } - } - ], + "files_scanned": 0, + "duration_ms": 0, + "findings": [], "counts": { "critical": 0, "high": 0, "medium": 0, - "low": 1, + "low": 0, "info": 0 } } @@ -542,4 +512,4 @@ "scanners_error": 0, "scanners_skipped": 1 } -} \ No newline at end of file +} diff --git a/tests/snapshots/v5.0.0/token-hotspots.json b/tests/snapshots/v5.0.0/token-hotspots.json index fef6640..587ea02 100644 --- a/tests/snapshots/v5.0.0/token-hotspots.json +++ b/tests/snapshots/v5.0.0/token-hotspots.json @@ -2,8 +2,8 @@ "scanner": "TOK", "status": "ok", "files_scanned": 2, - "duration_ms": 119, - "total_estimated_tokens": 1809, + "duration_ms": 9, + "total_estimated_tokens": 809, "hotspots": [ { "source": "mcp:memory (.mcp.json)", @@ -13,61 +13,45 @@ "Review whether this source needs to load on every turn." ] }, - { - "source": "mcp:sadhguru-wisdom (plugin:sadhguru-wisdom)", - "estimated_tokens": 500, - "rank": 2, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, - { - "source": "mcp:vegnorm-rag (plugin:vegnormalene)", - "estimated_tokens": 500, - "rank": 3, - "recommendations": [ - "Review whether this source needs to load on every turn." - ] - }, { "source": "CLAUDE.md", "estimated_tokens": 116, - "rank": 4, + "rank": 2, "recommendations": [ "Move volatile top-of-file content to the bottom or extract to an @import-ed file.", "Split overlong CLAUDE.md into focused @imports (≤200 lines each)." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" }, { "source": "hooks/hooks.json", "estimated_tokens": 81, + "rank": 3, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" + }, + { + "source": ".claude/settings.json", + "estimated_tokens": 59, + "rank": 4, + "recommendations": [ + "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", + "Move rarely-used permissions to a project-local override." + ], + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" + }, + { + "source": ".mcp.json", + "estimated_tokens": 53, "rank": 5, "recommendations": [ "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", "Move rarely-used permissions to a project-local override." ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/hooks/hooks.json" - }, - { - "source": ".claude/settings.json", - "estimated_tokens": 59, - "rank": 6, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json" - }, - { - "source": ".mcp.json", - "estimated_tokens": 53, - "rank": 7, - "recommendations": [ - "Deduplicate overlapping entries — each duplicate inflates the per-turn schema payload.", - "Move rarely-used permissions to a project-local override." - ], - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.mcp.json" + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.mcp.json" } ], "findings": [ @@ -92,4 +76,4 @@ "low": 1, "info": 0 } -} \ No newline at end of file +} diff --git a/tests/snapshots/v5.0.0/whats-active.json b/tests/snapshots/v5.0.0/whats-active.json index 0b48ba7..0e4fa88 100644 --- a/tests/snapshots/v5.0.0/whats-active.json +++ b/tests/snapshots/v5.0.0/whats-active.json @@ -2,1070 +2,42 @@ "meta": { "tool": "config-audit:whats-active", "version": "1.0.0", - "generatedAt": "2026-05-01T14:44:38.432Z", - "repoPath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium", - "gitRoot": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace", - "projectKey": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace", - "durationMs": 119 + "generatedAt": "2026-06-18T10:24:48.072Z", + "repoPath": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium", + "gitRoot": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit", + "projectKey": null, + "durationMs": 9 }, "claudeMd": { "files": [ { - "path": "/Users/ktg/.claude/CLAUDE.md", - "scope": "user", - "bytes": 9523, - "lines": 201, - "parent": null - }, - { - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/CLAUDE.md", + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/CLAUDE.md", "scope": "project", - "bytes": 2456, - "lines": 52, + "bytes": 5818, + "lines": 119, "parent": null }, { - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/CLAUDE.md", - "scope": "project", - "bytes": 10146, - "lines": 175, - "parent": null - }, - { - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md", "scope": "project", "bytes": 464, "lines": 25, "parent": null }, { - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/shared.md", + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/shared.md", "scope": "import", "bytes": 273, "lines": 14, - "parent": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" + "parent": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/CLAUDE.md" } ], - "totalBytes": 22862, - "totalLines": 467, - "estimatedTokens": 5716 + "totalBytes": 6555, + "totalLines": 158, + "estimatedTokens": 1639 }, - "plugins": [ - { - "name": "agent-sdk-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/agent-sdk-dev", - "version": null, - "commands": 1, - "agents": 2, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 18471, - "estimatedTokens": 450 - }, - { - "name": "claude-code-setup", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/claude-code-setup", - "version": "1.0.0", - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 10856, - "estimatedTokens": 2714 - }, - { - "name": "claude-md-management", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/claude-md-management", - "version": "1.0.0", - "commands": 1, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 7385, - "estimatedTokens": 1657 - }, - { - "name": "code-modernization", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/code-modernization", - "version": null, - "commands": 7, - "agents": 5, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 31227, - "estimatedTokens": 1800 - }, - { - "name": "code-review", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/code-review", - "version": null, - "commands": 1, - "agents": 0, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 7422, - "estimatedTokens": 150 - }, - { - "name": "code-simplifier", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/code-simplifier", - "version": "1.0.0", - "commands": 0, - "agents": 1, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 3129, - "estimatedTokens": 150 - }, - { - "name": "commit-commands", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/commit-commands", - "version": null, - "commands": 3, - "agents": 0, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 3285, - "estimatedTokens": 450 - }, - { - "name": "example-plugin", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/example-plugin", - "version": null, - "commands": 1, - "agents": 0, - "skills": 2, - "hooks": 0, - "rules": 0, - "totalBytes": 5198, - "estimatedTokens": 1139 - }, - { - "name": "explanatory-output-style", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/explanatory-output-style", - "version": "1.0.0", - "commands": 0, - "agents": 0, - "skills": 0, - "hooks": 1, - "rules": 0, - "totalBytes": 323, - "estimatedTokens": 93 - }, - { - "name": "feature-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/feature-dev", - "version": null, - "commands": 1, - "agents": 3, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 12465, - "estimatedTokens": 600 - }, - { - "name": "frontend-design", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/frontend-design", - "version": null, - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 4274, - "estimatedTokens": 1069 - }, - { - "name": "hookify", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify", - "version": null, - "commands": 4, - "agents": 1, - "skills": 1, - "hooks": 4, - "rules": 0, - "totalBytes": 32242, - "estimatedTokens": 3148 - }, - { - "name": "learning-output-style", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/learning-output-style", - "version": "1.0.0", - "commands": 0, - "agents": 0, - "skills": 0, - "hooks": 1, - "rules": 0, - "totalBytes": 320, - "estimatedTokens": 92 - }, - { - "name": "math-olympiad", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/math-olympiad", - "version": null, - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 19961, - "estimatedTokens": 4991 - }, - { - "name": "mcp-server-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/mcp-server-dev", - "version": null, - "commands": 0, - "agents": 0, - "skills": 3, - "hooks": 0, - "rules": 0, - "totalBytes": 39342, - "estimatedTokens": 9836 - }, - { - "name": "playground", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/playground", - "version": null, - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 3824, - "estimatedTokens": 956 - }, - { - "name": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev", - "version": null, - "commands": 1, - "agents": 3, - "skills": 7, - "hooks": 0, - "rules": 0, - "totalBytes": 144037, - "estimatedTokens": 27574 - }, - { - "name": "pr-review-toolkit", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/pr-review-toolkit", - "version": null, - "commands": 1, - "agents": 6, - "skills": 0, - "hooks": 0, - "rules": 0, - "totalBytes": 36215, - "estimatedTokens": 1050 - }, - { - "name": "ralph-loop", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/ralph-loop", - "version": "1.0.0", - "commands": 3, - "agents": 0, - "skills": 0, - "hooks": 1, - "rules": 0, - "totalBytes": 5172, - "estimatedTokens": 534 - }, - { - "name": "security-guidance", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/security-guidance", - "version": null, - "commands": 0, - "agents": 0, - "skills": 0, - "hooks": 1, - "rules": 0, - "totalBytes": 382, - "estimatedTokens": 110 - }, - { - "name": "skill-creator", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/skill-creator", - "version": null, - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 33168, - "estimatedTokens": 8292 - }, - { - "name": "ai-psychosis", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis", - "version": "1.0.0", - "commands": 1, - "agents": 0, - "skills": 1, - "hooks": 4, - "rules": 0, - "totalBytes": 11308, - "estimatedTokens": 1017 - }, - { - "name": "config-audit", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit", - "version": "5.0.0", - "commands": 18, - "agents": 6, - "skills": 1, - "hooks": 4, - "rules": 4, - "totalBytes": 112496, - "estimatedTokens": 5589 - }, - { - "name": "graceful-handoff", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/graceful-handoff", - "version": "2.1.0", - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 2, - "rules": 0, - "totalBytes": 5819, - "estimatedTokens": 1479 - }, - { - "name": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership", - "version": "1.2.0", - "commands": 27, - "agents": 17, - "skills": 6, - "hooks": 9, - "rules": 0, - "totalBytes": 535796, - "estimatedTokens": 19852 - }, - { - "name": "llm-security", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security", - "version": "7.3.1", - "commands": 20, - "agents": 6, - "skills": 0, - "hooks": 9, - "rules": 0, - "totalBytes": 161770, - "estimatedTokens": 4492 - }, - { - "name": "ms-ai-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect", - "version": "1.8.0", - "commands": 24, - "agents": 12, - "skills": 5, - "hooks": 2, - "rules": 0, - "totalBytes": 250571, - "estimatedTokens": 21982 - }, - { - "name": "okr", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr", - "version": "1.3.0", - "commands": 10, - "agents": 7, - "skills": 1, - "hooks": 4, - "rules": 0, - "totalBytes": 89284, - "estimatedTokens": 4775 - }, - { - "name": "ultra-cc-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultra-cc-architect", - "version": "0.1.0", - "commands": 2, - "agents": 8, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 87115, - "estimatedTokens": 3676 - }, - { - "name": "ultraplan-local", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local", - "version": "3.1.0", - "commands": 4, - "agents": 19, - "skills": 0, - "hooks": 5, - "rules": 0, - "totalBytes": 256642, - "estimatedTokens": 3780 - }, - { - "name": "az-900-skill", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/az-900-skill", - "version": "1.0.0", - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 3457, - "estimatedTokens": 865 - }, - { - "name": "claude-code-essentials", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-essentials", - "version": "1.0.0", - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 2, - "rules": 0, - "totalBytes": 1929, - "estimatedTokens": 500 - }, - { - "name": "claude-code-to-copilot", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-to-copilot", - "version": "0.2.0", - "commands": 0, - "agents": 0, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 9864, - "estimatedTokens": 2466 - }, - { - "name": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine", - "version": "0.1.0", - "commands": 5, - "agents": 13, - "skills": 6, - "hooks": 0, - "rules": 0, - "totalBytes": 167944, - "estimatedTokens": 11367 - }, - { - "name": "harness", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness", - "version": "13.0.0", - "commands": 16, - "agents": 10, - "skills": 1, - "hooks": 13, - "rules": 0, - "totalBytes": 222414, - "estimatedTokens": 7032 - }, - { - "name": "kiur", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur", - "version": "5.5.1", - "commands": 8, - "agents": 7, - "skills": 1, - "hooks": 6, - "rules": 0, - "totalBytes": 124394, - "estimatedTokens": 5050 - }, - { - "name": "newsletter", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/newsletter", - "version": "0.7.0", - "commands": 12, - "agents": 19, - "skills": 1, - "hooks": 0, - "rules": 0, - "totalBytes": 225106, - "estimatedTokens": 5443 - }, - { - "name": "okr", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr", - "version": "1.3.0", - "commands": 10, - "agents": 7, - "skills": 1, - "hooks": 4, - "rules": 0, - "totalBytes": 89284, - "estimatedTokens": 4775 - }, - { - "name": "ralph-wiggum", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum", - "version": "0.7.0", - "commands": 12, - "agents": 5, - "skills": 4, - "hooks": 8, - "rules": 0, - "totalBytes": 67176, - "estimatedTokens": 5783 - }, - { - "name": "sadhguru-wisdom", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/sadhguru-wisdom", - "version": "0.1.0", - "commands": 6, - "agents": 1, - "skills": 1, - "hooks": 1, - "rules": 0, - "totalBytes": 12566, - "estimatedTokens": 1919 - }, - { - "name": "vegnormalene", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/vegnormalene", - "version": "0.1.0", - "commands": 9, - "agents": 2, - "skills": 1, - "hooks": 1, - "rules": 0, - "totalBytes": 16731, - "estimatedTokens": 2301 - } - ], - "skills": [ - { - "name": "agent-browser", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/agent-browser/SKILL.md", - "bytes": 8796, - "estimatedTokens": 2199 - }, - { - "name": "capability-auditor", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/capability-auditor/SKILL.md", - "bytes": 20144, - "estimatedTokens": 5036 - }, - { - "name": "claude-code-changelog", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/claude-code-changelog/SKILL.md", - "bytes": 10787, - "estimatedTokens": 2697 - }, - { - "name": "gpt-prompting-expert", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/gpt-prompting-expert/SKILL.md", - "bytes": 11801, - "estimatedTokens": 2951 - }, - { - "name": "mcp-builder", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/mcp-builder/SKILL.md", - "bytes": 9092, - "estimatedTokens": 2273 - }, - { - "name": "persona-creator", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/persona-creator/SKILL.md", - "bytes": 3722, - "estimatedTokens": 931 - }, - { - "name": "pptx", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/pptx/SKILL.md", - "bytes": 11592, - "estimatedTokens": 2898 - }, - { - "name": "prepare-release", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/prepare-release/SKILL.md", - "bytes": 2768, - "estimatedTokens": 692 - }, - { - "name": "repo-init", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/repo-init/SKILL.md", - "bytes": 5570, - "estimatedTokens": 1393 - }, - { - "name": "story", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/story/SKILL.md", - "bytes": 16853, - "estimatedTokens": 4214 - }, - { - "name": "youtube-analyse", - "source": "user", - "pluginName": null, - "path": "/Users/ktg/.claude/skills/youtube-analyse/SKILL.md", - "bytes": 3688, - "estimatedTokens": 922 - }, - { - "name": "claude-automation-recommender", - "source": "plugin", - "pluginName": "claude-code-setup", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/claude-code-setup/skills/claude-automation-recommender/SKILL.md", - "bytes": 10856, - "estimatedTokens": 2714 - }, - { - "name": "claude-md-improver", - "source": "plugin", - "pluginName": "claude-md-management", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/claude-md-management/skills/claude-md-improver/SKILL.md", - "bytes": 6028, - "estimatedTokens": 1507 - }, - { - "name": "example-command", - "source": "plugin", - "pluginName": "example-plugin", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/example-plugin/skills/example-command/SKILL.md", - "bytes": 1226, - "estimatedTokens": 307 - }, - { - "name": "example-skill", - "source": "plugin", - "pluginName": "example-plugin", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/example-plugin/skills/example-skill/SKILL.md", - "bytes": 2725, - "estimatedTokens": 682 - }, - { - "name": "frontend-design", - "source": "plugin", - "pluginName": "frontend-design", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/frontend-design/skills/frontend-design/SKILL.md", - "bytes": 4274, - "estimatedTokens": 1069 - }, - { - "name": "writing-rules", - "source": "plugin", - "pluginName": "hookify", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify/skills/writing-rules/SKILL.md", - "bytes": 8423, - "estimatedTokens": 2106 - }, - { - "name": "math-olympiad", - "source": "plugin", - "pluginName": "math-olympiad", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/math-olympiad/skills/math-olympiad/SKILL.md", - "bytes": 19961, - "estimatedTokens": 4991 - }, - { - "name": "build-mcp-app", - "source": "plugin", - "pluginName": "mcp-server-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/mcp-server-dev/skills/build-mcp-app/SKILL.md", - "bytes": 19391, - "estimatedTokens": 4848 - }, - { - "name": "build-mcp-server", - "source": "plugin", - "pluginName": "mcp-server-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/mcp-server-dev/skills/build-mcp-server/SKILL.md", - "bytes": 12084, - "estimatedTokens": 3021 - }, - { - "name": "build-mcpb", - "source": "plugin", - "pluginName": "mcp-server-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/mcp-server-dev/skills/build-mcpb/SKILL.md", - "bytes": 7867, - "estimatedTokens": 1967 - }, - { - "name": "playground", - "source": "plugin", - "pluginName": "playground", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/playground/skills/playground/SKILL.md", - "bytes": 3824, - "estimatedTokens": 956 - }, - { - "name": "agent-development", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/agent-development/SKILL.md", - "bytes": 11168, - "estimatedTokens": 2792 - }, - { - "name": "command-development", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/command-development/SKILL.md", - "bytes": 19233, - "estimatedTokens": 4809 - }, - { - "name": "hook-development", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/hook-development/SKILL.md", - "bytes": 16246, - "estimatedTokens": 4062 - }, - { - "name": "mcp-integration", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/mcp-integration/SKILL.md", - "bytes": 12519, - "estimatedTokens": 3130 - }, - { - "name": "plugin-settings", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/plugin-settings/SKILL.md", - "bytes": 12097, - "estimatedTokens": 3025 - }, - { - "name": "plugin-structure", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/plugin-structure/SKILL.md", - "bytes": 13796, - "estimatedTokens": 3449 - }, - { - "name": "skill-development", - "source": "plugin", - "pluginName": "plugin-dev", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/plugin-dev/skills/skill-development/SKILL.md", - "bytes": 22825, - "estimatedTokens": 5707 - }, - { - "name": "skill-creator", - "source": "plugin", - "pluginName": "skill-creator", - "path": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/skill-creator/skills/skill-creator/SKILL.md", - "bytes": 33168, - "estimatedTokens": 8292 - }, - { - "name": "ai-psychosis", - "source": "plugin", - "pluginName": "ai-psychosis", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis/skills/ai-psychosis/SKILL.md", - "bytes": 2361, - "estimatedTokens": 591 - }, - { - "name": "config-hierarchy", - "source": "plugin", - "pluginName": "config-audit", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/skills/config-hierarchy/SKILL.md", - "bytes": 3397, - "estimatedTokens": 850 - }, - { - "name": "graceful-handoff", - "source": "plugin", - "pluginName": "graceful-handoff", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/graceful-handoff/skills/graceful-handoff/SKILL.md", - "bytes": 5163, - "estimatedTokens": 1291 - }, - { - "name": "linkedin-analytics", - "source": "plugin", - "pluginName": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/skills/linkedin-analytics/SKILL.md", - "bytes": 7659, - "estimatedTokens": 1915 - }, - { - "name": "linkedin-content-creation", - "source": "plugin", - "pluginName": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/skills/linkedin-content-creation/SKILL.md", - "bytes": 10012, - "estimatedTokens": 2503 - }, - { - "name": "linkedin-networking", - "source": "plugin", - "pluginName": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/skills/linkedin-networking/SKILL.md", - "bytes": 6672, - "estimatedTokens": 1668 - }, - { - "name": "linkedin-strategy", - "source": "plugin", - "pluginName": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/skills/linkedin-strategy/SKILL.md", - "bytes": 10036, - "estimatedTokens": 2509 - }, - { - "name": "linkedin-thought-leadership", - "source": "plugin", - "pluginName": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/skills/linkedin-thought-leadership/SKILL.md", - "bytes": 8906, - "estimatedTokens": 2227 - }, - { - "name": "linkedin-voice", - "source": "plugin", - "pluginName": "linkedin-thought-leadership", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/skills/linkedin-voice/SKILL.md", - "bytes": 7141, - "estimatedTokens": 1786 - }, - { - "name": "ms-ai-advisor", - "source": "plugin", - "pluginName": "ms-ai-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/skills/ms-ai-advisor/SKILL.md", - "bytes": 10631, - "estimatedTokens": 2658 - }, - { - "name": "ms-ai-engineering", - "source": "plugin", - "pluginName": "ms-ai-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/skills/ms-ai-engineering/SKILL.md", - "bytes": 9982, - "estimatedTokens": 2496 - }, - { - "name": "ms-ai-governance", - "source": "plugin", - "pluginName": "ms-ai-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/skills/ms-ai-governance/SKILL.md", - "bytes": 16291, - "estimatedTokens": 4073 - }, - { - "name": "ms-ai-infrastructure", - "source": "plugin", - "pluginName": "ms-ai-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/skills/ms-ai-infrastructure/SKILL.md", - "bytes": 16738, - "estimatedTokens": 4185 - }, - { - "name": "ms-ai-security", - "source": "plugin", - "pluginName": "ms-ai-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/skills/ms-ai-security/SKILL.md", - "bytes": 12093, - "estimatedTokens": 3024 - }, - { - "name": "okr-offentlig-sektor", - "source": "plugin", - "pluginName": "okr", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "bytes": 7414, - "estimatedTokens": 1854 - }, - { - "name": "cc-architect-catalog", - "source": "plugin", - "pluginName": "ultra-cc-architect", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultra-cc-architect/skills/cc-architect-catalog/SKILL.md", - "bytes": 8702, - "estimatedTokens": 2176 - }, - { - "name": "az-900", - "source": "plugin", - "pluginName": "az-900-skill", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/az-900-skill/skills/az-900/SKILL.md", - "bytes": 3457, - "estimatedTokens": 865 - }, - { - "name": "essentials", - "source": "plugin", - "pluginName": "claude-code-essentials", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-essentials/skills/essentials/SKILL.md", - "bytes": 1446, - "estimatedTokens": 362 - }, - { - "name": "convert-to-copilot", - "source": "plugin", - "pluginName": "claude-code-to-copilot", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-to-copilot/skills/convert-to-copilot/SKILL.md", - "bytes": 9864, - "estimatedTokens": 2466 - }, - { - "name": "brand-voice", - "source": "plugin", - "pluginName": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine/skills/brand-voice/SKILL.md", - "bytes": 6485, - "estimatedTokens": 1622 - }, - { - "name": "image-style-guide", - "source": "plugin", - "pluginName": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine/skills/image-style-guide/SKILL.md", - "bytes": 6509, - "estimatedTokens": 1628 - }, - { - "name": "learning-design", - "source": "plugin", - "pluginName": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine/skills/learning-design/SKILL.md", - "bytes": 8127, - "estimatedTokens": 2032 - }, - { - "name": "sadhana-privacy", - "source": "plugin", - "pluginName": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine/skills/sadhana-privacy/SKILL.md", - "bytes": 3704, - "estimatedTokens": 926 - }, - { - "name": "seo-intelligence", - "source": "plugin", - "pluginName": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine/skills/seo-intelligence/SKILL.md", - "bytes": 5389, - "estimatedTokens": 1348 - }, - { - "name": "tier-requirements", - "source": "plugin", - "pluginName": "content-machine", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/content-machine/skills/tier-requirements/SKILL.md", - "bytes": 4443, - "estimatedTokens": 1111 - }, - { - "name": "harness", - "source": "plugin", - "pluginName": "harness", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/skills/harness/SKILL.md", - "bytes": 9387, - "estimatedTokens": 2347 - }, - { - "name": "kiur", - "source": "plugin", - "pluginName": "kiur", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/skills/kiur/SKILL.md", - "bytes": 9607, - "estimatedTokens": 2402 - }, - { - "name": "newsletter-workflow", - "source": "plugin", - "pluginName": "newsletter", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/newsletter/skills/newsletter-workflow/SKILL.md", - "bytes": 3172, - "estimatedTokens": 793 - }, - { - "name": "okr-offentlig-sektor", - "source": "plugin", - "pluginName": "okr", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/skills/okr-offentlig-sektor/SKILL.md", - "bytes": 7414, - "estimatedTokens": 1854 - }, - { - "name": "autonomous-loop", - "source": "plugin", - "pluginName": "ralph-wiggum", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/skills/autonomous-loop/SKILL.md", - "bytes": 2248, - "estimatedTokens": 562 - }, - { - "name": "e2e-verification", - "source": "plugin", - "pluginName": "ralph-wiggum", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/skills/e2e-verification/SKILL.md", - "bytes": 2195, - "estimatedTokens": 549 - }, - { - "name": "prd-writing", - "source": "plugin", - "pluginName": "ralph-wiggum", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/skills/prd-writing/SKILL.md", - "bytes": 2471, - "estimatedTokens": 618 - }, - { - "name": "security-controls", - "source": "plugin", - "pluginName": "ralph-wiggum", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/skills/security-controls/SKILL.md", - "bytes": 4254, - "estimatedTokens": 1064 - }, - { - "name": "sadhguru-persona", - "source": "plugin", - "pluginName": "sadhguru-wisdom", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/sadhguru-wisdom/skills/sadhguru-persona/SKILL.md", - "bytes": 3197, - "estimatedTokens": 800 - }, - { - "name": "vegnorm-expert", - "source": "plugin", - "pluginName": "vegnormalene", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/vegnormalene/skills/vegnorm-expert/SKILL.md", - "bytes": 2328, - "estimatedTokens": 582 - } - ], + "plugins": [], + "skills": [], "mcpServers": [ { "name": "memory", @@ -1076,811 +48,46 @@ "toolCount": null, "toolCountUnknown": true, "estimatedTokens": 500 - }, - { - "name": "sadhguru-wisdom", - "source": "plugin:sadhguru-wisdom", - "command": "uv run --directory ${HOME}/.claude/mcp-servers/sadhguru-wisdom python server.py", - "enabled": true, - "disabledBy": null, - "toolCount": null, - "toolCountUnknown": true, - "estimatedTokens": 500 - }, - { - "name": "vegnorm-rag", - "source": "plugin:vegnormalene", - "command": "uv run --directory ${HOME}/.claude/mcp-servers/vegnorm-rag python server.py", - "enabled": true, - "disabledBy": null, - "toolCount": null, - "toolCountUnknown": true, - "estimatedTokens": 500 - } - ], - "hooks": [ - { - "event": "SessionStart", - "matcher": null, - "command": "~/.claude/hooks/session-start.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "~/.claude/hooks/pre-bash-gitguard.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "~/.claude/hooks/pre-commit-version-check.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "~/.claude/hooks/pre-commit-docs-gate.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Edit|Write", - "command": "~/.claude/hooks/pre-edit-secrets.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Edit|Write", - "command": "~/.claude/hooks/pre-write-pathguard.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "mcp__*", - "command": "~/.claude/hooks/pre-mcp-guardrail.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "*", - "command": "~/.claude/hooks/audit-logger.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Bash", - "command": "~/.claude/hooks/post-commit-push-reminder.sh", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "S=$(tmux display-message -p '#{session_name}' 2>/dev/null); T=$$-$RANDOM; echo $T > /tmp/tmux-bell-$S; tmux set-option -q status-style 'bg=#b57614,fg=#282828,bold' 2>/dev/null; printf '\\a' 2>/dev/null; (sleep 15; [ \"$(cat /tmp/tmux-bell-$S 2>/dev/null)\" = \"$T\" ] && tmux set-option -q status-style 'bg=#3c3836,fg=#665c54' 2>/dev/null) & true", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "echo submit > /tmp/tmux-bell-$(tmux display-message -p '#{session_name}' 2>/dev/null) 2>/dev/null; tmux set-option -q status-style 'bg=#3c3836,fg=#665c54' 2>/dev/null; true", - "source": "user", - "sourcePath": "/Users/ktg/.claude/settings.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks-handlers/session-start.sh\"", - "source": "plugin:explanatory-output-style", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/explanatory-output-style/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": null, - "command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/pretooluse.py", - "source": "plugin:hookify", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": null, - "command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/posttooluse.py", - "source": "plugin:hookify", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/stop.py", - "source": "plugin:hookify", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/userpromptsubmit.py", - "source": "plugin:hookify", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/hookify/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks-handlers/session-start.sh\"", - "source": "plugin:learning-output-style", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/learning-output-style/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh\"", - "source": "plugin:ralph-loop", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/ralph-loop/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Edit|Write|MultiEdit", - "command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/security_reminder_hook.py", - "source": "plugin:security-guidance", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/claude-plugins-official/plugins/security-guidance/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start.mjs", - "source": "plugin:ai-psychosis", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/prompt-analyzer.mjs", - "source": "plugin:ai-psychosis", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/tool-tracker.mjs", - "source": "plugin:ai-psychosis", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionEnd", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-end.mjs", - "source": "plugin:ai-psychosis", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ai-psychosis/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Edit|Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/auto-backup-config.mjs", - "source": "plugin:config-audit", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Edit|Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/post-edit-verify.mjs", - "source": "plugin:config-audit", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start.mjs", - "source": "plugin:config-audit", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop-session-reminder.mjs", - "source": "plugin:config-audit", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start-load-handoff.mjs", - "source": "plugin:graceful-handoff", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/graceful-handoff/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop-context-monitor.mjs", - "source": "plugin:graceful-handoff", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/graceful-handoff/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start.mjs", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/content-gatekeeper.mjs content-quality-gate.md", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/content-gatekeeper.mjs voice-guardian.md", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/content-gatekeeper.mjs topic-rotation-gate.md", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop-reminder.mjs", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/user-prompt-context.mjs", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/content-gatekeeper.mjs post-creation-automation.md --no-session-marker", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact.mjs", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Notification", - "matcher": "idle_prompt", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/posting-reminder.mjs", - "source": "plugin:linkedin-thought-leadership", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/linkedin-thought-leadership/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-prompt-inject-scan.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/update-check.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Edit|Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-edit-secrets.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-bash-destructive.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-install-supply-chain.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-write-pathguard.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/post-mcp-verify.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/post-session-guard.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact-scan.mjs", - "source": "plugin:llm-security", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/llm-security/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start-context.mjs", - "source": "plugin:ms-ai-architect", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop-assessment-reminder.mjs", - "source": "plugin:ms-ai-architect", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ms-ai-architect/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/coaching-hook.mjs", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/inject-okr-context.mjs", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-bash-executor.mjs", - "source": "plugin:ultraplan-local", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-write-executor.mjs", - "source": "plugin:ultraplan-local", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-title.mjs", - "source": "plugin:ultraplan-local", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/post-bash-stats.mjs", - "source": "plugin:ultraplan-local", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact-flush.mjs", - "source": "plugin:ultraplan-local", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/ultraplan-local/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-bash-firewall.mjs", - "source": "plugin:claude-code-essentials", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-essentials/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Edit|Write", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-edit-secrets.mjs", - "source": "plugin:claude-code-essentials", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/claude-code-essentials/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start-orientation.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-lock-detect.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-lock-cleanup.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/harness-event-log.mjs '{\"event\":\"session_end\"}'", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/notify.mjs '{\"event\":\"session_digest\"}'", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionEnd", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-end-archive.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SubagentStop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/subagent-stop-validate.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact-snapshot.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/file-lock-guard.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/feature-list-guard.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "EnterPlanMode", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/enter-plan-mode-intercept.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/dag-validator.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/presence-update.mjs", - "source": "plugin:harness", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/harness/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start-reminder.mjs", - "source": "plugin:kiur", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-bash-firewall.mjs", - "source": "plugin:kiur", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PostToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/post-bash-failure-detector.mjs", - "source": "plugin:kiur", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SubagentStop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/subagent-stop-validate.mjs", - "source": "plugin:kiur", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/pre-compact-snapshot.mjs", - "source": "plugin:kiur", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionEnd", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-end-archive.mjs", - "source": "plugin:kiur", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/kiur/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/coaching-hook.mjs", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/inject-okr-context.mjs", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreCompact", - "matcher": null, - "command": "", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "", - "source": "plugin:okr", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/okr/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "UserPromptSubmit", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/validate-input.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/validate-output.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Bash", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/audit-log.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/filter-secrets.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/validate-code.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "PreToolUse", - "matcher": "Write|Edit", - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/audit-log.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/check-integrity.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "Stop", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/stop-workflow-reminder.mjs", - "source": "plugin:ralph-wiggum", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/ralph-wiggum/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start-stats.mjs", - "source": "plugin:sadhguru-wisdom", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/sadhguru-wisdom/hooks/hooks.json", - "estimatedTokens": 15 - }, - { - "event": "SessionStart", - "matcher": null, - "command": "node ${CLAUDE_PLUGIN_ROOT}/hooks/scripts/session-start-stats.mjs", - "source": "plugin:vegnormalene", - "sourcePath": "/Users/ktg/.claude/plugins/marketplaces/ktg-privat/plugins/vegnormalene/hooks/hooks.json", - "estimatedTokens": 15 } ], + "hooks": [], "settings": { "cascade": [ { "scope": "user", - "path": "/Users/ktg/.claude/settings.json", - "exists": true, - "keyCount": 14 + "path": "/var/folders/xc/d_fh7ldj4svc066qgskvx0xr0000gn/T/tmp.rOWg3kmoYU/.claude/settings.json", + "exists": false, + "keyCount": 0 }, { "scope": "project", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.json", "exists": true, "keyCount": 3 }, { "scope": "local", - "path": "/Users/ktg/.claude/plugins/marketplaces/ktg-plugin-marketplace/plugins/config-audit/tests/fixtures/marketplace-medium/.claude/settings.local.json", + "path": "/Users/ktg/repos/ktg-plugin-marketplace/config-audit/tests/fixtures/marketplace-medium/.claude/settings.local.json", "exists": false, "keyCount": 0 } ] }, "totals": { - "plugins": 41, - "skills": 65, - "mcpServers": 3, - "hooks": 93, - "claudeMdFiles": 5, + "plugins": 0, + "skills": 0, + "mcpServers": 1, + "hooks": 0, + "claudeMdFiles": 3, "estimatedTokens": { - "claudeMd": 5716, - "plugins": 180998, - "skills": 145377, - "mcpServers": 1500, - "hooks": 1395, - "grandTotal": 334986 + "claudeMd": 1639, + "plugins": 0, + "skills": 0, + "mcpServers": 500, + "hooks": 0, + "grandTotal": 2139 } }, "suggestDisables": null, "warnings": [] -} \ No newline at end of file +}