Commit Graph

1073 Commits

  • fix(docs): sync marketplace add URL across translated READMEs (#2050)
    PR #2050 updated the root README.zh-CN.md install commands after the
    everything-claude-code → ECC rename, but the same stale marketplace URL
    remained in nine docs/<locale>/README.md copies. Align those quick-start
    and self-hosted install blocks so /plugin install ecc@ecc resolves the
    ecc marketplace instead of everything-claude-code.
  • fix(commands): resolve active plugin root in /instinct-status (#2037)
    The `/instinct-status` slash command template expanded
    `${CLAUDE_PLUGIN_ROOT}` directly and documented a manual-install
    fallback to `~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py`.
    When users had both an active plugin install (under
    `~/.claude/plugins/cache/<slug>/<org>/<version>/`) and a legacy
    `~/.claude/skills/continuous-learning-v2/` directory left over from a
    previous manual install, an empty `CLAUDE_PLUGIN_ROOT` (which Claude
    Code does not always populate in slash-command shell contexts) silently
    made the command read the stale legacy install while the active plugin
    hooks and observer wrote to the new XDG path. The user saw "No
    instincts found" while the system was actively learning — exactly the
    divergence the bug reporter spent hours diagnosing.
    
    Replace the brittle two-block template with the same inline resolver
    pattern that `hooks/hooks.json` and `/sessions` / `/skill-health`
    already use: env var → standard install → known plugin roots → plugin
    cache walk → fallback. The resolver is the canonical `INLINE_RESOLVE`
    constant from `scripts/lib/resolve-ecc-root.js`, so no new code is
    introduced — just consistent adoption of the existing pattern.
    
    Apply the same fix to all five copies of the command:
      - commands/instinct-status.md (canonical)
      - .opencode/commands/instinct-status.md
      - docs/zh-CN/commands/instinct-status.md
      - docs/ja-JP/commands/instinct-status.md
      - docs/tr/commands/instinct-status.md
    
    Extend tests/lib/command-plugin-root.test.js with an assertion that the
    canonical instinct-status.md uses the inline resolver and no longer
    hard-codes the legacy `~/.claude/skills/...` fallback (regression
    guard).
    
    zh-CN copy: polish the Chinese phrasing per LanguageTool feedback
    (`使用与 ... 相同的解析器` → `以与 ... 相同的解析器`) so the verb is
    introduced by an explicit preposition instead of reading as an awkward
    verb-object construction.
  • fix: warn when populated legacy ~/.claude/homunculus exists (#2036)
    After the XDG migration the CLI reads from
    $XDG_DATA_HOME/ecc-homunculus/ (default ~/.local/share/ecc-homunculus/),
    but installs that retained an older manual copy at ~/.claude/homunculus/
    saw observations land in the new location while `instinct-cli.py status`
    silently continued to look at the new directory only. The reporter
    spent hours tracing the divergence because nothing surfaced the legacy
    tree.
    
    Add `_detect_legacy_homunculus_dir()` which returns the legacy path
    when ~/.claude/homunculus/ contains real ECC state (projects/,
    instincts/, evolved/, or observations.jsonl) and the active
    HOMUNCULUS_DIR is different. `cmd_status` calls it at the bottom of
    its output and prints a one-time, scoped warning that names both
    paths and points at the existing migrate-homunculus.sh script.
    
    Empty placeholder directories (just ~/.claude/homunculus/ with no
    content) are ignored so users who have already migrated and left the
    empty shell behind don't get nagged on every status call.
    
    Tests cover three branches: populated legacy dir triggers the warning,
    absent legacy dir stays silent, and empty placeholder legacy dir stays
    silent.
  • fix(continuous-learning): bump observer MAX_TURNS default to 50 (#2035)
    The observer's MAX_TURNS default of 20 was systematically insufficient
    for the MAX_ANALYSIS_LINES default of 500. First-cycle analysis on a
    fresh project consistently failed with "Reached max turns (20)", forcing
    users to either raise ECC_OBSERVER_MAX_TURNS or lower
    ECC_OBSERVER_MAX_ANALYSIS_LINES before the observer became useful.
    
    Pair the defaults so the out-of-the-box experience succeeds: bump
    MAX_TURNS to 50 (the value the reporter empirically settled on for the
    500-line default). The safety floor (turns < 4 falls back to default) is
    preserved.
    
    Test asserting the default constant is updated alongside the source.
  • fix: null-safe package.json access in getRepoChecks
    Review follow-up (CodeRabbit + cubic): switching to safeParseJson at line
    389 means packageJson can be null on a missing/malformed package.json, but
    the quality-ci-validations check dereferenced packageJson.scripts before the
    optional chaining could help — throwing TypeError instead of degrading.
    Guard the base object with packageJson?.scripts?.test at the access site,
    matching the file's existing convention (e.g. line 220 uses packageJson?.name).
    
    Generated with [Claude Code](https://claude.ai/code)
    via [Happy](https://happy.engineering)
    
    Co-Authored-By: Claude <noreply@anthropic.com>
    Co-Authored-By: Happy <yesreply@happy.engineering>
  • fix: guard two script edge cases
    - scripts/harness-audit.js: getRepoChecks() parsed package.json with raw
      JSON.parse(readText(...)), while the rest of the file (lines 218, 822)
      uses the tolerant safeParseJson(safeRead(...)). In repo target mode a
      project lacking package.json — or with malformed JSON — threw an uncaught
      exception and crashed the audit instead of degrading. Match the existing
      convention so the audit tolerates a missing/invalid package.json.
    
    - skills/frontend-slides/scripts/export-pdf.sh: `set -- "${POSITIONAL[@]}"`
      expands an empty array under `set -u` on bash 3.2 (the macOS system bash),
      aborting with "POSITIONAL[@]: unbound variable" instead of printing the
      usage message when invoked with no positional args. Guard the expansion
      with ${POSITIONAL[@]+"${POSITIONAL[@]}"} (no-op safe under bash 3.2 set -u).
    
    Generated with [Claude Code](https://claude.ai/code)
    via [Happy](https://happy.engineering)
    
    Co-Authored-By: Claude <noreply@anthropic.com>
    Co-Authored-By: Happy <yesreply@happy.engineering>
  • fix(security): remove evalview-agent-testing skill — external dependency
    Removed skills/evalview-agent-testing/ which required `pip install evalview`
    from an unvetted third-party package. ECC skills must be self-contained
    and not require installing external packages to function.
    
    If we need agent regression testing, we build it natively in ECC.
  • feat(skills): add orch-runtime skill for persistent AI agent team dispatch (#559)
    Adds integration skill for ORCH (@oxgeneral/orch) — a TypeScript CLI runtime
    that coordinates Claude Code, OpenCode, Codex, and Cursor agents as a typed
    engineering team with formal state machine, auto-retry, and inter-agent messaging.
    
    Use this skill when ECC tasks need to survive multiple sessions, require a review
    gate before completion, or involve a persistent specialized agent team.
    
    Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
    Co-authored-by: Affaan Mustafa <me@affaanmustafa.com>
  • feat(opencode): add changed-files tree with change indicators (#815)
    * feat(opencode): add changed-files tree with change indicators
    
    * feat(opencode): address changed-files review feedback
    
    ---------
    
    Co-authored-by: Affaan Mustafa <me@affaanmustafa.com>
  • feat(skills): add evalview-agent-testing skill and MCP server (#828)
    * feat(skills): add evalview-agent-testing skill and MCP server
    
    Add EvalView as a regression testing skill for AI agents. EvalView
    snapshots agent behavior (tool calls, parameters, output), then diffs
    against baselines after every change — catching regressions before they
    ship.
    
    Skill covers:
    - CLI workflow (init → snapshot → check → monitor)
    - Python API (gate() / gate_async() for autonomous loops)
    - Quick mode (no LLM judge, $0, sub-second)
    - CI/CD integration (GitHub Actions with PR comments)
    - MCP integration (8 tools for Claude Code)
    - Multi-turn test cases
    - OpenClaw integration for autonomous agents
    
    Also adds evalview MCP server to mcp-servers.json.
    
    * fix(skills): pin action SHA and remove unvetted external links
    
    - Pin hidai25/eval-view action to commit SHA instead of @main
    - Replace external GitHub links with PyPI package link (vetted registry)
    
    Addresses cubic-dev-ai review feedback.
    
    * fix(skills): replace third-party action with pip install + CLI
    
    Use plain pip install + evalview CLI instead of a third-party GitHub
    Action. No external actions, no secrets passed to unvetted code.
    
    Addresses cubic-dev-ai supply-chain review feedback.
    
    * fix(skills): add destructive revert warning for gate_or_revert
    
    Add prominent warning that gate_or_revert runs git checkout,
    discarding uncommitted changes. Documents the revert_cmd override
    for safer alternatives like git stash.
    
    Addresses cubic-dev-ai review feedback.
    
    * fix(skills): pin pip version range and document fail-on tradeoffs
    
    - Pin evalview to >=0.5,<1 to prevent breaking CI on major upgrades
    - Document --fail-on REGRESSION vs --strict tradeoff so users
      understand what gates and what passes through
    
    Addresses greptile-apps review feedback.
    
    * fix: use python3 -m evalview for venv compatibility in MCP config
    
    Follows the same pattern as insaits entry. Resolves correctly even
    when evalview is installed in a virtual environment that isn't on
    the system PATH.
    
    * fix: align MCP install command with mcp-servers.json pattern
    
    Use python3 -m evalview mcp serve consistently across both the
    skill docs and the MCP config catalog.
    
    * fix: use evalview CLI entry point for MCP command
    
    pip install evalview installs the evalview binary to PATH, so using
    it directly is consistent with the install docs and avoids python3
    version mismatch issues.
    
    * fix: pin install version to match CI section
    
    * fix: pin all pip install references consistently
    
    * fix: add API key placeholder and pin install version in MCP config
    
    Add OPENAI_API_KEY env placeholder matching other entries. Note that
    the key is optional — deterministic checks work without it. Pin
    install version to match skill docs.
    
    * fix: guard score_delta format for non-scored statuses
    
    ---------
    
    Co-authored-by: Affaan Mustafa <me@affaanmustafa.com>
  • feat: add PRP workflow commands adapted from PRPs-agentic-eng (#848)
    * feat: add PRP workflow commands adapted from PRPs-agentic-eng
    
    Add 5 new PRP workflow commands and extend 2 existing commands:
    
    New commands:
    - prp-prd.md: Interactive PRD generator with 8 phases
    - prp-plan.md: Deep implementation planning with codebase analysis
    - prp-implement.md: Plan executor with rigorous validation loops
    - prp-commit.md: Quick commit with natural language file targeting
    - prp-pr.md: GitHub PR creation from current branch
    
    Extended commands:
    - code-review.md: Added GitHub PR review mode alongside local review
    - plan.md: Added cross-reference to /prp-plan for deeper planning
    
    Adapted from PRPs-agentic-eng by Wirasm. Sub-agents remapped to
    inline Claude instructions. ECC conventions applied throughout
    (YAML frontmatter, Phase headings, tables, no XML tags).
    
    Artifacts stored in .claude/PRPs/{prds,plans,reports,reviews}/.
    
    * fix: address PR #848 review feedback
    
    - Remove external URLs from all 6 command files (keep attribution text)
    - Quote $ARGUMENTS in prp-implement.md to handle paths with spaces
    - Fix empty git add expansion in prp-commit.md (use xargs -r)
    - Rewrite sub-agent language in prp-prd.md as direct instructions
    - Fix code-review.md: add full-file fetch for PR reviews, replace
      || fallback chains with project-type detection, use proper GitHub
      API for inline review comments
    - Fix nested backticks in prp-plan.md Plan Template (use 4-backtick fence)
    - Clarify $ARGUMENTS parsing in prp-pr.md for base branch + flags
    - Fix fragile integration test pattern in prp-implement.md (proper
      PID tracking, wait-for-ready loop, clean shutdown)
    
    * fix: address second-pass review feedback on PR #848
    
    - Add required 'side' field to GitHub review comments API call (code-review.md)
    - Replace GNU-only xargs -r with portable alternative (prp-commit.md)
    - Add failure check after server readiness timeout (prp-implement.md)
    - Fix unsafe word-splitting in file-fetch loop using read -r (code-review.md)
    - Make git reset pathspec tolerant of zero matches (prp-commit.md)
    - Quote PRD file path in cat command (prp-plan.md)
    - Fix plan filename placeholder inconsistency (prp-plan.md)
    - Add PR template directory scan before fixed-path fallbacks (prp-pr.md)
  • feat(opencode): complete OpenCode agent setup - add 10 missing agent prompts (#726)
    * feat(opencode): complete OpenCode agent setup - add 11 missing agent prompts
    
    Summary:
    - Add 11 missing OpenCode agent prompt files for: chief-of-staff, cpp-reviewer, cpp-build-resolver, docs-lookup, harness-optimizer, java-reviewer, java-build-resolver, kotlin-reviewer, kotlin-build-resolver, loop-operator, python-reviewer
    - Update opencode.json to register all 25 agents (previously only 14 were configured)
    
    Type:
    - [x] Agent
    
    Testing:
    - Verified JSON syntax is valid
    - All 25 agents now have corresponding prompt files in .opencode/prompts/agents/
    - opencode.json updated with all agent configurations
    
    * fix: address PR review comments - add SOUL.md, update AGENTS.md, fix tool configs, and refine agent prompts
    
    * fix: remove chief-of-staff agent and SOUL.md per affaan-m review
    
    - Remove chief-of-staff agent from opencode.json (outside ECC scope)
    - Remove chief-of-staff.txt prompt file
    - Remove SOUL.md file
    - Remove chief-of-staff from AGENTS.md table and orchestration section
    - Update agent count from 28 to 27
    
    ---------
    
    Co-authored-by: Nayan Jaiswal <jaiswal2062@gmail.com>