diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index d7090d46..51a33560 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,7 +11,7 @@ { "name": "ecc", "source": "./", - "description": "Harness-native ECC operator layer - 64 agents, 262 skills, 84 legacy command shims, reusable hooks, rules, selective install profiles, and production-ready workflows for Claude Code, Codex, OpenCode, Cursor, and related agent harnesses", + "description": "Harness-native ECC operator layer - 65 agents, 263 skills, 85 legacy command shims, reusable hooks, rules, selective install profiles, and production-ready workflows for Claude Code, Codex, OpenCode, Cursor, and related agent harnesses", "version": "2.0.0", "author": { "name": "Affaan Mustafa", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 1ad28ba7..fb61dba8 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ecc", "version": "2.0.0", - "description": "Harness-native ECC plugin for engineering teams - 64 agents, 262 skills, 84 legacy command shims, reusable hooks, rules, MCP conventions, and operator workflows for Claude Code plus adjacent agent harnesses", + "description": "Harness-native ECC plugin for engineering teams - 65 agents, 263 skills, 85 legacy command shims, reusable hooks, rules, MCP conventions, and operator workflows for Claude Code plus adjacent agent harnesses", "author": { "name": "Affaan Mustafa", "url": "https://x.com/affaanmustafa" diff --git a/AGENTS.md b/AGENTS.md index 7fdbb6e8..e26b5a31 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # Everything Claude Code (ECC) — Agent Instructions -This is a **production-ready AI coding plugin** providing 64 specialized agents, 262 skills, 84 commands, and automated hook workflows for software development. +This is a **production-ready AI coding plugin** providing 65 specialized agents, 263 skills, 85 commands, and automated hook workflows for software development. **Version:** 2.0.0 @@ -149,9 +149,9 @@ Troubleshoot failures: check test isolation → verify mocks → fix implementat ## Project Structure ``` -agents/ — 64 specialized subagents -skills/ — 262 workflow skills and domain knowledge -commands/ — 84 slash commands +agents/ — 65 specialized subagents +skills/ — 263 workflow skills and domain knowledge +commands/ — 85 slash commands hooks/ — Trigger-based automations rules/ — Always-follow guidelines (common + per-language) scripts/ — Cross-platform Node.js utilities diff --git a/README.md b/README.md index 7b2d7f7d..6cad95e1 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ Stable graduation of the 2.0 line: 261 skills, the control-pane substrate (sessi ### 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: 64 agents, 262 skills, and 84 legacy command shims. +- **Public surface synced to the live repo** — metadata, catalog counts, plugin manifests, and install-facing docs now match the actual OSS surface: 65 agents, 263 skills, and 85 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. - **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. @@ -425,7 +425,7 @@ If you stacked methods, clean up in this order: /plugin list ecc@ecc ``` -**That's it!** You now have access to 64 agents, 262 skills, and 84 legacy command shims. +**That's it!** You now have access to 65 agents, 263 skills, and 85 legacy command shims. ### Dashboard GUI @@ -555,7 +555,7 @@ ECC/ | |-- plugin.json # Plugin metadata and component paths | |-- marketplace.json # Marketplace catalog for /plugin marketplace add | -|-- agents/ # 64 specialized subagents for delegation +|-- agents/ # 65 specialized subagents for delegation | |-- planner.md # Feature implementation planning | |-- architect.md # System design decisions | |-- tdd-guide.md # Test-driven development @@ -1507,9 +1507,9 @@ The configuration is automatically detected from `.opencode/opencode.json`. | Feature | Claude Code | OpenCode | Status | |---------|---------------------|----------|--------| -| Agents | PASS: 64 agents | PASS: 12 agents | **Claude Code leads** | -| Commands | PASS: 84 commands | PASS: 35 commands | **Claude Code leads** | -| Skills | PASS: 262 skills | PASS: 37 skills | **Claude Code leads** | +| Agents | PASS: 65 agents | PASS: 12 agents | **Claude Code leads** | +| Commands | PASS: 85 commands | PASS: 35 commands | **Claude Code leads** | +| Skills | PASS: 263 skills | PASS: 37 skills | **Claude Code leads** | | Hooks | PASS: 8 event types | PASS: 11 events | **OpenCode has more!** | | Rules | PASS: 29 rules | PASS: 13 instructions | **Claude Code leads** | | MCP Servers | PASS: 14 servers | PASS: Full | **Full parity** | @@ -1668,9 +1668,9 @@ ECC is the **first plugin to maximize every major AI coding tool**. Here's how e | Feature | Claude Code | Cursor IDE | Codex CLI | OpenCode | GitHub Copilot | |---------|-----------------------|------------|-----------|----------|----------------| -| **Agents** | 64 | Shared (AGENTS.md) | Shared (AGENTS.md) | 12 | N/A | -| **Commands** | 84 | Shared | Instruction-based | 35 | 5 prompts | -| **Skills** | 262 | Shared | 10 (native format) | 37 | Via instructions | +| **Agents** | 65 | Shared (AGENTS.md) | Shared (AGENTS.md) | 12 | N/A | +| **Commands** | 85 | Shared | Instruction-based | 35 | 5 prompts | +| **Skills** | 263 | Shared | 10 (native format) | 37 | Via instructions | | **Hook Events** | 8 types | 15 types | None yet | 11 types | None | | **Hook Scripts** | 20+ scripts | 16 scripts (DRY adapter) | N/A | Plugin hooks | N/A | | **Rules** | 34 (common + lang) | 34 (YAML frontmatter) | Instruction-based | 13 instructions | 1 always-on file | diff --git a/README.zh-CN.md b/README.zh-CN.md index e9608d6a..5ef50edd 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -164,7 +164,7 @@ Copy-Item -Recurse rules/typescript "$HOME/.claude/rules/" /plugin list ecc@ecc ``` -**完成!** 你现在可以使用 64 个代理、262 个技能和 84 个命令。 +**完成!** 你现在可以使用 65 个代理、263 个技能和 85 个命令。 ### multi-* 命令需要额外配置 diff --git a/agents/vue-reviewer.md b/agents/vue-reviewer.md index e588155e..a697654c 100644 --- a/agents/vue-reviewer.md +++ b/agents/vue-reviewer.md @@ -103,7 +103,7 @@ You DO NOT refactor or rewrite code — you report findings only. ### HIGH — State Management (Pinia) -- **Direct store property mutation without `$patch` or action**: Mutations outside actions lose devtools tracking and make state flow non-obvious. +- **Scattered complex store mutations outside actions or `$patch()`**: Pinia allows direct state writes, but multi-field business mutations should live in actions or grouped `$patch()` calls so devtools history and state flow stay understandable. - **Storing non-serializable data in Pinia state**: Saved state (SSR hydration, devtools, local persistence) won't survive round-trip. - **`mapState` / `mapActions` in Options API without proper typing**: Type inference breaks — prefer Composition API or declare full types. - **Store action without error boundary**: Async store actions should handle failures and not leave state inconsistent. diff --git a/commands/vue-review.md b/commands/vue-review.md index 40abe747..8a1223f9 100644 --- a/commands/vue-review.md +++ b/commands/vue-review.md @@ -165,7 +165,6 @@ Recommendation: FAIL: Block merge until CRITICAL issue is fixed - Run tests to ensure component tests pass - Run `/vue-review` before merging Vue code - Use `/code-review` for non-Vue-specific concerns on the same PR -- Use `/vue-test` (if created) for Vue-specific test generation ## Related diff --git a/docs/COMMAND-REGISTRY.json b/docs/COMMAND-REGISTRY.json index 2ac66a02..73da3a2c 100644 --- a/docs/COMMAND-REGISTRY.json +++ b/docs/COMMAND-REGISTRY.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "totalCommands": 84, + "totalCommands": 85, "commands": [ { "command": "aside", @@ -919,6 +919,23 @@ "allAgents": [], "skills": [], "path": "commands/update-docs.md" + }, + { + "command": "vue-review", + "description": "Comprehensive Vue.js code review for Composition API correctness, reactivity, composable patterns, template security, accessibility, and Vue-specific performance. Invokes the vue-reviewer agent (and typescript-reviewer alongside on .vue/.ts changes).", + "type": "testing", + "primaryAgents": [ + "typescript-reviewer", + "vue-reviewer" + ], + "allAgents": [ + "typescript-reviewer", + "vue-reviewer" + ], + "skills": [ + "vue-patterns" + ], + "path": "commands/vue-review.md" } ], "statistics": { @@ -929,7 +946,7 @@ "planning": 2, "refactoring": 1, "review": 9, - "testing": 52 + "testing": 53 }, "topAgents": [ { @@ -940,6 +957,10 @@ "agent": "flutter-reviewer", "count": 2 }, + { + "agent": "typescript-reviewer", + "count": 2 + }, { "agent": "cpp-build-resolver", "count": 1 @@ -967,10 +988,6 @@ { "agent": "planner", "count": 1 - }, - { - "agent": "python-reviewer", - "count": 1 } ], "topSkills": [ diff --git a/docs/zh-CN/AGENTS.md b/docs/zh-CN/AGENTS.md index 35324690..021e7b1d 100644 --- a/docs/zh-CN/AGENTS.md +++ b/docs/zh-CN/AGENTS.md @@ -1,6 +1,6 @@ # Everything Claude Code (ECC) — 智能体指令 -这是一个**生产就绪的 AI 编码插件**,提供 64 个专业代理、262 项技能、84 条命令以及自动化钩子工作流,用于软件开发。 +这是一个**生产就绪的 AI 编码插件**,提供 65 个专业代理、263 项技能、85 条命令以及自动化钩子工作流,用于软件开发。 **版本:** 2.0.0 @@ -146,9 +146,9 @@ ## 项目结构 ``` -agents/ — 64 个专业子代理 -skills/ — 262 个工作流技能和领域知识 -commands/ — 84 个斜杠命令 +agents/ — 65 个专业子代理 +skills/ — 263 个工作流技能和领域知识 +commands/ — 85 个斜杠命令 hooks/ — 基于触发的自动化 rules/ — 始终遵循的指导方针(通用 + 每种语言) scripts/ — 跨平台 Node.js 实用工具 diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index 0be8a146..c3f2eff8 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -228,7 +228,7 @@ Copy-Item -Recurse rules/typescript "$HOME/.claude/rules/" /plugin list ecc@ecc ``` -**搞定!** 你现在可以使用 64 个智能体、262 项技能和 84 个命令了。 +**搞定!** 你现在可以使用 65 个智能体、263 项技能和 85 个命令了。 *** @@ -1140,9 +1140,9 @@ opencode | 功能特性 | Claude Code | OpenCode | 状态 | |---------|---------------|----------|--------| -| 智能体 | PASS: 64 个 | PASS: 12 个 | **Claude Code 领先** | -| 命令 | PASS: 84 个 | PASS: 35 个 | **Claude Code 领先** | -| 技能 | PASS: 262 项 | PASS: 37 项 | **Claude Code 领先** | +| 智能体 | PASS: 65 个 | PASS: 12 个 | **Claude Code 领先** | +| 命令 | PASS: 85 个 | PASS: 35 个 | **Claude Code 领先** | +| 技能 | PASS: 263 项 | PASS: 37 项 | **Claude Code 领先** | | 钩子 | PASS: 8 种事件类型 | PASS: 11 种事件 | **OpenCode 更多!** | | 规则 | PASS: 29 条 | PASS: 13 条指令 | **Claude Code 领先** | | MCP 服务器 | PASS: 14 个 | PASS: 完整 | **完全对等** | @@ -1248,9 +1248,9 @@ ECC 是**第一个最大化利用每个主要 AI 编码工具的插件**。以 | 功能特性 | Claude Code | Cursor IDE | Codex CLI | OpenCode | |---------|-----------------------|------------|-----------|----------| -| **智能体** | 64 | 共享 (AGENTS.md) | 共享 (AGENTS.md) | 12 | -| **命令** | 84 | 共享 | 基于指令 | 35 | -| **技能** | 262 | 共享 | 10 (原生格式) | 37 | +| **智能体** | 65 | 共享 (AGENTS.md) | 共享 (AGENTS.md) | 12 | +| **命令** | 85 | 共享 | 基于指令 | 35 | +| **技能** | 263 | 共享 | 10 (原生格式) | 37 | | **钩子事件** | 8 种类型 | 15 种类型 | 暂无 | 11 种类型 | | **钩子脚本** | 20+ 个脚本 | 16 个脚本 (DRY 适配器) | N/A | 插件钩子 | | **规则** | 34 (通用 + 语言) | 34 (YAML 前页) | 基于指令 | 13 条指令 | diff --git a/manifests/install-components.json b/manifests/install-components.json index 30ec3edd..9b007b3a 100644 --- a/manifests/install-components.json +++ b/manifests/install-components.json @@ -97,6 +97,14 @@ "framework-language" ] }, + { + "id": "framework:vue", + "family": "framework", + "description": "Vue.js, Nuxt, Pinia, and Vue Router engineering guidance. Currently resolves through the shared framework-language module.", + "modules": [ + "framework-language" + ] + }, { "id": "framework:nextjs", "family": "framework", @@ -510,6 +518,14 @@ "framework-language" ] }, + { + "id": "skill:vue-patterns", + "family": "skill", + "description": "Vue.js 3 Composition API, reactivity, Pinia, Vue Router, and Nuxt SSR patterns.", + "modules": [ + "framework-language" + ] + }, { "id": "skill:backend-patterns", "family": "skill", diff --git a/manifests/install-modules.json b/manifests/install-modules.json index fd18b3f9..a7415061 100644 --- a/manifests/install-modules.json +++ b/manifests/install-modules.json @@ -183,7 +183,8 @@ "skills/springboot-patterns", "skills/springboot-tdd", "skills/springboot-verification", - "skills/ui-to-vue" + "skills/ui-to-vue", + "skills/vue-patterns" ], "targets": [ "claude", diff --git a/package.json b/package.json index 6998ead8..7fc06335 100644 --- a/package.json +++ b/package.json @@ -307,6 +307,7 @@ "skills/video-editing/", "skills/videodb/", "skills/visa-doc-translate/", + "skills/vue-patterns/", "skills/windows-desktop-e2e/", "skills/workspace-surface-audit/", "skills/x-api/", diff --git a/rules/vue/hooks.md b/rules/vue/hooks.md index 06657268..c2db8bda 100644 --- a/rules/vue/hooks.md +++ b/rules/vue/hooks.md @@ -75,7 +75,7 @@ watch(() => count, (newVal) => { ... }); When passing a destructured prop to a composable that needs reactivity, wrap in a getter and use `toValue()` inside the composable: ```ts -useDynamicCount(() => count); // ✅ preserves reactivity +useDynamicCount(() => count); // preserves reactivity ``` ### Replacing reactive() Objects @@ -132,7 +132,7 @@ const fullName = computed({ // WRONG: side effect in computed const displayName = computed(() => { - analytics.track("name-computed"); // ❌ side effect + analytics.track("name-computed"); // side effect return user.value.name; }); ``` @@ -164,23 +164,19 @@ watchEffect(() => { ## Watcher Source Pitfalls ```ts -// WRONG: watching a ref object (never changes) +// CORRECT: watching a ref tracks its value const u = ref({ name: "Alice" }); -watch(u, (val) => {}); // ❌ watches the ref wrapper, not the value +watch(u, (val) => {}); -// CORRECT: getter returning .value +// ALSO CORRECT: getter returning .value watch(() => u.value, (val) => {}); -// ALSO WRONG: reactive getter that doesn't track -watch(() => state.name, (val) => {}); // ❌ val is snapshot at setup - // CORRECT: getter that accesses property on reactive object -watch(() => state.name, (val) => {}); // ✅ .name access inside getter is tracked -// Wait — careful: `() => state.name` DOES track correctly because the getter -// accesses `.name` on the reactive proxy. The getter is re-evaluated by Vue. +watch(() => state.name, (val) => {}); // .name access inside getter is tracked +// The getter is re-evaluated because it accesses `.name` on the reactive proxy. -// ACTUALLY WRONG case: direct reactive property -watch(state.name, ...); // ❌ state.name evaluates to a primitive, not trackable +// WRONG: direct reactive property +watch(state.name, ...); // state.name evaluates to a primitive, not trackable // CORRECT: getter returning reactive property watch(() => state.name, (newName) => { ... }); @@ -190,7 +186,7 @@ watch(() => state.name, (newName) => { ... }); Every watcher that creates subscriptions, intervals, or fetch requests must clean up. -**Vue 3.5+**: Use `onWatcherCleanup()` (globally importable from `vue`) for watcher-side-effect cleanup: +**Vue 3.5+**: Use `onWatcherCleanup()` (globally importable from `vue`) for watcher-side-effect cleanup. It must be called synchronously inside the watcher callback: ```ts import { watch, onWatcherCleanup } from "vue"; @@ -319,7 +315,7 @@ Never initialize state, start timers, or subscribe to external systems in the mo ```ts // WRONG: module scope side effect -const globalCount = ref(0); // ❌ shared across all components +const globalCount = ref(0); // FAIL shared across all components setInterval(() => globalCount.value++, 1000); export function useGlobalCount() { @@ -342,7 +338,7 @@ Use `shallowRef()` for large immutable data structures that are replaced as a wh ```ts const items = shallowRef([]); // items.value = await fetchItems(); // replacement works -// items.value[0].name = "new"; // ❌ inner mutations are NOT reactive +// items.value[0].name = "new"; // FAIL inner mutations are NOT reactive ``` Use `shallowReactive()` when only top-level properties should be reactive. diff --git a/rules/vue/patterns.md b/rules/vue/patterns.md index 30698993..73af8d85 100644 --- a/rules/vue/patterns.md +++ b/rules/vue/patterns.md @@ -317,7 +317,7 @@ Use `` for modals, tooltips, notifications — content that must escap ```vue - +

Teleported content

diff --git a/rules/vue/security.md b/rules/vue/security.md index 699b4426..a9c6d309 100644 --- a/rules/vue/security.md +++ b/rules/vue/security.md @@ -83,7 +83,7 @@ app.directive("render-html", (el, binding) => { ```ts // CRITICAL: secret leaked to client bundle (Vite) -const apiKey = import.meta.env.VITE_STRIPE_SECRET; // ❌ VITE_ prefix = public +const apiKey = import.meta.env.VITE_STRIPE_SECRET; // FAIL VITE_ prefix = public // CORRECT: server-side only // vite.config.ts — never pass VITE_ prefixed secrets @@ -158,7 +158,7 @@ export default defineEventHandler(async (event) => { ```ts // CRITICAL: session tokens in localStorage -localStorage.setItem("token", jwt); // ❌ any XSS can read this +localStorage.setItem("token", jwt); // FAIL any XSS can read this // CORRECT: httpOnly cookie set by server // Client never touches the token directly. diff --git a/skills/vue-patterns/SKILL.md b/skills/vue-patterns/SKILL.md index 1312de03..c9d9c093 100644 --- a/skills/vue-patterns/SKILL.md +++ b/skills/vue-patterns/SKILL.md @@ -201,7 +201,7 @@ export const useCartStore = defineStore("cart", () => { ``` - Use Setup Store syntax (not Options Store). -- Actions: only place to mutate state. +- Prefer actions for business-level mutations and `$patch()` for grouped updates. - Every async action: handle loading + success + error. --- @@ -385,7 +385,7 @@ const { count = 0, msg = "hello" } = defineProps<{ }>(); // Limitation: cannot watch destructured prop directly -watch(() => count, (newVal) => { ... }); // ✅ getter required +watch(() => count, (newVal) => { ... }); // PASS getter required ``` ### `useTemplateRef()` @@ -402,7 +402,7 @@ Supports dynamic ref IDs: `useTemplateRef(dynamicRefId)`. ### `onWatcherCleanup()` -Globally importable watcher cleanup API (Vue 3.5+): +Globally importable watcher cleanup API (Vue 3.5+). It must be called synchronously inside the watcher callback: ```ts import { watch, onWatcherCleanup } from "vue"; @@ -428,7 +428,7 @@ const id = useId(); `` allows teleporting to targets rendered in the same cycle: ```vue -Content +Content
```