cd ~/Claudy && git clone --depth 1 https://github.com/jodunk/everything-claude-code.git ecc-fork && cd ecc-fork && pwd

Clone fork via HTTPS

Cloning into 'ecc-fork'...
/Users/jodunk/Claudy/ecc-fork


Clone fork via HTTPS


cd ~/Claudy/ecc-fork && git checkout -b fix/readme-counts && git remote add upstream https://github.com/affaan-m/everything-claude-code.git

Create feature branch and add upstream

Switched to a new branch 'fix/readme-counts'


Create feature branch and add upstream


### v2.0.0-rc.1 — Surface Refresh, Operator Workflows, and ECC 2.0 Alpha (Apr 2026)

- **Dashboard GUI** — New Tkinter-based desktop application (`ecc_dashboard.py` or `npm run dashboard`) with dark/light theme toggle, font customization, and project logo in header and taskbar.
- **Public surface synced to the live repo** — metadata, catalog counts, plugin manifests, and install-facing docs now match the actual OSS surface: 55 agents, 208 skills, and 72 legacy command shims.
- **Operator and outbound workflow expansion** — `brand-voice`, `social-graph-ranker`, `connections-optimizer`, `customer-billing-ops`, `ecc-tools-cost-audit`, `google-workspace-ops`, `project-flow-ops`, and `workspace-surface-audit` round out the operator lane.


{"type":"text","file":{"filePath":"/Users/jodunk/Claudy/ecc-fork/README.md","content":"---\n\n## What's New\n\n### v2.0.0-rc.1 — Surface Refresh, Operator Workflows, and ECC 2.0 Alpha (Apr 2026)\n\n- **Dashboard GUI** — New Tkinter-based desktop application (`ecc_dashboard.py` or `npm run dashboard`) with dark/light theme toggle, font customization, and project logo in header and taskbar.\n- **Public surface synced to the live repo** — metadata, catalog counts, plugin manifests, and install-facing docs now match the actual OSS surface: 55 agents, 208 skills, and 72 legacy command shims.\n- **Operator and outbound workflow expansion** — `brand-voice`, `social-graph-ranker`, `connections-optimizer`, `customer-billing-ops`, `ecc-tools-cost-audit`, `google-workspace-ops`, `project-flow-ops`, and `workspace-surface-audit` round out the operator lane.\n- **Media and launch tooling** — `manim-video`, `remotion-video-creation`, and upgraded social publishing surfaces make technical explainers and launch content part of the same system.\n- **Framework and product surface growth** — `nestjs-patterns`, richer Codex/OpenCode install surfaces, and expanded cross-harness packaging keep the repo usable beyond Claude Code alone.\n- **ECC 2.0 alpha is in-tree** — the Rust control-plane prototype in `ecc2/` now builds locally and exposes `dashboard`, `start`, `sessions`, `status`, `stop`, `resume`, and `daemon` commands. It is usable as an alpha, not yet a general release.\n- **Operator status snapshots** — `ecc status --markdown --write status.md` turns the local state store into a portable handoff covering readiness, active sessions, skill-run health, install health, pending governance events, and linked work items from Linear/GitHub/handoffs. Use `ecc work-items upsert ...` for manual entries, `ecc work-items sync-github --repo owner/repo` for PR/issue queue state, and `ecc status --exit-code` to fail automation when readiness needs attention.\n- **Ecosystem hardening** — AgentShi


rtk grep -r "README" --include="*.js" --include="*.json" --include="*.md" | grep -i "import\|require\|readme" | head -20

Find files importing or referencing README.md

{"stdout":"./.trae/README.md:└── README.md           # This file\n./.trae/README.zh-CN.md:└── README.md           # 此文件\n./the-shortform-guide.md:    { \"matcher\": \"Write && .md file\", \"hooks\": [\"block unless README/CLAUDE\"] },\n./CHANGELOG.md:- Updated package, plugin, marketplace, OpenCode, agent, and README metadata to `2.0.0-rc.1`.\n./CHANGELOG.md:- Korean (ko-KR) translation — README, agents, commands, skills, rules (#392)\n./TROUBLESHOOTING.md:- [README.md](./README.md) - Installation and features\n./WORKING-CONTEXT.md:- 2026-04-01: Core English repo surfaces were shifted to a skills-first posture. README, AGENTS, plugin metadata, and contributor instructions now treat `skills/` as canonical and `commands/` as legacy slash-entry compatibility during migration.\n./WORKING-CONTEXT.md:- 2026-04-05: Shipped `846ffb7` (`chore: ship v1.10.0 release surface refresh`). This updated README/plugin metadata/package versions, synced the explicit plugin agent inventory, bumped stale star/fork/contributor counts, created `docs/releases/1.10.0/*`, tagged and released `v1.10.0`, and posted the announcement discussion at `#1272`.\n./WORKING-CONTEXT.md:- 2026-04-05: Ported the safe localized README switcher fixes from PR `#1209` directly into `main` rather than merging the docs PR wholesale. The navigation now consistently includes `Português (Brasil)` and `Türkçe` across the localized README switchers, while newer localized body copy stays intact.\n./WORKING-CONTEXT.md:- 2026-04-05: Direct-ported the safe README-only `#1285` slice into `main` instead of merging the branch: added a small `Community Projects` section so downstream teams can link public work built on ECC without changing install, security, or runtime surfaces. Rejected `#1286` at review because it adds an external third-party GitHub Action (`hashgraph-online/codex-plugin-scanner`) that does not meet the current supply-chain policy.\n./.opencode/README.md:> WARNING: This README is specific to OpenCode usage


{"filePath":"/Users/jodunk/Claudy/ecc-fork/README.md","oldString":"- **Public surface synced to the live repo** — metadata, catalog counts, plugin manifests, and install-facing docs now match the actual OSS surface: 55 agents, 208 skills, and 72 legacy command shims.","newString":"- **Public surface synced to the live repo** — metadata, catalog counts, plugin manifests, and install-facing docs now match the actual OSS surface: 60 agents, 228 skills, and 75 legacy command shims.","originalFile":"**Language:** English | [Português (Brasil)](docs/pt-BR/README.md) | [简体中文](README.zh-CN.md) | [繁體中文](docs/zh-TW/README.md) | [日本語](docs/ja-JP/README.md) | [한국어](docs/ko-KR/README.md) | [Türkçe](docs/tr/README.md) | [Русский](docs/ru/README.md) | [Tiếng Việt](docs/vi-VN/README.md)\n\n# Everything Claude Code\n\n![Everything Claude Code — the performance system for AI agent harnesses](assets/hero.png)\n\n[![Stars](https://img.shields.io/github/stars/affaan-m/everything-claude-code?style=flat)](https://github.com/affaan-m/everything-claude-code/stargazers)\n[![Forks](https://img.shields.io/github/forks/affaan-m/everything-claude-code?style=flat)](https://github.com/affaan-m/everything-claude-code/network/members)\n[![Contributors](https://img.shields.io/github/contributors/affaan-m/everything-claude-code?style=flat)](https://github.com/affaan-m/everything-claude-code/graphs/contributors)\n[![npm ecc-universal](https://img.shields.io/npm/dw/ecc-universal?label=ecc-universal%20weekly%20downloads&logo=npm)](https://www.npmjs.com/package/ecc-universal)\n[![npm ecc-agentshield](https://img.shields.io/npm/dw/ecc-agentshield?label=ecc-agentshield%20weekly%20downloads&logo=npm)](https://www.npmjs.com/package/ecc-agentshield)\n[![GitHub App Install](https://img.shields.io/badge/GitHub%20App-150%20installs-2ea44f?logo=github)](https://github.com/marketplace/ecc-tools)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n![Shell](https://img.shields.io/badge/-Shell-4


rtk git add README.md && rtk git commit -m "$(cat <<'EOF'
fix: update catalog counts in v2.0.0-rc.1 release notes

Updated agent/skill/command counts to match actual filesystem:
- Agents: 55 → 60
- Skills: 208 → 228
- Commands: 72 → 75

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
EOF
)"

Commit README count fix

ok 1 file changed, 1 insertion(+), 1 deletion(-)
ok fix/rea


Commit README count fix


rtk git push -u origin fix/readme-counts

Push branch to remote


Push branch to remote


rtk gh pr create --repo affaan-m/everything-claude-code --title "fix: Update catalog counts in v2.0.0-rc.1 release notes" --body "$(cat <<'EOF'
## Summary
- Updated agent/skill/command counts in v2.0.0-rc.1 release notes to match actual filesystem
- Verified counts via `find` commands against actual directories

## Changes
- **Agents**: 55 → 60 (+5)
- **Skills**: 208 → 228 (+20)
- **Commands**: 72 → 75 (+3)

## Test plan
- [x] Verified agent count: `find agents/ -name '*.md' | wc -l` → 60
- [x] Verified skill count: `find skills/ -name 'SKILL.md' | wc -l` → 228
- [x] Verified command count: `find commands/ -name '*.md' | wc -l` → 75
- [x] Checked no other count discrepancies in README

---

🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"

Create PR to upstream


Create PR to upstream


Check git status

* fix/readme-counts
? Untracked: 1 files
   .caliber/


Check git status


rtk gh pr create --repo affaan-m/everything-claude-code --head jodunk:fix/readme-counts --title "fix: Update catalog counts in v2.0.0-rc.1 release notes" --body "$(cat <<'EOF'
## Summary
- Updated agent/skill/command counts in v2.0.0-rc.1 release notes to match actual filesystem
- Verified counts via `find` commands against actual directories

## Changes
- **Agents**: 55 → 60 (+5)
- **Skills**: 208 → 228 (+20)
- **Commands**: 72 → 75 (+3)

## Test plan
- [x] Verified agent count: `find agents/ -name '*.md' | wc -l` → 60
- [x] Verified skill count: `find skills/ -name 'SKILL.md' | wc -l` → 228
- [x] Verified command count: `find commands/ -name '*.md' | wc -l` → 75
- [x] Checked no other count discrepancies in README

---

🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"

Create PR with explicit head branch

ok created #1897 https://github.com/affaan-m/everything-claude-code/pull/1897


Create PR with explicit head branch


find . -name "*IMPROVEMENT*" -o -name "*improvement*" 2>/dev/null | head -10

Find improvement docs


Find improvement docs


{"type":"text","file":{"filePath":"/Users/jodunk/Claudy/ecc-fork/docs/ARCHITECTURE-IMPROVEMENTS.md","content":"# Architecture Improvement Recommendations\n\nThis document captures architect-level improvements for the Everything Claude Code (ECC) project. It is written from the perspective of a Claude Code coding architect aiming to improve maintainability, consistency, and long-term quality.\n\n---\n\n## 1. Documentation and Single Source of Truth\n\n### 1.1 Agent / Command / Skill Count Sync\n\n**Issue:** AGENTS.md states \"13 specialized agents, 50+ skills, 33 commands\" while the repo has **16 agents**, **65+ skills**, and **40 commands**. README and other docs also vary. This causes confusion for contributors and users.\n\n**Recommendation:**\n\n- **Single source of truth:** Derive counts (and optionally tables) from the filesystem or a small manifest. Options:\n  - **Option A:** Add a script (e.g. `scripts/ci/catalog.js`) that scans `agents/*.md`, `commands/*.md`, and `skills/*/SKILL.md` and outputs JSON/Markdown. CI and docs can consume this.\n  - **Option B:** Maintain one `docs/catalog.json` (or YAML) that lists agents, commands, and skills with metadata; scripts and docs read from it. Requires discipline to update on add/remove.\n- **Short-term:** Manually sync AGENTS.md, README.md, and CLAUDE.md with actual counts and list any new agents (e.g. chief-of-staff, loop-operator, harness-optimizer) in the agent table.\n\n**Impact:** High — affects first impression and contributor trust.\n\n---\n\n### 1.2 Command → Agent / Skill Map\n\n**Issue:** There is no single machine- or human-readable map of \"which command uses which agent(s) or skill(s).\" This lives in README tables and individual command `.md` files, which can drift.\n\n**Recommendation:**\n\n- Add a **command registry** (e.g. in `docs/` or as frontmatter in command files) that lists for each command: name, description, primary agent(s), skills referenced. Can be generated from command file content or


{"type":"text","file":{"filePath":"/Users/jodunk/Claudy/ecc-fork/docs/ARCHITECTURE-IMPROVEMENTS.md","content":"\n- Document a **translation process:** when to update (e.g. on release), who owns each locale, and how to detect stale content (e.g. diff file lists or key sections).\n- Consider: translation status file (e.g. `docs/i18n-status.md`) or CI that checks translation file existence/timestamps and warns if English was updated more recently than a translation.\n- Long-term: consider extraction/placeholder format (e.g. i18n keys) so translations reference the same structure as the English source.\n\n**Impact:** Medium — improves experience for non-English users and reduces confusion from outdated translations.\n\n---\n\n## 5. Hooks and Scripts\n\n### 5.1 Hook Runtime Consistency\n\n**Issue:** Hooks should keep a consistent Node-mode dispatch surface. Continuous-learning observation now dispatches through `run-with-flags.js` and `observe-runner.js`, which delegates to the existing `observe.sh` implementation without exposing a shell-mode hook entry.\n\n**Recommendation:**\n\n- Prefer Node for new hooks when possible (cross-platform, single runtime). If shell is required, document why and keep the surface small.\n- Ensure `ECC_HOOK_PROFILE` and `ECC_DISABLED_HOOKS` are respected in all code paths (including shell) so behavior is consistent.\n\n**Impact:** Low — maintains current design; improves if more hooks migrate to Node.\n\n---\n\n## 6. Summary Table\n\n| Area              | Improvement                          | Priority | Effort  |\n|-------------------|--------------------------------------|----------|---------|\n| Doc sync          | Sync AGENTS.md/README counts & table | High     | Low     |\n| Single source     | Catalog script or manifest           | High     | Medium  |\n| Test discovery    | Glob-based test runner               | High     | Low     |\n| Coverage          | Add c8/nyc and CI coverage           | Medium   | Medium  |\n| Hook schema in CI


Week 2 เริ่มต่อ


rtk ls -la scripts/ci/ | grep -i catalog

Check for existing catalog script


Check for existing catalog script


#!/usr/bin/env node
/**
 * Verify repo catalog counts against tracked documentation files.
 *
 * Usage:
 *   node scripts/ci/catalog.js
 *   node scripts/ci/catalog.js --json
 *   node scripts/ci/catalog.js --md
 *   node scripts/ci/catalog.js --text
 *   node scripts/ci/catalog.js --write --text
 */

'use strict';

const fs = require('fs');
const path = require('path');

const ROOT = path.join(__dirname, '../..');
const README_PATH = path.join(ROOT, 'README.md');
const AGENTS_PATH = path.join(ROOT, 'AGENTS.md');
const README_ZH_CN_PATH = path.join(ROOT, 'README.zh-CN.md');
const DOCS_ZH_CN_README_PATH = path.join(ROOT, 'docs', 'zh-CN', 'README.md');
const DOCS_ZH_CN_AGENTS_PATH = path.join(ROOT, 'docs', 'zh-CN', 'AGENTS.md');
const PLUGIN_JSON_PATH = path.join(ROOT, '.claude-plugin', 'plugin.json');
const MARKETPLACE_JSON_PATH = path.join(ROOT, '.claude-plugin', 'marketplace.json');
const WRITE_MODE = process.argv.includes('--write');

const OUTPUT_MODE = process.argv.includes('--md')
  ? 'md'
  : process.argv.includes('--text')
    ? 'text'
    : 'json';

function normalizePathSegments(relativePath) {
  return relativePath.split(path.sep).join('/');
}

function listMatchingFiles(root, relativeDir, matcher) {
  const directory = path.join(root, relativeDir);
  if (!fs.existsSync(directory)) {
    return [];
  }

  return fs.readdirSync(directory, { withFileTypes: true })
    .filter(entry => matcher(entry))
    .map(entry => normalizePathSegments(path.join(relativeDir, entry.name)))
    .sort();
}

function buildCatalog(root = ROOT) {


{"type":"text","file":{"filePath":"/Users/jodunk/Claudy/ecc-fork/scripts/ci/catalog.js","content":"function buildCatalog(root = ROOT) {\n  const agents = listMatchingFiles(root, 'agents', entry => entry.isFile() && entry.name.endsWith('.md'));\n  const commands = listMatchingFiles(root, 'commands', entry => entry.isFile() && entry.name.endsWith('.md'));\n  const skills = listMatchingFiles(root, 'skills', entry => (\n    entry.isDirectory() && fs.existsSync(path.join(root, 'skills', entry.name, 'SKILL.md'))\n  )).map(skillDir => `${skillDir}/SKILL.md`);\n\n  return {\n    agents: { count: agents.length, files: agents, glob: 'agents/*.md' },\n    commands: { count: commands.length, files: commands, glob: 'commands/*.md' },\n    skills: { count: skills.length, files: skills, glob: 'skills/*/SKILL.md' }\n  };\n}\n\nfunction readFileOrThrow(filePath) {\n  try {\n    return fs.readFileSync(filePath, 'utf8');\n  } catch (error) {\n    throw new Error(`Failed to read ${path.basename(filePath)}: ${error.message}`);\n  }\n}\n\nfunction writeFileOrThrow(filePath, content) {\n  try {\n    fs.writeFileSync(filePath, content, 'utf8');\n  } catch (error) {\n    throw new Error(`Failed to write ${path.basename(filePath)}: ${error.message}`);\n  }\n}\n\nfunction replaceOrThrow(content, regex, replacer, source) {\n  if (!regex.test(content)) {\n    throw new Error(`${source} is missing the expected catalog marker`);\n  }\n\n  return content.replace(regex, replacer);\n}\n\nfunction parseReadmeExpectations(readmeContent) {\n  const expectations = [];\n\n  const quickStartMatch = readmeContent.match(\n    /access to\\s+(\\d+)\\s+agents,\\s+(\\d+)\\s+skills,\\s+and\\s+(\\d+)\\s+(?:commands|legacy command shims?)/i\n  );\n  if (!quickStartMatch) {\n    throw new Error('README.md is missing the quick-start catalog summary');\n  }\n\n  expectations.push(\n    { category: 'agents', mode: 'exact', expected: Number(quickStartMatch[1]), source: 'README.md quick-start summary' },\n    { category


Run catalog script to check counts

{"stdout":"{\n  \"catalog\": {\n    \"agents\": {\n      \"count\": 60,\n      \"files\": [\n        \"agents/a11y-architect.md\",\n        \"agents/architect.md\",\n        \"agents/build-error-resolver.md\",\n        \"agents/chief-of-staff.md\",\n        \"agents/code-architect.md\",\n        \"agents/code-explorer.md\",\n        \"agents/code-reviewer.md\",\n        \"agents/code-simplifier.md\",\n        \"agents/comment-analyzer.md\",\n        \"agents/conversation-analyzer.md\",\n        \"agents/cpp-build-resolver.md\",\n        \"agents/cpp-reviewer.md\",\n        \"agents/csharp-reviewer.md\",\n        \"agents/dart-build-resolver.md\",\n        \"agents/database-reviewer.md\",\n        \"agents/django-build-resolver.md\",\n        \"agents/django-reviewer.md\",\n        \"agents/doc-updater.md\",\n        \"agents/docs-lookup.md\",\n        \"agents/e2e-runner.md\",\n        \"agents/fastapi-reviewer.md\",\n        \"agents/flutter-reviewer.md\",\n        \"agents/fsharp-reviewer.md\",\n        \"agents/gan-evaluator.md\",\n        \"agents/gan-generator.md\",\n        \"agents/gan-planner.md\",\n        \"agents/go-build-resolver.md\",\n        \"agents/go-reviewer.md\",\n        \"agents/harmonyos-app-resolver.md\",\n        \"agents/harness-optimizer.md\",\n        \"agents/healthcare-reviewer.md\",\n        \"agents/homelab-architect.md\",\n        \"agents/java-build-resolver.md\",\n        \"agents/java-reviewer.md\",\n        \"agents/kotlin-build-resolver.md\",\n        \"agents/kotlin-reviewer.md\",\n        \"agents/loop-operator.md\",\n        \"agents/mle-reviewer.md\",\n        \"agents/network-architect.md\",\n        \"agents/network-config-reviewer.md\",\n        \"agents/network-troubleshooter.md\",\n        \"agents/opensource-forker.md\",\n        \"agents/opensource-packager.md\",\n        \"agents/opensource-sanitizer.md\",\n        \"agents/performance-optimizer.md\",\n        \"agents/planner.md\",\n        \"agents/pr-test-analyzer


Run catalog script to check counts


rtk read package.json | grep -A 5 -B 5 "c8\|coverage\|nyc"

Check if c8/coverage is configured

    "claw": "node scripts/claw.js",
    "orchestrate:status": "node scripts/orchestration-status.js",
    "orchestrate:worker": "bash scripts/orchestrate-codex-worker.sh",
    "orchestrate:tmux": "node scripts/orchestrate-worktrees.js",
    "test": "node scripts/ci/check-unicode-safety.js && node scripts/ci/validate-agents.js && node scripts/ci/validate-commands.js && node scripts/ci/validate-rules.js && node scripts/ci/validate-skills.js && node scripts/ci/validate-hooks.js && node scripts/ci/validate-install-manifests.js && node scripts/ci/validate-no-personal-paths.js && npm run catalog:check && node tests/run-all.js",
    "coverage": "c8 --all --include=\"scripts/**/*.js\" --check-coverage --lines 80 --functions 80 --branches 80 --statements 80 --reporter=text --reporter=lcov node tests/run-all.js",
    "build:opencode": "node scripts/build-opencode.js",
    "prepack": "npm run build:opencode",
    "dashboard": "python3 ./ecc_dashboard.py"
  },
  "dependencies": {
--
  },
  "devDependencies": {
    "@eslint/js": "^9.39.2",
    "@opencode-ai/plugin": "^1.0.0",
    "@types/node": "^20.19.24",
    "c8": "^11.0.0",
    "eslint": "^9.39.2",
    "globals": "^17.4.0",
    "markdownlint-cli": "^0.48.0",
    "typescript": "^5.9.3"
  },


Check if c8/coverage is configured


rtk read .github/workflows/*.yml 2>/dev/null | grep -i "coverage\|c8" | head -5

Check if coverage runs in CI


Check if coverage runs in CI


List CI workflow files

ci.yml  8.4K
maintenance.yml  1.6K
monthly-metrics.yml  6.7K
release.yml  3.8K
reusable-release.yml  4.1K
reusable-test.yml  5.5K
reusable-validate.yml  1.4K


List CI workflow files


{"type":"text","file":{"filePath":"/Users/jodunk/Claudy/ecc-fork/.github/workflows/reusable-test.yml","content":"name: Reusable Test Workflow\n\non:\n  workflow_call:\n    inputs:\n      os:\n        description: 'Operating system'\n        required: false\n        type: string\n        default: 'ubuntu-latest'\n      node-version:\n        description: 'Node.js version'\n        required: false\n        type: string\n        default: '20.x'\n      package-manager:\n        description: 'Package manager to use'\n        required: false\n        type: string\n        default: 'npm'\n\njobs:\n  test:\n    name: Test\n    runs-on: ${{ inputs.os }}\n    timeout-minutes: 10\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n\n      - name: Setup Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: ${{ inputs.node-version }}\n\n      - name: Setup pnpm\n        if: inputs.package-manager == 'pnpm' && inputs.node-version != '18.x'\n        uses: pnpm/action-setup@91ab88e2619ed1f46221f0ba42d1492c02baf788 # v6.0.6\n        with:\n          # Keep an explicit pnpm major because this repo's packageManager is Yarn.\n          version: 10\n\n      - name: Setup pnpm (via Corepack)\n        if: inputs.package-manager == 'pnpm' && inputs.node-version == '18.x'\n        shell: bash\n        run: |\n          corepack enable\n          corepack prepare pnpm@9 --activate\n\n      - name: Setup Yarn (via Corepack)\n        if: inputs.package-manager == 'yarn'\n        shell: bash\n        run: |\n          corepack enable\n          corepack prepare yarn@stable --activate\n\n      - name: Setup Bun\n        if: inputs.package-manager == 'bun'\n        uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2\n\n      - name: Get npm cache directory\n        if: inputs.package-manager == 'npm'\n        id: npm-cache-dir\n


      - name: Run tests
        run: node tests/run-all.js
        env:
          CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }}

      - name: Upload test artifacts

      - name: Run tests
        run: node tests/run-all.js
        env:
          CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }}

      - name: Run coverage
        run: npm run coverage
        continue-on-error: true
        env:
          CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }}

      - name: Upload coverage reports
        if: always()
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: coverage-${{ inputs.os }}-node${{ inputs.node-version }}-${{ inputs.package-manager }}
          path: |
            coverage/
            *.lcov

      - name: Upload test artifacts

{"filePath":"/Users/jodunk/Claudy/ecc-fork/.github/workflows/reusable-test.yml","oldString":"      - name: Run tests\n        run: node tests/run-all.js\n        env:\n          CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }}\n\n      - name: Upload test artifacts","newString":"      - name: Run tests\n        run: node tests/run-all.js\n        env:\n          CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }}\n\n      - name: Run coverage\n        run: npm run coverage\n        continue-on-error: true\n        env:\n          CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }}\n\n      - name: Upload coverage reports\n        if: always()\n        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n        with:\n          name: coverage-${{ inputs.os }}-node${{ inputs.node-version }}-${{ inputs.package-manager }}\n          path: |\n            coverage/\n            *.lcov\n\n      - name: Upload test artifacts","originalFile":"name: Reusable Test Workflow\n\non:\n  workflow_call:\n    inputs:\n      os:\n        description: 'Operating system'\n        required: false\n        type: string\n        default: 'ubuntu-latest'\n      node-version:\n        description: 'Node.js version'\n        required: false\n        type: string\n        default: '20.x'\n      package-manager:\n        description: 'Package manager to use'\n        required: false\n        type: string\n        default: 'npm'\n\njobs:\n  test:\n    name: Test\n    runs-on: ${{ inputs.os }}\n    timeout-minutes: 10\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n\n      - name: Setup Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: ${{ inputs.node-version }}\n\n      - name: Setup pnpm\n        if: inputs.package-manager == 'pnpm' && inputs.node-version != '18.x'\n        uses: pnpm/actio


rtk git add .github/workflows/reusable-test.yml && rtk git commit -m "$(cat <<'EOF'
feat: add coverage reporting to CI

- Run npm run coverage in test workflow (non-blocking)
- Upload coverage artifacts for visibility
- Uses existing c8 configuration with 80% baseline

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
EOF
)" && rtk git push

Commit and push coverage CI changes

ok 1 file changed, 15 insertions(+)
ok fix/rea
ok fix/readme-counts


Commit and push coverage CI changes


find . -name "*command*map*" -o -name "*map*command*" -o -name "*registry*" | grep -v node_modules | head -10

Find existing command map/registry files


#!/usr/bin/env node
/**
 * Generate Command → Agent/Skill Registry
 *
 * Scans all command markdown files and extracts:
 * - Command name/description
 * - Primary agent(s) referenced
 * - Skills referenced
 * - Command type (workflow, testing, review, etc.)
 *
 * Usage:
 *   node scripts/ci/generate-command-registry.js
 *   node scripts/ci/generate-command-registry.js --json
 *   node scripts/ci/generate-command-registry.js --write
 */

'use strict';

const fs = require('fs');
const path = require('path');

const ROOT = path.join(__dirname, '../..');
const COMMANDS_DIR = path.join(ROOT, 'commands');
const AGENTS_DIR = path.join(ROOT, 'agents');
const OUTPUT_PATH = path.join(ROOT, 'docs', 'COMMAND-REGISTRY.json');
const WRITE_MODE = process.argv.includes('--write');
const OUTPUT_JSON = process.argv.includes('--json');

const KNOWN_AGENTS = new Set();
const KNOWN_SKILLS = new Set();

// Scan agents directory for known agents
function scanKnownAgents() {
  if (!fs.existsSync(AGENTS_DIR)) return;

  const files = fs.readdirSync(AGENTS_DIR, { withFileTypes: true });
  files.forEach(entry => {
    if (entry.isFile() && entry.name.endsWith('.md')) {
      const agentName = entry.name.replace('.md', '');
      KNOWN_AGENTS.add(agentName);
    }
  });
}

// Scan skills directory for known skills
function scanKnownSkills() {
  const skillsDir = path.join(ROOT, 'skills');
  if (!fs.existsSync(skillsDir)) return;

  const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
  entries.forEach(entry => {
    if (entry.isDirectory() && fs.existsSync(path.join(skillsDir, entry.name, 'SKILL.md'))) {
      KNOWN_SKILLS.add(entry.name);
    }
  });
}

// Extract agents and skills from markdown content
function extractReferences(content) {
  const agents = new Set();
  const skills = new Set();

  // Pattern: @agent-name or agent-name in code blocks, lists, or descriptions
  const agentPatterns = [
    /@([a-z][a-z0-9-]*)/gi,  // @agent-name
    /agent:\s*([a-z][a-z0-9-]*)/gi,  // agent: name
    /subagent(?:_type)?:\s*["']?([a-z][a-z0-9-]*)/gi,  // subagent_type: "name"
  ];

  // Pattern: /skill-name or /command-name
  const skillPatterns = [
    /\/([a-z][a-z0-9-]*)/gi,  // /skill-name
    /skill:\s*\/?([a-z][a-z0-9-]*)/gi,  // skill: /name or skill: name
  ];

  // Extract agents
  agentPatterns.forEach(pattern => {
    const matches = content.matchAll(pattern);
    for (const match of matches) {
      const ref = match[1];
      if (KNOWN_AGENTS.has(ref)) {
        agents.add(ref);
      }
    }
  });

  // Extract skills
  skillPatterns.forEach(pattern => {
    const matches = content.matchAll(pattern);
    for (const match of matches) {
      const ref = match[1];
      if (KNOWN_SKILLS.has(ref)) {
        skills.add(ref);
      }
    }
  });

  return {
    agents: Array.from(agents).sort(),
    skills: Array.from(skills).sort()
  };
}

// Infer command type from content
function inferCommandType(content, filename) {
  const lower = content.toLowerCase();

  if (lower.includes('test') || lower.includes('tdd') || lower.includes('coverage')) {
    return 'testing';
  }
  if (lower.includes('review') || lower.includes('audit') || lower.includes('quality')) {
    return 'review';
  }
  if (lower.includes('plan') || lower.includes('design') || lower.includes('architecture')) {
    return 'planning';
  }
  if (lower.includes('refactor') || lower.includes('clean') || lower.includes('simplify')) {
    return 'refactoring';
  }
  if (lower.includes('build') || lower.includes('compile') || lower.includes('setup')) {
    return 'build';
  }
  if (filename.startsWith('multi-')) {
    return 'orchestration';
  }

  return 'general';
}

// Process single command file
function processCommandFile(filename) {
  const filePath = path.join(COMMANDS_DIR, filename);
  const content = fs.readFileSync(filePath, 'utf8');

  // Extract description from frontmatter or first heading
  let description = '';
  const frontmatterMatch = content.match(/^---\n[\s\S]*?\ndescription:\s*(.+?)\n[\s\S]*?^---/m);
  if (frontmatterMatch) {
    description = frontmatterMatch[1].trim();
  } else {
    const headingMatch = content.match(/^#\s+(.+)$/m);
    if (headingMatch) {
      description = headingMatch[1].trim();
    }
  }

  const commandName = filename.replace('.md', '');
  const references = extractReferences(content);
  const type = inferCommandType(content, filename);

  return {
    command: commandName,
    description,
    type,
    primaryAgents: references.agents.slice(0, 3), // Top 3 agents
    allAgents: references.agents,
    skills: references.skills,
    path: `commands/${filename}`
  };
}

// Generate full registry
function generateRegistry() {
  scanKnownAgents();
  scanKnownSkills();

  if (!fs.existsSync(COMMANDS_DIR)) {
    console.error('commands/ directory not found');
    process.exit(1);
  }

  const files = fs.readdirSync(COMMANDS_DIR, { withFileTypes: true })
    .filter(entry => entry.isFile() && entry.name.endsWith('.md'))
    .map(entry => entry.name)
    .sort();

  const registry = {
    generated: new Date().toISOString(),
    totalCommands: files.length,
    commands: files.map(processCommandFile)
  };

  // Add statistics
  const typeCounts = {};
  const agentUsage = {};
  const skillUsage = {};

  registry.commands.forEach(cmd => {
    typeCounts[cmd.type] = (typeCounts[cmd.type] || 0) + 1;
    cmd.allAgents.forEach(agent => {
      agentUsage[agent] = (agentUsage[agent] || 0) + 1;
    });
    cmd.skills.forEach(skill => {
      skillUsage[skill] = (skillUsage[skill] || 0) + 1;
    });
  });

  registry.statistics = {
    byType: typeCounts,
    topAgents: Object.entries(agentUsage)
      .sort((a, b) => b[1] - a[1])
      .slice(0, 10)
      .map(([agent, count]) => ({ agent, count })),
    topSkills: Object.entries(skillUsage)
      .sort((a, b) => b[1] - a[1])
      .slice(0, 10)
      .map(([skill, count]) => ({ skill, count }))
  };

  return registry;
}

// Main execution
function main() {
  const registry = generateRegistry();

  if (OUTPUT_JSON) {
    console.log(JSON.stringify(registry, null, 2));
  } else {
    console.log('\n📊 Command Registry Statistics\n');
    console.log(`Total commands: ${registry.totalCommands}`);
    console.log('\nBy type:');
    Object.entries(registry.statistics.byType)
      .sort((a, b) => b[1] - a[1])
      .forEach(([type, count]) => {
        console.log(`  ${type}: ${count}`);
      });

    console.log('\nTop 10 agents:');
    registry.statistics.topAgents.forEach(({ agent, count }) => {
      console.log(`  ${agent}: ${count} commands`);
    });

    console.log('\nTop 10 skills:');
    registry.statistics.topSkills.forEach(({ skill, count }) => {
      console.log(`  ${skill}: ${count} commands`);
    });

    console.log(`\n📄 Generated: ${registry.generated}`);
  }

  if (WRITE_MODE) {
    fs.mkdirSync(path.dirname(OUTPUT_PATH), { recursive: true });
    fs.writeFileSync(OUTPUT_PATH, JSON.stringify(registry, null, 2) + '\n');
    console.log(`\n✅ Registry written to: ${OUTPUT_PATH}`);
  }
}

main();

{"type":"create","filePath":"/Users/jodunk/Claudy/ecc-fork/scripts/ci/generate-command-registry.js","content":"#!/usr/bin/env node\n/**\n * Generate Command → Agent/Skill Registry\n *\n * Scans all command markdown files and extracts:\n * - Command name/description\n * - Primary agent(s) referenced\n * - Skills referenced\n * - Command type (workflow, testing, review, etc.)\n *\n * Usage:\n *   node scripts/ci/generate-command-registry.js\n *   node scripts/ci/generate-command-registry.js --json\n *   node scripts/ci/generate-command-registry.js --write\n */\n\n'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst ROOT = path.join(__dirname, '../..');\nconst COMMANDS_DIR = path.join(ROOT, 'commands');\nconst AGENTS_DIR = path.join(ROOT, 'agents');\nconst OUTPUT_PATH = path.join(ROOT, 'docs', 'COMMAND-REGISTRY.json');\nconst WRITE_MODE = process.argv.includes('--write');\nconst OUTPUT_JSON = process.argv.includes('--json');\n\nconst KNOWN_AGENTS = new Set();\nconst KNOWN_SKILLS = new Set();\n\n// Scan agents directory for known agents\nfunction scanKnownAgents() {\n  if (!fs.existsSync(AGENTS_DIR)) return;\n\n  const files = fs.readdirSync(AGENTS_DIR, { withFileTypes: true });\n  files.forEach(entry => {\n    if (entry.isFile() && entry.name.endsWith('.md')) {\n      const agentName = entry.name.replace('.md', '');\n      KNOWN_AGENTS.add(agentName);\n    }\n  });\n}\n\n// Scan skills directory for known skills\nfunction scanKnownSkills() {\n  const skillsDir = path.join(ROOT, 'skills');\n  if (!fs.existsSync(skillsDir)) return;\n\n  const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n  entries.forEach(entry => {\n    if (entry.isDirectory() && fs.existsSync(path.join(skillsDir, entry.name, 'SKILL.md'))) {\n      KNOWN_SKILLS.add(entry.name);\n    }\n  });\n}\n\n// Extract agents and skills from markdown content\nfunction extractReferences(content) {\n  const agents = new Set();\n  const skills = new Set();\n\n  // Patter


node scripts/ci/generate-command-registry.js | head -40

Test command registry generator

📊 Command Registry Statistics

Total commands: 75

By type:
  testing: 52
  review: 11
  general: 8
  build: 2
  refactoring: 1
  planning: 1

Top 10 agents:

Top 10 skills:
  continuous-learning-v2: 6 commands
  tdd-workflow: 3 commands
  flutter-dart-code-review: 3 commands
  rust-patterns: 3 commands
  cpp-coding-standards: 2 commands
  cpp-testing: 2 commands
  ecc-guide: 2 commands
  security-scan: 2 commands
  golang-patterns: 2 commands
  golang-testing: 2 commands

📄 Generated: 2026-05-14T18:36:24.257Z


Test command registry generator


Generate and write command registry

📊 Command Registry Statistics

Total commands: 75

By type:
  testing: 52
  review: 11
  general: 8
  build: 2
  refactoring: 1
  planning: 1

Top 10 agents:

Top 10 skills:
  continuous-learning-v2: 6 commands
  tdd-workflow: 3 commands
  flutter-dart-code-review: 3 commands
  rust-patterns: 3 commands
  cpp-coding-standards: 2 commands
  cpp-testing: 2 commands
  ecc-guide: 2 commands
  security-scan: 2 commands
  golang-patterns: 2 commands
  golang-testing: 2 commands

📄 Generated: 2026-05-14T18:36:38.210Z

✅ Registry written to: /Users/jodunk/Claudy/ecc-fork/docs/COMMAND-REGISTRY.json


Generate and write command registry


#!/usr/bin/env node
/**
 * Verify repo catalog counts against tracked documentation files.
 *
 * Usage:
 *   node scripts/ci/catalog.js
 *   node scripts/ci/catalog.js --json
 *   node scripts/ci/catalog.js --md
 *   node scripts/ci/catalog.js --text
 *   node scripts/ci/catalog.js --write --text
 */

'use strict';

const fs = require('fs');
const path = require('path');

const ROOT = path.join(__dirname, '../..');
const README_PATH = path.join(ROOT, 'README.md');
const AGENTS_PATH = path.join(ROOT, 'AGENTS.md');
const README_ZH_CN_PATH = path.join(ROOT, 'README.zh-CN.md');
const DOCS_ZH_CN_README_PATH = path.join(ROOT, 'docs', 'zh-CN', 'README.md');
const DOCS_ZH_CN_AGENTS_PATH = path.join(ROOT, 'docs', 'zh-CN', 'AGENTS.md');
const PLUGIN_JSON_PATH = path.join(ROOT, '.claude-plugin', 'plugin.json');
const MARKETPLACE_JSON_PATH = path.join(ROOT, '.claude-plugin', 'marketplace.json');
const WRITE_MODE = process.argv.includes('--write');

const OUTPUT_MODE = process.argv.includes('--md')
  ? 'md'
  : process.argv.includes('--text')


{
  "name": "ecc-universal",
  "version": "2.0.0-rc.1",
  "description": "Complete collection of battle-tested Claude Code configs — agents, skills, hooks, rules, and legacy command shims evolved over 10+ months of intensive daily use by an Anthropic hackathon winner",
  "publishConfig": {
    "access": "public"
  },
  "keywords": [
    "claude-code",
    "ai",
    "agents",
    "skills",
    "hooks",
    "mcp",
    "rules",
    "claude",
    "anthropic",
    "tdd",
    "code-review",
    "security",
    "automation",
    "best-practices",
    "cursor",
    "cursor-ide",
    "opencode",
    "codex",
    "presentations",
    "slides"
  ],
  "author": {


rtk read package.json | grep -A 30 '"scripts"'

Find scripts section in package.json

{"stdout":"  \"scripts\": {\n    \"postinstall\": \"echo '\\\\n  ecc-universal installed!\\\\n  Run: npx ecc typescript\\\\n  Compat: npx ecc-install typescript\\\\n  Docs: https://github.com/affaan-m/everything-claude-code\\\\n'\",\n    \"catalog:check\": \"node scripts/ci/catalog.js --text\",\n    \"catalog:sync\": \"node scripts/ci/catalog.js --write --text\",\n    \"lint\": \"eslint . && markdownlint '**/*.md' --ignore node_modules\",\n    \"harness:adapters\": \"node scripts/harness-adapter-compliance.js\",\n    \"harness:audit\": \"node scripts/harness-audit.js\",\n    \"observability:ready\": \"node scripts/observability-readiness.js\",\n    \"claw\": \"node scripts/claw.js\",\n    \"orchestrate:status\": \"node scripts/orchestration-status.js\",\n    \"orchestrate:worker\": \"bash scripts/orchestrate-codex-worker.sh\",\n    \"orchestrate:tmux\": \"node scripts/orchestrate-worktrees.js\",\n    \"test\": \"node scripts/ci/check-unicode-safety.js && node scripts/ci/validate-agents.js && node scripts/ci/validate-commands.js && node scripts/ci/validate-rules.js && node scripts/ci/validate-skills.js && node scripts/ci/validate-hooks.js && node scripts/ci/validate-install-manifests.js && node scripts/ci/validate-no-personal-paths.js && npm run catalog:check && node tests/run-all.js\",\n    \"coverage\": \"c8 --all --include=\\\"scripts/**/*.js\\\" --check-coverage --lines 80 --functions 80 --branches 80 --statements 80 --reporter=text --reporter=lcov node tests/run-all.js\",\n    \"build:opencode\": \"node scripts/build-opencode.js\",\n    \"prepack\": \"npm run build:opencode\",\n    \"dashboard\": \"python3 ./ecc_dashboard.py\"\n  },\n  \"dependencies\": {\n    \"@iarna/toml\": \"^2.2.5\",\n    \"ajv\": \"^8.18.0\",\n    \"sql.js\": \"^1.14.1\"\n  },\n  \"devDependencies\": {\n    \"@eslint/js\": \"^9.39.2\",\n    \"@opencode-ai/plugin\": \"^1.0.0\",\n    \"@types/node\": \"^20.19.24\",\n    \"c8\": \"^11.0.0\",\n    \"eslint\": \"^9.39.2\",\n    \"globals\": \"^


Find scripts section in package.json


    "catalog:check": "node scripts/ci/catalog.js --text",
    "catalog:sync": "node scripts/ci/catalog.js --write --text",
    "command-registry:generate": "node scripts/ci/generate-command-registry.js",
    "command-registry:write": "node scripts/ci/generate-command-registry.js --write",

{"filePath":"/Users/jodunk/Claudy/ecc-fork/package.json","oldString":"    \"catalog:check\": \"node scripts/ci/catalog.js --text\",\n    \"catalog:sync\": \"node scripts/ci/catalog.js --write --text\",","newString":"    \"catalog:check\": \"node scripts/ci/catalog.js --text\",\n    \"catalog:sync\": \"node scripts/ci/catalog.js --write --text\",\n    \"command-registry:generate\": \"node scripts/ci/generate-command-registry.js\",\n    \"command-registry:write\": \"node scripts/ci/generate-command-registry.js --write\",","originalFile":"{\n  \"name\": \"ecc-universal\",\n  \"version\": \"2.0.0-rc.1\",\n  \"description\": \"Complete collection of battle-tested Claude Code configs — agents, skills, hooks, rules, and legacy command shims evolved over 10+ months of intensive daily use by an Anthropic hackathon winner\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"keywords\": [\n    \"claude-code\",\n    \"ai\",\n    \"agents\",\n    \"skills\",\n    \"hooks\",\n    \"mcp\",\n    \"rules\",\n    \"claude\",\n    \"anthropic\",\n    \"tdd\",\n    \"code-review\",\n    \"security\",\n    \"automation\",\n    \"best-practices\",\n    \"cursor\",\n    \"cursor-ide\",\n    \"opencode\",\n    \"codex\",\n    \"presentations\",\n    \"slides\"\n  ],\n  \"author\": {\n    \"name\": \"Affaan Mustafa\",\n    \"url\": \"https://x.com/affaanmustafa\"\n  },\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/affaan-m/everything-claude-code.git\"\n  },\n  \"homepage\": \"https://github.com/affaan-m/everything-claude-code#readme\",\n  \"bugs\": {\n    \"url\": \"https://github.com/affaan-m/everything-claude-code/issues\"\n  },\n  \"files\": [\n    \".agents/\",\n    \".claude-plugin/\",\n    \".codex/\",\n    \".codex-plugin/\",\n    \".cursor/\",\n    \".gemini/\",\n    \".opencode/\",\n    \".qwen/\",\n    \".mcp.json\",\n    \"AGENTS.md\",\n    \"VERSION\",\n    \"agent.yaml\",\n    \"agents/\",\n    \"comman