diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1177a249..5a8d41c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,10 +43,18 @@ jobs: # Package manager setup - name: Setup pnpm - if: matrix.pm == 'pnpm' - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4 + if: matrix.pm == 'pnpm' && matrix.node != '18.x' + uses: pnpm/action-setup@08c4be7e2e672a47d11bd04269e27e5f3e8529cb # v6.0.0 with: - version: latest + # Keep an explicit pnpm major because this repo's packageManager is Yarn. + version: 10 + + - name: Setup pnpm (via Corepack) + if: matrix.pm == 'pnpm' && matrix.node == '18.x' + shell: bash + run: | + corepack enable + corepack prepare pnpm@9 --activate - name: Setup Yarn (via Corepack) if: matrix.pm == 'yarn' @@ -79,6 +87,8 @@ jobs: if: matrix.pm == 'pnpm' id: pnpm-cache-dir shell: bash + env: + COREPACK_ENABLE_STRICT: '0' run: echo "dir=$(pnpm store path)" >> $GITHUB_OUTPUT - name: Cache pnpm @@ -146,7 +156,7 @@ jobs: # Upload test artifacts on failure - name: Upload test artifacts if: failure() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-${{ matrix.os }}-node${{ matrix.node }}-${{ matrix.pm }} path: | diff --git a/.github/workflows/monthly-metrics.yml b/.github/workflows/monthly-metrics.yml index 27fa5973..1555db22 100644 --- a/.github/workflows/monthly-metrics.yml +++ b/.github/workflows/monthly-metrics.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Update monthly metrics issue - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const owner = context.repo.owner; diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1de1da7d..ec623937 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -77,7 +77,7 @@ jobs: EOF - name: Create GitHub Release - uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2 + uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0 with: body_path: release_body.md generate_release_notes: true diff --git a/.github/workflows/reusable-release.yml b/.github/workflows/reusable-release.yml index e6012659..607c1aa4 100644 --- a/.github/workflows/reusable-release.yml +++ b/.github/workflows/reusable-release.yml @@ -77,7 +77,7 @@ jobs: EOF - name: Create GitHub Release - uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2 + uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0 with: tag_name: ${{ inputs.tag }} body_path: release_body.md diff --git a/.github/workflows/reusable-test.yml b/.github/workflows/reusable-test.yml index c0b144c0..3d650434 100644 --- a/.github/workflows/reusable-test.yml +++ b/.github/workflows/reusable-test.yml @@ -35,10 +35,18 @@ jobs: node-version: ${{ inputs.node-version }} - name: Setup pnpm - if: inputs.package-manager == 'pnpm' - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4 + if: inputs.package-manager == 'pnpm' && inputs.node-version != '18.x' + uses: pnpm/action-setup@08c4be7e2e672a47d11bd04269e27e5f3e8529cb # v6.0.0 with: - version: latest + # Keep an explicit pnpm major because this repo's packageManager is Yarn. + version: 10 + + - name: Setup pnpm (via Corepack) + if: inputs.package-manager == 'pnpm' && inputs.node-version == '18.x' + shell: bash + run: | + corepack enable + corepack prepare pnpm@9 --activate - name: Setup Yarn (via Corepack) if: inputs.package-manager == 'yarn' @@ -70,6 +78,8 @@ jobs: if: inputs.package-manager == 'pnpm' id: pnpm-cache-dir shell: bash + env: + COREPACK_ENABLE_STRICT: '0' run: echo "dir=$(pnpm store path)" >> $GITHUB_OUTPUT - name: Cache pnpm @@ -134,7 +144,7 @@ jobs: - name: Upload test artifacts if: failure() - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-${{ inputs.os }}-node${{ inputs.node-version }}-${{ inputs.package-manager }} path: | diff --git a/.opencode/package-lock.json b/.opencode/package-lock.json index 7c6c07c5..2998e1bc 100644 --- a/.opencode/package-lock.json +++ b/.opencode/package-lock.json @@ -9,7 +9,7 @@ "version": "1.10.0", "license": "MIT", "devDependencies": { - "@opencode-ai/plugin": "^1.0.0", + "@opencode-ai/plugin": "^1.4.3", "@types/node": "^20.0.0", "typescript": "^5.3.0" }, @@ -21,22 +21,37 @@ } }, "node_modules/@opencode-ai/plugin": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.1.53.tgz", - "integrity": "sha512-9ye7Wz2kESgt02AUDaMea4hXxj6XhWwKAG8NwFhrw09Ux54bGaMJFt1eIS8QQGIMaD+Lp11X4QdyEg96etEBJw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.4.3.tgz", + "integrity": "sha512-Ob/3tVSIeuMRJBr2O23RtrnC5djRe01Lglx+TwGEmjrH9yDBJ2tftegYLnNEjRoMuzITgq9LD8168p4pzv+U/A==", "dev": true, "license": "MIT", "dependencies": { - "@opencode-ai/sdk": "1.1.53", + "@opencode-ai/sdk": "1.4.3", "zod": "4.1.8" + }, + "peerDependencies": { + "@opentui/core": ">=0.1.97", + "@opentui/solid": ">=0.1.97" + }, + "peerDependenciesMeta": { + "@opentui/core": { + "optional": true + }, + "@opentui/solid": { + "optional": true + } } }, "node_modules/@opencode-ai/sdk": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.1.53.tgz", - "integrity": "sha512-RUIVnPOP1CyyU32FrOOYuE7Ge51lOBuhaFp2NSX98ncApT7ffoNetmwzqrhOiJQgZB1KrbCHLYOCK6AZfacxag==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.4.3.tgz", + "integrity": "sha512-X0CAVbwoGAjTY2iecpWkx2B+GAa2jSaQKYpJ+xILopeF/OGKZUN15mjqci+L7cEuwLHV5wk3x2TStUOVCa5p0A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "cross-spawn": "7.0.6" + } }, "node_modules/@types/node": { "version": "20.19.33", @@ -48,6 +63,61 @@ "undici-types": "~6.21.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -69,6 +139,22 @@ "dev": true, "license": "MIT" }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/zod": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz", diff --git a/.opencode/package.json b/.opencode/package.json index 92736bcd..729524c9 100644 --- a/.opencode/package.json +++ b/.opencode/package.json @@ -60,7 +60,7 @@ "@opencode-ai/plugin": ">=1.0.0" }, "devDependencies": { - "@opencode-ai/plugin": "^1.0.0", + "@opencode-ai/plugin": "^1.4.3", "@types/node": "^20.0.0", "typescript": "^5.3.0" }, diff --git a/.opencode/plugins/ecc-hooks.ts b/.opencode/plugins/ecc-hooks.ts index 9e4ab3fc..51bde010 100644 --- a/.opencode/plugins/ecc-hooks.ts +++ b/.opencode/plugins/ecc-hooks.ts @@ -456,7 +456,7 @@ export const ECCHooksPlugin: ECCHooksPluginFn = async ({ const contextBlock = [ "# ECC Context (preserve across compaction)", "", - "## Active Plugin: Everything Claude Code v1.8.0", + "## Active Plugin: Everything Claude Code v1.10.0", "- Hooks: file.edited, tool.execute.before/after, session.created/idle/deleted, shell.env, compacting, permission.ask", "- Tools: run-tests, check-coverage, security-audit, format-code, lint-check, git-summary, changed-files", "- Agents: 13 specialized (planner, architect, tdd-guide, code-reviewer, security-reviewer, build-error-resolver, e2e-runner, refactor-cleaner, doc-updater, go-reviewer, go-build-resolver, database-reviewer, python-reviewer)", diff --git a/README.md b/README.md index 40e83e78..ba60652d 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ This repo is the raw code only. The guides explain everything. ### v1.10.0 — 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: 38 agents, 156 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. - **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. @@ -240,6 +241,23 @@ For manual install instructions see the README in the `rules/` folder. When copy **That's it!** You now have access to 47 agents, 181 skills, and 80 legacy command shims. +### Dashboard GUI + +Launch the desktop dashboard to visually explore ECC components: + +```bash +npm run dashboard +# or +python3 ./ecc_dashboard.py +``` + +**Features:** +- Tabbed interface: Agents, Skills, Commands, Rules, Settings +- Dark/Light theme toggle +- Font customization (family & size) +- Project logo in header and taskbar +- Search and filter across all components + ### Multi-model commands require additional setup > WARNING: `multi-*` commands are **not** covered by the base plugin/rules install above. @@ -500,6 +518,12 @@ everything-claude-code/ |-- mcp-configs/ # MCP server configurations | |-- mcp-servers.json # GitHub, Supabase, Vercel, Railway, etc. | +|-- ecc_dashboard.py # Desktop GUI dashboard (Tkinter) +| +|-- assets/ # Assets for dashboard +| |-- images/ +| |-- ecc-logo.png +| |-- marketplace.json # Self-hosted marketplace config (for /plugin marketplace add) ``` @@ -703,12 +727,28 @@ mkdir -p ~/.claude/commands cp everything-claude-code/commands/*.md ~/.claude/commands/ ``` -#### Add hooks to settings.json +#### Install hooks -Manual install only: copy the hooks from `hooks/hooks.json` to your `~/.claude/settings.json` if you are not installing ECC as a Claude plugin. +Do not copy the raw repo `hooks/hooks.json` into `~/.claude/settings.json` or `~/.claude/hooks/hooks.json`. That file is plugin/repo-oriented and still contains `${CLAUDE_PLUGIN_ROOT}` placeholders, so raw copying is not a supported manual install path. + +Use the installer to install only the Claude hook runtime so command paths are rewritten correctly: + +```bash +# macOS / Linux +bash ./install.sh --target claude --modules hooks-runtime +``` + +```powershell +# Windows PowerShell +pwsh -File .\install.ps1 --target claude --modules hooks-runtime +``` + +That writes resolved hooks to `~/.claude/hooks/hooks.json` and leaves any existing `~/.claude/settings.json` untouched. If you installed ECC via `/plugin install`, do not copy those hooks into `settings.json`. Claude Code v2.1+ already auto-loads plugin `hooks/hooks.json`, and duplicating them in `settings.json` causes duplicate execution and `${CLAUDE_PLUGIN_ROOT}` resolution failures. +Windows note: the Claude config directory is `%USERPROFILE%\\.claude`, not `~/claude`. + #### Configure MCPs Copy desired MCP server definitions from `mcp-configs/mcp-servers.json` into your official Claude Code config in `~/.claude/settings.json`, or into a project-scoped `.mcp.json` if you want repo-local MCP access. @@ -973,6 +1013,14 @@ Please contribute! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. - Testing strategies (different frameworks, visual regression) - Domain-specific knowledge (ML, data engineering, mobile) +### Community Ecosystem Notes + +These are not bundled with ECC and are not audited by this repo, but they are worth knowing about if you are exploring the broader Claude Code skills ecosystem: + +- [claude-seo](https://github.com/AgriciDaniel/claude-seo) — SEO-focused skill and agent collection +- [claude-ads](https://github.com/AgriciDaniel/claude-ads) — Ad-audit and paid-growth workflow collection +- [claude-cybersecurity](https://github.com/AgriciDaniel/claude-cybersecurity) — Security-oriented skill and agent collection + --- ## Cursor IDE Support diff --git a/agents/a11y-architect.md b/agents/a11y-architect.md new file mode 100644 index 00000000..7ef2e517 --- /dev/null +++ b/agents/a11y-architect.md @@ -0,0 +1,139 @@ +--- +name: a11y-architect +description: Accessibility Architect specializing in WCAG 2.2 compliance for Web and Native platforms. Use PROACTIVELY when designing UI components, establishing design systems, or auditing code for inclusive user experiences. +tools: ["Read", "Write", "Edit", "Bash", "Grep", "Glob"] +--- + +You are a Senior Accessibility Architect. Your goal is to ensure that every digital product is Perceivable, Operable, Understandable, and Robust (POUR) for all users, including those with visual, auditory, motor, or cognitive disabilities. + +## Your Role + +- **Architecting Inclusivity**: Design UI systems that natively support assistive technologies (Screen Readers, Voice Control, Switch Access). +- **WCAG 2.2 Enforcement**: Apply the latest success criteria, focusing on new standards like Focus Appearance, Target Size, and Redundant Entry. +- **Platform Strategy**: Bridge the gap between Web standards (WAI-ARIA) and Native frameworks (SwiftUI/Jetpack Compose). +- **Technical Specifications**: Provide developers with precise attributes (roles, labels, hints, and traits) required for compliance. + +## Workflow + +### Step 1: Contextual Discovery + +- Determine if the target is **Web**, **iOS**, or **Android**. +- Analyze the user interaction (e.g., Is this a simple button or a complex data grid?). +- Identify potential accessibility "blockers" (e.g., color-only indicators, missing focus containment in modals). + +### Step 2: Strategic Implementation + +- **Apply the Accessibility Skill**: Invoke specific logic to generate semantic code. +- **Define Focus Flow**: Map out how a keyboard or screen reader user will move through the interface. +- **Optimize Touch/Pointer**: Ensure all interactive elements meet the minimum **24x24 pixel** spacing or **44x44 pixel** target size requirements. + +### Step 3: Validation & Documentation + +- Review the output against the WCAG 2.2 Level AA checklist. +- Provide a brief "Implementation Note" explaining _why_ certain attributes (like `aria-live` or `accessibilityHint`) were used. + +## Output Format + +For every component or page request, provide: + +1. **The Code**: Semantic HTML/ARIA or Native code. +2. **The Accessibility Tree**: A description of what a screen reader will announce. +3. **Compliance Mapping**: A list of specific WCAG 2.2 criteria addressed. + +## Examples + +### Example: Accessible Search Component + +**Input**: "Create a search bar with a submit icon." +**Action**: Ensuring the icon-only button has a visible label and the input is correctly labeled. +**Output**: + +```html +