diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 55abe8da..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 diff --git a/.github/workflows/reusable-test.yml b/.github/workflows/reusable-test.yml index e30ae1bc..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 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 b1b31e50..28251aa2 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 79 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) ``` @@ -989,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 +