440 Commits

  • fix(skills): shorten flox-environments description for Codex metadata surface (#2271)
    Trimmed the description from ~1216 to ~620 chars while keeping trigger coverage (reproducible cross-platform envs, system deps, local services, .flox/manifest.toml/flox activate/FloxHub).
  • fix(skill): surface ps1 delete errors + replace removed wmic CPU detection
    Greptile review:
    - slim_dist.ps1: ErrorActionPreference SilentlyContinue -> Continue so failed
      deletes are reported instead of showing a false success banner
    - build_optimized.bat: wmic is removed on Windows 11 22H2+; use the built-in
      %NUMBER_OF_PROCESSORS% env var (with a fallback) so --jobs is not silently 0
  • fix(skill): remove broken routing reference to non-existent python-installer-packaging
    cubic P2: the fallback skill `python-installer-packaging` does not exist in the
    repo, creating a broken routing dependency. Replace both references (description
    + When to Activate) with self-contained scoping language that keeps the
    "advanced optimization only" gating without pointing at a missing skill.
  • fix(skill): English description, clean placeholders, green CI for generating-python-installer
    Addresses PR review feedback (English description + cleaned placeholders + CI green)
    and the inline bot findings.
    
    - Add English description and canonical "When to Activate" / "How It Works" /
      "Examples" sections for auto-activation; keep the existing Chinese content
    - Replace the "某商业级桌面应用" placeholder with a concrete anonymized reference
      ("参考项目" / "生产级 PySide2 桌面应用, 323 MB")
    - build_optimized.bat: compute dist size via PowerShell instead of parsing
      `dir` output with the Chinese-locale string `find "个文件"` (breaks on
      non-Chinese Windows)
    - slim_dist.ps1: keep entry_points.txt in .dist-info (read at runtime by
      importlib.metadata; deleting it breaks plugin discovery)
    - Inno Setup: default the bundled VC++ redistributable to x86 to match the
      recommended 32-bit build and comment out ArchitecturesInstallIn64BitMode,
      with notes on switching to x64 for 64-bit builds (fixes runtime-arch mismatch)
    - markdownlint: blank lines around tables (MD058)
    - unicode-safety: strip emoji / U+FE0F variation selectors per repo policy
    - Sync skill catalog counts 249 -> 250 across README / AGENTS / plugin /
      marketplace manifests
  • chore: reconcile publish/agent surfaces after PR batch
    - agent.yaml: register epic-* commands (#2236) and vue-review (#2241)
    - package.json files: drop stray skills/ml-adoption-playbook entry (follows orphan-skill publish pattern; not in install-modules.json)
    - unicode-safety: strip decorative emoji from dashboard-web.js (#2100) and brand-discovery refs (#2221) to pass the CI gate
    - agent-compress: raise catalog token canary 5000 -> 6000 for the 67-agent catalog
    
    Full suite green (2836/2836).
  • Merge pull request #2234 from BERORINPO/fix/skill-origin-to-metadata
    fix(skills): move top-level origin frontmatter key under metadata (spec compliance). tdd-workflow conflict resolved keeping #2235 argument-hint + metadata.origin.
  • Merge pull request #2189 from affaan-m/feat/taste-skill
    feat: add taste skill — music-video creative direction. Catalog counts reconciled.
  • Merge pull request #2241 from itkdm/feat/add-vue-ecosystem
    feat: add Vue ecosystem review support (vue-reviewer agent, /vue-review command, vue-patterns skill). Duplicate rules/vue/* kept from #2250; catalog counts reconciled.
  • Merge pull request #2221 from hretheum/feat/add-brand-discovery-competitive-skills
    feat(skills): add brand-discovery and competitive benchmarking pipeline. Catalog counts reconciled.
  • Merge pull request #2220 from lamenting-hawthorn/feat/agent-self-evaluation
    feat(skills,agents): add agent-self-evaluation skill and agent-evaluator persona. Catalog counts reconciled.
  • Merge pull request #2202 from stroland02/feat-ml-adoption
    feat(skills): add ml-adoption-playbook skill. Catalog manifests/counts reconciled via catalog:sync.
  • docs: add MCP server and tools integration for tinystruct (#2244)
    * docs: add MCP server and tools integration for tinystruct
    
    * Update the doc to specify the package for apis and security reminder, checks for prompt.
  • docs(skills): document tdd plan handoff evidence (#2235)
    * docs(skills): document tdd plan handoff evidence
    
    Address issue #2138 by clarifying how tdd-workflow should continue from a plan file, preserve human-readable test guarantees, and retain RED/GREEN evidence across squash merges.
    
    * docs(skills): harden tdd plan handoff guidance
    
    Address review feedback on #2235: use angle-bracket argument hint, treat plan files as untrusted input, and prefer project-local documentation paths for TDD evidence reports.
    
    * docs(skills): clarify plan handoff injection guard
    
    Address review feedback by explicitly stating that plan file content is data, not AI instructions, and that validation commands from untrusted plans require sanitization and approval before execution.
    
    * Update skills/tdd-workflow/SKILL.md
    
    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
    
    * docs(skills): address tdd workflow review nits
    
    Clarify plan handoff safety decisions, remove redundant untrusted-input wording, and show consistent TDD evidence path examples.
    
    ---------
    
    Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
  • feat(browser-qa): read-only safety default, baseline-or-die, honest a11y scope (#2186)
    Additive-only hardening of skills/browser-qa/SKILL.md.
    
    Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
  • fix: sanitize subprocess call in runner.py (#2149)
    * fix: V-001 security vulnerability
    
    Automated security fix generated by OrbisAI Security
    
    * fix: sanitize subprocess call in runner.py
    
    The runner
    
    * fix: address PR review comments on V-001 allowlist and test coverage
    
    Remove dangerous interpreters (python, python3, node, curl, wget) from
    ALLOWED_SETUP_EXECUTABLES — they can execute arbitrary code via argument
    flags and are not needed for sandbox setup. Rewrite test_invariant_runner
    to call _setup_sandbox directly instead of spawning runner.py as a
    subprocess (which had no __main__ entrypoint and never exercised the fix).
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
  • fix(skills): replace star ratings with ASCII N/5 (#2194)
    Change-Id: I72b7d094bb982070706595255536b69aa5998862
  • feat(skills): add vue-patterns skill for Vue.js 3 best practices
    Add skills/vue-patterns/SKILL.md covering:
    - Project structure (feature-first layout, file naming)
    - Component architecture (SFC order, presentational vs container, props/emits)
    - Composables (use prefix, MaybeRef/toValue, cleanup, vs mixins)
    - State management decision tree (local → props → provide/inject → Pinia → server state)
    - Vue Router patterns (lazy loading, navigation guards, reactive params)
    - Template patterns (v-if/v-else, v-show, v-for, v-model with defineModel)
    - Performance techniques (shallowRef, v-memo, v-once, KeepAlive, Suspense)
    - Testing stack and patterns (Vitest, Vue Test Utils, Pinia testing)
    - Nuxt-specific patterns (auto-imports, useAsyncData, server routes, runtime config)
    - Vue 3.5+ new APIs section: reactive props destructure, useTemplateRef,
      onWatcherCleanup, useId, defer Teleport, lazy hydration
    - Anti-patterns table with Vue 3.5+ version-specific notes
  • fix: context-size /compact trigger, Codex marketplace plugin path, live README badges (#2237)
    - suggest-compact hook now reads the latest usage record from the session
      transcript and suggests /compact at a window-scaled token threshold
      (160k/200k window, 250k/1M window; COMPACT_CONTEXT_THRESHOLD and
      COMPACT_CONTEXT_INTERVAL overridable), re-firing per 60k-token growth
      bucket; tool-call count stays as the secondary signal (#2155)
    - Codex repo marketplace now points at ./plugins/ecc instead of ./ — Codex
      never discovers plugins whose local marketplace source.path is the
      marketplace root (verified on Codex CLI 0.137.0); plugins/ecc is a thin
      folder referencing root skills/.mcp.json per maintainer direction on
      #2097; docs flag plugin mode as experimental with the upstream blocker
      openai/codex#26037 linked (#2128)
    - README badges for installs/stars/forks now use shields endpoint badges
      backed by api.ecc.tools (live install count 3,712 vs the stale static
      150), which also eliminates shields' 'Unable to select next GitHub token
      from pool' render in the stars badge
    
    Closes #2155
    Closes #2128
  • fix(ci): catalog sync, markdownlint, unicode safety, unsupported frontmatter key
    catalog:sync: update skill count 261→265 in README.md, AGENTS.md,
    docs/zh-CN/AGENTS.md, .claude-plugin/plugin.json
    
    markdownlint:
    - MD009: strip trailing spaces in 10_purpose-why, 20_positioning,
      40_personality-archetype, 50_voice-tone, 60_narrative-story, 90_SYNTHESIS
      (both skills/ and .agents/skills/ copies)
    - MD037: wrap ___ placeholders in backticks in 70_founder-tension.md:39
    - MD028: replace blank lines inside blockquotes with bare > in 90_SYNTHESIS.md
    
    unicode-safety: replace U+2194 (↔) with ASCII <-> in 50_voice-tone.md and
    competitive-report-structure/SKILL.md (both copies)
    
    codex-validator: remove unsupported `origin: community` key from
    brand-discovery, competitive-platform-analysis, competitive-report-structure,
    benchmark-methodology SKILL.md files (both copies)
  • fix(skills): address bot review findings post-943b299
    - competitive-platform-analysis: add ## Examples section per ECC
      guidelines (8-axis taxonomy walkthrough + pre-filter scoring matrix)
    - competitive-report-structure: clarify dimension 9 poles are client-
      specific (e.g., Memorability/Hireability) not hard-coded names
    - brand-discovery: fix terminal state — set inProgressModule to null
      after 90_SYNTHESIS.md is complete to prevent misleading resumption
    
    All fixes mirrored to .agents/ copies.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • fix(skills): address coderabbitai + cubic-dev-ai review findings
    - marketplace.json: update skill count 261 → 265
    - 90_SYNTHESIS.md (both copies): add required ## Raw / ## Synthesis
      wrappers per module contract; add Aaker brand system section (4b)
      covering archetype, identity, associations, equity (Module 40 output)
    - brand-discovery/SKILL.md: add terminal module handling for 90_SYNTHESIS
      (nextModule=null, completedModules includes 90); add path traversal
      validation rules for participant, moduleFile, outputPath in multi-founder
      mode
    - competitive-platform-analysis/SKILL.md (both copies): fix malformed
      markdown emphasis (stray * after "substitutes:")
    - competitive-report-structure/SKILL.md (both copies): clarify heatmap
      column for dimension 9 — two poles (Memorability + Hireability) must be
      represented as separate sub-columns, not averaged
    - 40_personality-archetype.md (both copies): join split heading onto one line
    - 60_narrative-story.md, 70_founder-tension.md (both copies): add trailing
      newline at EOF
    
    Duplicate .agents/ ↔ skills/ copies are intentional (Codex mirror);
    .agents/ strips `origin: community` per Codex allowlist.
  • feat(skills): add brand-discovery and competitive benchmarking pipeline
    Adds four community skills covering brand identity discovery and a
    three-skill competitive benchmarking pipeline.
    
    **brand-discovery** — Adaptive multi-session brand identity interview
    spanning 8 modules (purpose, positioning, audience, personality, voice,
    narrative, founder-brand tension, synthesis). Uses laddering, 5 Whys,
    and projective techniques. State persisted to disk via state.json so
    sessions resume across conversations without losing elicited knowledge.
    Frameworks: Sinek, Dunford, Baker, Enns, Kapferer, Aaker, Neumeier,
    Mark & Pearson, Lencioni. Includes 8 module output templates in
    references/.
    
    **competitive-platform-analysis** — Scopes and tiers a competitor set
    before benchmarking begins. Categorizes candidates along 8 generic
    creative-industry axes (positioning stance, specialization, size/model,
    engagement format, distinctiveness posture, evidence model, brand
    strength, market/reach) into Direct / Adjacent / Aspirational tiers.
    Includes a pre-filter scoring matrix. First step in the pipeline.
    
    **benchmark-methodology** — Scores each competitor across 9 weighted
    dimensions (positioning 18%, brand voice 15%, visual craft 15%, offer
    packaging 12%, evidence 12%, enterprise-readiness 10%, thought
    leadership 8%, pricing 5%, client's strategic tension 5%) with explicit
    1–5 rubrics and bias controls. Produces one profile card per competitor.
    
    **competitive-report-structure** — Assembles scored cards into a
    decision-grade report: executive summary, landscape map, competitor
    tiers, heatmap matrix, deep dives, white-space and threats, strategic
    recommendations, sources appendix.
    
    brand-discovery complements brand-voice (ECC): brand-voice extracts a
    style profile from existing source material; brand-discovery elicits
    identity from scratch through structured interviews when no prior
    material exists.
    
    A competitive set scoped without the client's positioning brief is
    noise, not intelligence — each skill enforces this by requiring the
    brief before proceeding. The 9-dimension scoring framework deliberately
    reports the client's strategic tension as two separate poles (never
    averaged) because the gap between them is the strategic finding.
    
    Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  • fix: address final lint blockers for agent self-evaluation
    - Replace U+274C cross-mark examples with ASCII FAIL: prefixes
    - Ensure agent-evaluator markdown ends with trailing newline
    - Replace markdown placeholder underscores with bracketed placeholders to satisfy markdownlint MD037
  • fix(skills): move top-level origin frontmatter key under metadata
    The official Agent Skills spec (agentskills.io/specification) whitelists exactly
    6 top-level frontmatter keys (name/description/license/compatibility/metadata/
    allowed-tools). A top-level `origin` key fails the official validator
    (anthropics/skills quick_validate.py ALLOWED_PROPERTIES; skills-ref validate).
    
    This moves `origin: X` -> `metadata.origin: X` across the canonical skills/
    tree, preserving each value verbatim. Frontmatter-only, minimal diff.
    
    - 251 SKILL.md updated (242 new metadata block, 9 appended to existing metadata)
    - origin values preserved verbatim (verified 251/251)
    - YAML validated on all changed files
    - scoped to canonical skills/ only (docs/<lang> translations + tool mirrors
      .cursor/.kiro/.agents left untouched; presumably regenerated from canonical)
    
    Addresses #2233
  • feat(skills): add config-gc skill (#2216)
    * feat(skills): add config-gc skill
    
    Garbage collection for Claude Code configuration sprawl: 8 scan
    channels (skills, memory, hooks, permissions, MCP, reminders,
    project history, caches), confirm-each-deletion human-in-the-loop,
    soft-delete with undo log. Subtractive counterpart to
    workspace-surface-audit and configure-ecc.
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    
    * fix(skills): address review feedback on config-gc
    
    - Replace invalid comment-out strategy for JSON permission files with
      backup + gc_log entry + jq array removal (cubic P1)
    - Swap GNU-only find -printf for portable du -k (works on macOS/BSD)
    - Capture gc date once into a variable so trash dir and undo log agree
    - Simplify shadowed-permission detection with jq index() guard
    
    Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
  • fix: stability batch — hook stdin truncation, Codex exa TOML, Stop hook JSON, GateGuard repetition (#2227)
    * fix(hooks): fail open on oversized stdin instead of echoing truncated JSON (#2222)
    
    run-with-flags.js capped stdin at 1MB but every fallthrough path still
    echoed the truncated string to stdout. The harness parses hook stdout as
    JSON, got a document cut mid-stream, and blocked the tool call — so any
    Edit/Write with a >1MB hook payload was permanently blocked by every
    registered pre-write hook, before ECC_HOOK_PROFILE / ECC_DISABLED_HOOKS
    gating could run.
    
    - Exit 0 with empty stdout (no opinion) when the stdin cap trips, before
      any echo or gating logic.
    - Flush stdout via write callback before process.exit: exiting right
      after stdout.write() dropped everything past the ~64KB pipe buffer,
      cutting even sub-cap pass-through payloads mid-JSON.
    
    Regression tests cover the enabled, disabled, and missing-arg paths for
    oversized payloads plus full echo of sub-cap >64KB payloads.
    
    * fix(codex): stop emitting invalid exa url entry, align merge with connector policy (#2224)
    
    The Codex MCP merge declared exa with a url key, but Codex's
    [mcp_servers.*] TOML schema is stdio-only — the url key makes the
    entire config.toml fail to load, bricking both the codex CLI and the
    desktop app. Every install/update re-injected the line because the
    urlEntry branch treated the broken entry as present.
    
    - ECC_SERVERS now emits only the current default set per
      docs/MCP-CONNECTOR-POLICY.md: chrome-devtools (stdio, command/args).
      Retired servers (supabase, playwright, context7, exa, github, memory,
      sequential-thinking) are never re-emitted; existing user-managed
      entries are untouched.
    - The merge now repairs the exact ECC-emitted broken form (url-only
      exa entry) on every run so re-running the installer fixes broken
      configs instead of preserving them. User stdio exa entries
      (command + mcp-remote) are left alone.
    - check-codex-global-state.sh requires chrome-devtools instead of the
      retired set, and flags url-only exa entries with a repair hint.
    
    Tests cover repair, re-run idempotence, stdio-entry preservation, and
    no-retired-server emission in add, update, dry-run, and disabled modes.
    
    * fix(hooks): never echo truncated stdin from Stop hooks (#2090)
    
    Stop hooks follow the ECC pass-through convention (echo stdin on
    stdout), but every echoing Stop hook capped stdin and echoed the capped
    string. The Stop payload carries last_assistant_message, so a long
    final assistant message produced a JSON document cut mid-stream on
    stdout, which the harness reports as 'Stop hook error: JSON validation
    failed' across the whole Stop chain.
    
    Reproduced: a Stop payload with a >64KB last_assistant_message run
    through run-with-flags + cost-tracker emitted exactly 65536 bytes of
    invalid JSON (cost-tracker capped stdin at 64KB — far below realistic
    Stop payloads).
    
    - cost-tracker: raise the cap to 1MB (matching all other hooks) and
      suppress the pass-through echo when stdin was truncated.
    - check-console-log, stop-format-typecheck, desktop-notify: suppress
      the echo when stdin was truncated; flush stdout before process.exit
      so sub-cap payloads are not cut at the ~64KB pipe buffer.
    - All hooks keep exiting 0 (fail-open); diagnostics go to stderr.
    
    New stop-hooks-stdout test asserts the contract for every registered
    Stop hook: stdout is empty or valid JSON, exit code 0 — for realistic
    100KB payloads and oversized >1MB payloads, via the production runner
    and via direct invocation. Updated the old hooks.test.js case that
    codified the truncated-echo behavior.
    
    * fix(hooks): dampen GateGuard fact-force repetition in long sessions (#2142)
    
    In long autonomous sessions the fact-force gate produced 10+
    near-identical 'state facts -> blocked -> restate -> retry' blocks in
    one context window, which measurably raises the odds of the model
    collapsing into a degenerate single-token repetition loop.
    
    - Track a per-session fact_force_denials counter in GateGuard state
      (merged max across concurrent writers, reset with the session, robust
      to malformed on-disk values).
    - The first GATEGUARD_FACT_FORCE_FULL_DENIALS denials (default 3) keep
      the full four-fact block; later denials emit a condensed single-line
      message that carries the denial ordinal, so consecutive denials are
      structurally different and never textually identical.
    - True retries of the same target remain allowed without re-prompting
      (unchanged). Destructive-Bash and routine-Bash gates are unchanged,
      as are the ECC_GATEGUARD=off / ECC_DISABLED_HOOKS escape hatches.
    
    Eight new tests cover budget counting, condensed format, ordinal
    advancement, retry pass-through, env tuning, malformed state, MultiEdit
    dampening, and destructive-gate exemption.
    
    * fix(hooks): keep security hooks able to block on oversized stdin (#2222)
    
    Refine the truncation fail-open: instead of skipping the hook entirely,
    the runner now suppresses only its own raw-echo when stdin was
    truncated. The hook still executes and receives the truncated flag
    (run() context / ECC_HOOK_INPUT_TRUNCATED), so config-protection keeps
    blocking truncated protected-config payloads (its test requires exit 2)
    while pass-through hooks fail open with empty stdout as before.
    
    * style: apply repo formatter to touched hook files
  • fix: address remaining review nits
    - Add top-level hooks wrapper to second JSON example (consistent with hooks.json format)
    - Extract hardcoded thresholds as module-level constants (WALL_OF_TEXT_WORDS,
      SUMMARY_CHECK_WORDS, SUMMARY_CHECK_FIRST_N, TASK_OUTPUT_RATIO_HIGH/MEDIUM)
    
    Skipped (not applicable):
    - 'Scoring defaults to 5/5' — by design for heuristic fallback; SKILL.md already
      documents pairing with LLM judge for production use
    - '--output silently ignored' — already fixed by _read_input refactor (checks
      args.output directly, not elif args.task and args.output)
  • fix(docs): clarify Stop event matcher is optional, not disallowed
    Validator (scripts/ci/validate-hooks.js line 182-184) only errors when
    matcher is missing for non-EVENTS_WITHOUT_MATCHER events. For Stop (in
    EVENTS_WITHOUT_MATCHER), matcher is optional — presence is allowed and
    validated for type correctness, absence is also accepted.
  • fix: address second-round review comments
    - Replace httpx.Retry references with correct httpx API usage across all files
      (httpx has no built-in Retry class; use HTTPTransport/Limits instead)
    - Fix _check_summary to check first 100 words (not 100 characters)
    - Fix template to only show → improvement arrow for non-5 scores
    - Clarify hook documentation: hook echoes reminder, does not run evaluator
    - Add return type annotation to main()
    - Make required parameter keyword-only in _read_file_or_text
  • fix: address self-evaluation review comments
    - Clarify that agent-evaluator reads skills/agent-self-evaluation/SKILL.md directly
    - Standardize on Conciseness terminology, including helper names
    - Remove invalid Stop hook matcher and avoid unsupported command-expression matcher examples
    - Add explicit hook-integration reference path in SKILL.md
    - Add summary and self-check fields to evaluate.py output, template, and agent spec
    - Refactor evaluate.py clarity and input parsing helpers
    - Remove unused task parameter from check_completeness
    
    Validation:
    - python3 -m py_compile skills/agent-self-evaluation/scripts/evaluate.py
    - evaluate.py high/low example smoke tests
    - node scripts/ci/validate-agents.js
    - node scripts/ci/validate-skills.js
    - node scripts/ci/validate-hooks.js
    - node scripts/ci/validate-no-personal-paths.js
  • fix: align report format across evaluate.py, agent spec, and template
    - evaluate.py: add CRITICAL ISSUES (axes ≤ 2) section, VERDICT line
    - agent-evaluator.md: match format_report output exactly (title, evidence markers, bar graphs)
    - templates/evaluation-report.md: match evaluate.py output format
    - All now produce identical AGENT SELF-EVALUATION REPORT structure
    
    Single authoritative format: evaluate.py's format_report() output.
  • feat(skills,agents): add agent-self-evaluation skill and agent-evaluator persona
    Add structured 5-axis self-evaluation framework for agent output quality:
    - Accuracy, Completeness, Clarity, Actionability, Conciseness
    - Evidence-based scoring with concrete improvement suggestions
    - Standalone Python evaluator script with keyword heuristics
    - Detailed scoring anchors reference guide
    - High-score and low-score annotated examples
    - Reusable evaluation report template
    - Optional hook integration for session-stop evaluation
    
    Agent persona (agent-evaluator) provides a dedicated subagent
    for applying the rubric to agent output with tool-backed verification.
    
    All files tested: Python script runs, examples score correctly
    (high 4.2, low 3.4), frontmatter parses clean, 183 lines (under 500).
  • feat(skills): add ml-adoption-playbook skill
    - Added ml-adoption-playbook to structure the agentic workflow for adopting ML into non-ML projects.
    
    - Registered the ML playbook in package.json.
    
    - Synchronized catalog counts across documentation and plugin manifests.
  • feat: add taste skill for music-video creative direction
    Distills a named-genre aesthetic vocabulary (angelcore / cloud-trance /
    hyperpop family), a mood + color + light system, and a beat-synced editing
    grammar into a creative-direction layer that sits on top of the existing ECC
    video skills and chains them (video-editing -> fal-ai-media ->
    remotion-video-creation -> motion-* -> content-engine) into one pipeline.
    
    Includes beat math (138 BPM), a section-by-section shot plan, fal.ai prompt
    presets per mood, FFmpeg reframe/beat-cut recipes, a Remotion beat-synced
    composition skeleton, and a companion genre-taxonomy reference.
  • feat: add orch-* orchestrator skill family (#2153)
    * feat: add orch-* orchestrator skill family
    
    Lightweight wrappers that orchestrate existing ECC agents through a gated Research -> Plan -> TDD -> Review -> Commit pipeline, right-sized per task.
    
    - orch-pipeline: shared engine (phases, size classifier, two gates, agent map)
    - orch-add-feature/change-feature/fix-defect/refine-code/build-mvp: thin wrappers delegating to the engine
    
    * chore: register orch-* family in catalog, command registry, and agent.yaml (post-rebase onto green main)
    
    ---------
    
    Co-authored-by: ECC Test <ecc@example.test>
  • fix: make plugin hooks run on Node 21+ and green the suite under modern Node (#2184)
    ROOT CAUSE: hooks load plugin-hook-bootstrap.js via
    `node -e "...; process.argv.splice(1,0,s); require(s)"`. On Node 21+,
    require.main is `undefined` under --eval, so the `if (require.main === module)`
    guard was false and main() never ran — every plugin hook silently no-op'd
    (e.g. the MCP-health PreToolUse hook stopped blocking). CI (Node 18/20) hid
    this; it only surfaces on Node 21+. Fix: also run main() when require.main is
    undefined (the eval-bootstrap case), while staying dormant on real imports.
    
    Also clears pre-existing main debt the full local suite enforces:
    - catalog:sync — README/docs agent+skill counts drifted after recent merges
    - tests/ci/supply-chain-watch-workflow: update checkout SHA to the merged v6.0.3 (#2183)
    - markdownlint + check-unicode-safety --write across docs/skills
    
    Suite: 2683/2683 green under Node v25; lint + unicode clean.
    
    Co-authored-by: ECC Test <ecc@example.test>
  • feat(skills): add laravel-security, laravel-tdd, and php-reviewer agent (#2122)
    * feat(skills): add laravel-security, laravel-tdd, and php-reviewer agent
    
    * fix: resolve code review findings across laravel-security, laravel-tdd, and php-reviewer
    
    - laravel-security: replace env() with config() in runtime code,
      replace wildcard trusted proxies with CIDR ranges, remove blanket
      api/* CSRF exclusion, fix validated() return type, add null-safe
      rate limiter user access, sync mimes/extensions allowlists,
      replace #[Encrypted] with ShouldBeEncrypted, fix RateLimited args
    - laravel-tdd: remove global withoutExceptionHandling() from setUp,
      remove contradictory assertNothingOutgoing(), fix undefined
      variable, replace invalid PHPUnit --min-coverage flag
    - php-reviewer: fix Python contamination, add automated check
      requirement to approval criteria
    
    * fix: align php-reviewer approval criteria and use config dot-notation keys
    
    - agents/php-reviewer.md: sync approval criteria with .txt file version
      (add automated checks requirement for consistency across harnesses)
    - skills/laravel-security/SKILL.md: replace raw env names with proper
      Laravel dot-notation config keys (app.key, services.stripe.*, etc.)
      so config() returns valid values instead of null
    
    * fix: remove unnecessary secret validation for SMTP password
  • feat(skills): add codehealth-mcp skill and CodeScene MCP config (#2077)
    * feat(skills): add codehealth-mcp skill and CodeScene MCP config
    
    * docs(skills): add When to Use, How It Works, and Examples sections
    
    * docs(skills): clarify MCP opt-in, data boundaries, and offline behavior
    
    Address security review on PR #2077: no bundled credentials, document what
    tools read locally, failure behavior when MCP is unavailable, and README
    wording that Code Health MCP is optional and not enabled by default.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
    
    ---------
    
    Co-authored-by: adnasalk-notus <adna.salkovic@notus.hr>
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • feat: add intent-driven-development skill (#2092)
    * feat: add intent-driven-development skill
    
    Converts ambiguous feature or engineering requests into scoped,
    verifiable acceptance criteria before implementation starts.
    
    - Chooses between Quick Capture (low/moderate risk) and Full
      Acceptance Brief (security, data, migration, cross-system changes)
    - Reads repo context before asking questions; only asks what cannot
      be inferred
    - Non-blocking by default: records criteria and proceeds unless a
      real risk requires confirmation
    - Rule 9: when an AC fails mid-implementation due to architectural
      constraints, marks it [revised], updates scope/verification method,
      and re-presents only changed criteria rather than silently dropping
    - Output template includes Revision Log for traceability across
      multiple implementation cycles
    
    * fix: add canonical When to Activate, How It Works, and Examples sections
    
    Required for auto-activation mechanism detection per CONTRIBUTING.md
    and existing skill conventions. Sections inserted after the intro
    and before Operating Rules.
    
    * fix: strengthen intent-driven-development skill per review
    
    Address skill-quality review feedback on the intent-driven-development PR:
    
    - Business/product constraints: add Operating Rule 2 forbidding inference
      of business rules, compliance/SLAs, pricing, retention, prioritization,
      and target users from code; surface the technical-vs-business split in
      How It Works, Discover Context, and a dedicated 'supplied, not inferred'
      section in the brief template.
    - Eval-style pass/fail: add a Pass/Fail Examples section (failing vs
      passing AC, plus a misplaced business-rule context entry) and a 5-point
      Pass/Fail Rubric users can apply to the output.
    - Renumber Operating Rules 1-10 accordingly; markdownlint clean.
  • feat: add inherit-legacy-style — prevent AI code style drift in legac… (#2098)
    * feat: add inherit-legacy-style — prevent AI code style drift in legacy projects
    
    - 4-dimension meta-architecture scan (File Anatomy, State & Control Flow, Infrastructure, Error Handling)
    - Scale-adaptive (small=full read, large=smart sampling)
    - Signal-threshold noise reduction with one-at-a-time grilling protocol
    - Generates .ai-style-rules.md with persistent CLAUDE.md hook
    - Language- and framework-agnostic
    
    * fix: add AskUserQuestion to allowed-tools, add When to Use/How It Works/Examples sections per bot review
    
    ---------
    
    Co-authored-by: wulinzai <linsywu@gmail.com>
  • fix: surface legacy data warning in instinct-cli status (#2127)
    * fix: surface legacy data warning in instinct-cli status (#2036)
    
    When the data directory moved from ~/.claude/homunculus/ to the
    XDG-compliant ~/.local/share/ecc-homunculus/, legacy installs with data
    still in the old path saw "No instincts found" with no explanation.
    
    Add _warn_legacy_data() to cmd_status so users get a clear, actionable
    warning pointing them to the migration script or the CLV2_HOMUNCULUS_DIR
    override. Wrap the directory scan in try/except to handle permission
    errors gracefully.
    
    Closes #2036
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix: address review feedback — drop unused f-strings, resolve absolute migrate path
    
    Remove extraneous f-prefix from strings without interpolation (ruff F541).
    Resolve migrate-homunculus.sh path relative to instinct-cli.py instead of
    hard-coding a repo-relative path that only works from the repo root.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix: quote migrate script path to handle spaces
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: kky <lingmu141592@gmail.com>
    Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
  • fix: refresh stale technical content in agents, rules, and skills (#2168)
    Several published examples contained APIs that no longer exist, code that
    does not run, or model versions that drifted from reality:
    
    - agents/performance-optimizer.md used the web-vitals v3 API
      (getCLS/getFID/getLCP/getFCP/getTTFB) and reported FID. web-vitals v4
      renamed the imports to onCLS/onINP/onLCP/onFCP/onTTFB and FID was
      replaced by INP (target < 200ms)
    - rules/common/performance.md pinned stale model versions in the
      model-selection guidance; refresh to the versions the repo itself uses
      (agent.yaml pins claude-opus-4-6) and add the PowerShell variant for
      MAX_THINKING_TOKENS next to the bash export
    - skills/python-patterns/SKILL.md: both get_value examples referenced
      default_value without declaring the parameter (NameError); add
      default_value: Any = None to the EAFP and LBYL signatures
    - skills/frontend-patterns/SKILL.md: the custom useQuery example rebuilt
      refetch whenever callers passed inline fetchers/options, re-triggering
      the effect after every state update (infinite fetch loop). Keep the
      latest fetcher/options in refs so refetch stays referentially stable.
      The PASS-labelled useMemo example mutated its input with in-place sort;
      copy before sorting
    - skills/coding-standards/SKILL.md repeated the same PASS-labelled
      in-place-sort-in-useMemo example; same fix
    - rules/typescript/security.md used a vendor-specific OPENAI_API_KEY in
      generic guidance; switch to a neutral API_KEY
    
    Every hand-maintained copy of the affected content is synced in the same
    change: locale mirrors (ja-JP, ko-KR, pt-BR, tr, zh-CN, zh-TW - each only
    where it carries the affected file) and the .agents/.kiro/.cursor harness
    mirrors. Two structural divergences are left alone and noted here:
    .kiro/steering/performance.md has no extended-thinking control list to
    carry the PowerShell variant, and docs/zh-TW/rules/performance.md keeps an
    older condensed thinking section without the budget-cap line.
    rules/zh/performance.md is intentionally untouched - the rules/zh tree is
    being retired in a separate change