Compare commits

..

11 Commits

Author SHA1 Message Date
Affaan Mustafa
710c3e6f18 chore: refresh production audit lockfile 2026-05-31 02:42:40 -04:00
Affaan Mustafa
72a3ceeb7a test: keep stable backport assertions scoped 2026-05-31 02:40:02 -04:00
Affaan Mustafa
7cb0cf0433 Revert "fix: warn when populated legacy ~/.claude/homunculus exists (#2036)"
This reverts commit 6048821a0f.
2026-05-31 02:38:31 -04:00
Affaan Mustafa
4d71e8eb1f chore: prepare v1.10.1 stable release 2026-05-31 02:36:13 -04:00
Affaan Mustafa
7f3bc8f1e2 docs: update contribution links for ECC repo 2026-05-31 02:34:27 -04:00
Evan Alferez
654c899b56 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.
2026-05-31 02:34:11 -04:00
Tommy Tyrnov-Tuchin
72d95caf68 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.
2026-05-31 02:33:18 -04:00
Matt Van Horn
6048821a0f 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.
2026-05-31 02:32:24 -04:00
Tommy Tyrnov-Tuchin
3c32a017a2 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.
2026-05-31 02:31:28 -04:00
Chris Yau
8dc02218db 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>
2026-05-31 02:30:12 -04:00
Chris Yau
d82a37444a 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>
2026-05-31 02:30:08 -04:00
21 changed files with 172 additions and 67 deletions

View File

@@ -9,16 +9,15 @@ Show instinct status from continuous-learning-v2: $ARGUMENTS
## Your Task
Run:
Resolve the active ECC plugin root with the same walker `hooks/hooks.json`
uses (env var → standard install → known plugin roots → plugin cache →
fallback), then run the instinct CLI. This avoids reading a stale legacy
`~/.claude/skills/continuous-learning-v2/` install when the plugin is
active under `~/.claude/plugins/cache/...` (#2037).
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
If `CLAUDE_PLUGIN_ROOT` is unavailable, use:
```bash
python3 ~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py status
ECC_ROOT="${CLAUDE_PLUGIN_ROOT:-$(node -e "var r=(()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();console.log(r)")}"
python3 "$ECC_ROOT/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
## Behavior Notes

View File

@@ -1,5 +1,23 @@
# Changelog
## 1.10.1 - 2026-05-31
### Highlights
- Patch release for the stable `1.10.x` line while ECC 2.0 remains on the prerelease channel.
- Backported low-risk reliability fixes for harness auditing, continuous-learning observer defaults, and `/instinct-status` plugin-root resolution.
- Refreshed contribution and translated marketplace links to point at the current `affaan-m/ECC` repository surface.
### Fixes
- Made `scripts/harness-audit.js` handle missing or malformed `package.json` data more defensively.
- Raised the continuous-learning observer default turn budget to better match the 500-line analysis default.
- Updated `/instinct-status` to resolve the active plugin root instead of falling back to stale legacy install paths.
### Notes
- `1.10.1` intentionally avoids claiming ECC 2.0 GA readiness. The control-plane, dedicated ECC agent, and agentic IDE work continues on the `2.0.0-rc` line.
## 1.10.0 - 2026-04-05
### Highlights

View File

@@ -51,8 +51,8 @@ Slash commands that invoke useful workflows:
```bash
# 1. Fork and clone
gh repo fork affaan-m/everything-claude-code --clone
cd everything-claude-code
gh repo fork affaan-m/ECC --clone
cd ECC
# 2. Create a branch
git checkout -b feat/my-contribution
@@ -485,7 +485,7 @@ How you tested this.
## Questions?
- **Issues:** [github.com/affaan-m/everything-claude-code/issues](https://github.com/affaan-m/everything-claude-code/issues)
- **Issues:** [github.com/affaan-m/ECC/issues](https://github.com/affaan-m/ECC/issues)
- **X/Twitter:** [@affaanmustafa](https://x.com/affaanmustafa)
---

View File

@@ -82,6 +82,13 @@ This repo is the raw code only. The guides explain everything.
## What's New
### v1.10.1 — Stable Reliability Patch (May 2026)
- **Stable-channel momentum while ECC 2.0 remains prerelease** — `1.10.1` keeps the public npm/release lane moving without overstating control-plane GA readiness.
- **Continuous-learning reliability** — observer analysis now has a larger default turn budget for the 500-line analysis window.
- **Command and audit hardening** — `/instinct-status` resolves the active plugin root more reliably, and harness auditing handles missing package metadata more defensively.
- **Repository-surface cleanup** — contribution and translated marketplace links now point at the current `affaan-m/ECC` public repo surface.
### v1.10.0 — Surface Refresh, Operator Workflows, and ECC 2.0 Alpha (Apr 2026)
- **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.
@@ -1250,7 +1257,7 @@ ECC is the **first plugin to maximize every major AI coding tool**. Here's how e
| **Context File** | CLAUDE.md + AGENTS.md | AGENTS.md | AGENTS.md | AGENTS.md |
| **Secret Detection** | Hook-based | beforeSubmitPrompt hook | Sandbox-based | Hook-based |
| **Auto-Format** | PostToolUse hook | afterFileEdit hook | N/A | file.edited hook |
| **Version** | Plugin | Plugin | Reference config | 1.10.0 |
| **Version** | Plugin | Plugin | Reference config | 1.10.1 |
**Key architectural decisions:**
- **AGENTS.md** at root is the universal cross-tool file (read by all 4 tools)

View File

@@ -10,16 +10,16 @@ Shows learned instincts for the current project plus global instincts, grouped b
## Implementation
Run the instinct CLI using the plugin root path:
Run the instinct CLI, resolving the active ECC plugin root the same way
`hooks/hooks.json` and the other slash commands (`/sessions`, `/skill-health`)
do — env var → standard install → known plugin roots → plugin cache → fallback.
This avoids the divergence that happens when `CLAUDE_PLUGIN_ROOT` is unset
while a legacy `~/.claude/skills/continuous-learning-v2/` directory still
exists (#2037).
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
Or if `CLAUDE_PLUGIN_ROOT` is not set (manual installation), use:
```bash
python3 ~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py status
ECC_ROOT="${CLAUDE_PLUGIN_ROOT:-$(node -e "var r=(()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();console.log(r)")}"
python3 "$ECC_ROOT/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
## Usage

View File

@@ -107,7 +107,7 @@
```bash
# マーケットプレイスを追加
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# プラグインをインストール
/plugin install everything-claude-code@everything-claude-code
@@ -424,7 +424,7 @@ Duplicate hook file detected: ./hooks/hooks.json is already resolved to a loaded
```bash
# このリポジトリをマーケットプレイスとして追加
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# プラグインをインストール
/plugin install everything-claude-code@everything-claude-code

View File

@@ -10,16 +10,16 @@ command: true
## 実装
プラグインルートパスを使用してインスティンクトCLIを実行します:
`hooks/hooks.json` および他のスラッシュコマンド(`/sessions``/skill-health`
と同じリゾルバ(環境変数 → 標準インストール → 既知のプラグインルート →
プラグインキャッシュ → フォールバックでインスティンクトCLIを実行します。
これにより、`CLAUDE_PLUGIN_ROOT` が未設定で
レガシーの `~/.claude/skills/continuous-learning-v2/` ディレクトリが
残っているときに発生するパスの分岐を回避します (#2037)。
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
または、`CLAUDE_PLUGIN_ROOT` が設定されていない場合(手動インストール)の場合は:
```bash
python3 ~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py status
ECC_ROOT="${CLAUDE_PLUGIN_ROOT:-$(node -e "var r=(()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();console.log(r)")}"
python3 "$ECC_ROOT/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
## 使用方法

View File

@@ -112,7 +112,7 @@
```bash
# 마켓플레이스 추가
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# 플러그인 설치
/plugin install everything-claude-code@everything-claude-code
@@ -356,7 +356,7 @@ Claude Code v2.1+는 설치된 플러그인의 `hooks/hooks.json`을 **자동으
```bash
# 마켓플레이스 추가
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# 플러그인 설치
/plugin install everything-claude-code@everything-claude-code

View File

@@ -112,7 +112,7 @@ Comece em menos de 2 minutos:
```bash
# Adicionar marketplace
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# Instalar plugin
/plugin install everything-claude-code@everything-claude-code
@@ -301,7 +301,7 @@ claude --version
```bash
# Adicionar este repositório como marketplace
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# Instalar o plugin
/plugin install everything-claude-code@everything-claude-code

View File

@@ -0,0 +1,40 @@
# ECC v1.10.1 Release Notes
## Positioning
ECC v1.10.1 is a stable-channel reliability patch.
This release keeps the public `latest` line moving while the larger ECC 2.0 control-plane, dedicated ECC agent, and agentic IDE work remains on the prerelease track.
## What Changed
- Hardened harness auditing around missing or malformed package metadata.
- Increased the continuous-learning observer default turn budget so the default 500-line analysis window has enough room to complete.
- Fixed `/instinct-status` plugin-root resolution so the command does not fall back to stale legacy install paths.
- Updated contribution and translated marketplace links to the current `affaan-m/ECC` public repo surface.
## ECC 2.0 Status
ECC 2.0 is still a prerelease lane.
The stable `1.10.x` line remains the right public install surface for users who want the current meta-harness, skills, rules, hooks, commands, and cross-harness install story without opting into the next control-plane generation.
The `2.0.0-rc` line is where the larger product vision belongs:
- meta-harness
- dedicated ECC agent
- control pane / agentic IDE
- multi-harness operating layer
- stronger evaluation, memory, and permission boundaries
## Upgrade
```bash
npm install -g ecc-universal@1.10.1
```
or:
```bash
npx ecc-universal@1.10.1 install --profile developer
```

View File

@@ -113,7 +113,7 @@ Bu repository yalnızca ham kodu içerir. Rehberler her şeyi açıklıyor.
```bash
# Marketplace ekle
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# Plugin'i kur
/plugin install everything-claude-code@everything-claude-code

View File

@@ -10,16 +10,16 @@ Mevcut proje için öğrenilen içgüdüleri ve global içgüdüleri, domain'e g
## Uygulama
Plugin root path kullanarak instinct CLI'ı çalıştır:
`hooks/hooks.json` ve diğer slash komutlarının (`/sessions`, `/skill-health`)
kullandığı çözümleyiciyle (env var → standart kurulum → bilinen plugin
kökleri → plugin önbelleği → fallback) instinct CLI'ı çalıştır.
Bu, `CLAUDE_PLUGIN_ROOT` ayarlanmamışken eski bir
`~/.claude/skills/continuous-learning-v2/` dizini hâlâ varsa oluşan
yol sapmasını önler (#2037).
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
Veya `CLAUDE_PLUGIN_ROOT` ayarlanmamışsa (manuel kurulum):
```bash
python3 ~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py status
ECC_ROOT="${CLAUDE_PLUGIN_ROOT:-$(node -e "var r=(()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();console.log(r)")}"
python3 "$ECC_ROOT/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
## Kullanım

View File

@@ -158,7 +158,7 @@
```bash
# Add marketplace
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# Install plugin
/plugin install everything-claude-code@everything-claude-code
@@ -582,7 +582,7 @@ Claude Code v2.1+ **会自动加载** 任何已安装插件中的 `hooks/hooks.j
```bash
# Add this repo as a marketplace
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# Install the plugin
/plugin install everything-claude-code@everything-claude-code

View File

@@ -10,16 +10,14 @@ command: true
## 实现
使用插件根路径运行本能 CLI
以与 `hooks/hooks.json` 和其他斜杠命令(`/sessions``/skill-health`
相同的解析器运行本能 CLI——环境变量 → 标准安装 → 已知插件根 → 插件缓存 → 回退。
这样可以避免当 `CLAUDE_PLUGIN_ROOT` 未设置而旧的
`~/.claude/skills/continuous-learning-v2/` 目录仍然存在时发生的路径分歧 (#2037)。
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
或者,如果未设置 `CLAUDE_PLUGIN_ROOT`(手动安装),则使用:
```bash
python3 ~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py status
ECC_ROOT="${CLAUDE_PLUGIN_ROOT:-$(node -e "var r=(()=>{var e=process.env.CLAUDE_PLUGIN_ROOT;if(e&&e.trim())return e.trim();var p=require('path'),f=require('fs'),h=require('os').homedir(),d=p.join(h,'.claude'),q=p.join('scripts','lib','utils.js');if(f.existsSync(p.join(d,q)))return d;for(var s of [['ecc'],['ecc@ecc'],['marketplaces','ecc'],['everything-claude-code'],['everything-claude-code@everything-claude-code'],['marketplaces','everything-claude-code']]){var l=p.join(d,'plugins',...s);if(f.existsSync(p.join(l,q)))return l}try{for(var g of ['ecc','everything-claude-code']){var b=p.join(d,'plugins','cache',g);for(var o of f.readdirSync(b,{withFileTypes:true})){if(!o.isDirectory())continue;for(var v of f.readdirSync(p.join(b,o.name),{withFileTypes:true})){if(!v.isDirectory())continue;var c=p.join(b,o.name,v.name);if(f.existsSync(p.join(c,q)))return c}}}}catch(x){}return d})();console.log(r)")}"
python3 "$ECC_ROOT/skills/continuous-learning-v2/scripts/instinct-cli.py" status
```
## 用法

View File

@@ -67,7 +67,7 @@
```bash
# 新增市集
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# 安裝外掛程式
/plugin install everything-claude-code@everything-claude-code
@@ -267,7 +267,7 @@ everything-claude-code/
```bash
# 將此儲存庫新增為市集
/plugin marketplace add https://github.com/affaan-m/everything-claude-code
/plugin marketplace add https://github.com/affaan-m/ECC
# 安裝外掛程式
/plugin install everything-claude-code@everything-claude-code

10
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "ecc-universal",
"version": "1.10.0",
"version": "1.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ecc-universal",
"version": "1.10.0",
"version": "1.10.1",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -998,9 +998,9 @@
"license": "MIT"
},
"node_modules/fast-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
"integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
"funding": [
{
"type": "github",

View File

@@ -1,6 +1,6 @@
{
"name": "ecc-universal",
"version": "1.10.0",
"version": "1.10.1",
"description": "Complete collection of battle-tested Claude Code configs — agents, skills, hooks, rules, and legacy command shims evolved over 10+ months of intensive daily use by an Anthropic hackathon winner",
"keywords": [
"claude-code",

View File

@@ -199,7 +199,7 @@ function findPluginInstall(rootDir) {
}
function getRepoChecks(rootDir) {
const packageJson = JSON.parse(readText(rootDir, 'package.json'));
const packageJson = safeParseJson(safeRead(rootDir, 'package.json'));
const commandPrimary = safeRead(rootDir, 'commands/harness-audit.md').trim();
const commandParity = safeRead(rootDir, '.opencode/commands/harness-audit.md').trim();
const hooksJson = safeRead(rootDir, 'hooks/hooks.json');
@@ -312,7 +312,7 @@ function getRepoChecks(rootDir) {
scopes: ['repo'],
path: 'package.json',
description: 'Test script runs validator chain before tests',
pass: typeof packageJson.scripts?.test === 'string' && packageJson.scripts.test.includes('validate-commands.js') && packageJson.scripts.test.includes('tests/run-all.js'),
pass: typeof packageJson?.scripts?.test === 'string' && packageJson?.scripts?.test.includes('validate-commands.js') && packageJson?.scripts?.test.includes('tests/run-all.js'),
fix: 'Update package.json test script to run validators plus tests/run-all.js.',
},
{

View File

@@ -170,17 +170,20 @@ Rules:
PROMPT
timeout_seconds="${ECC_OBSERVER_TIMEOUT_SECONDS:-120}"
max_turns="${ECC_OBSERVER_MAX_TURNS:-10}"
# Default MAX_TURNS=50 to pair with the MAX_ANALYSIS_LINES=500 default (#2035).
# A 500-observation batch consistently exhausted the previous 20-turn budget,
# forcing every first-cycle analysis to fail with "Reached max turns".
max_turns="${ECC_OBSERVER_MAX_TURNS:-50}"
exit_code=0
case "$max_turns" in
''|*[!0-9]*)
max_turns=10
max_turns=50
;;
esac
if [ "$max_turns" -lt 4 ]; then
max_turns=10
max_turns=50
fi
# Ensure CWD is PROJECT_DIR so the relative analysis_relpath resolves correctly

View File

@@ -2461,7 +2461,7 @@ async function runTests() {
const observerLoopSource = fs.readFileSync(path.join(__dirname, '..', '..', 'skills', 'continuous-learning-v2', 'agents', 'observer-loop.sh'), 'utf8');
assert.ok(observerLoopSource.includes('ECC_OBSERVER_MAX_TURNS'), 'observer-loop should allow max-turn overrides');
assert.ok(observerLoopSource.includes('max_turns="${ECC_OBSERVER_MAX_TURNS:-10}"'), 'observer-loop should default to 10 turns');
assert.ok(observerLoopSource.includes('max_turns="${ECC_OBSERVER_MAX_TURNS:-50}"'), 'observer-loop should default to 50 turns to pair with MAX_ANALYSIS_LINES=500 (#2035)');
assert.ok(!observerLoopSource.includes('--max-turns 3'), 'observer-loop should not hardcode a 3-turn limit');
assert.ok(observerLoopSource.includes('ECC_SKIP_OBSERVE=1'), 'observer-loop should suppress observe.sh for automated sessions');
assert.ok(observerLoopSource.includes('ECC_HOOK_PROFILE=minimal'), 'observer-loop should run automated analysis with the minimal hook profile');

View File

@@ -0,0 +1,40 @@
'use strict';
const fs = require('fs');
const path = require('path');
const assert = require('assert');
let passed = 0;
let failed = 0;
function test(name, fn) {
try {
fn();
console.log(`PASS ${name}`);
passed += 1;
} catch (error) {
console.error(`FAIL ${name}`);
console.error(error.stack || error.message || String(error));
failed += 1;
}
}
const instinctStatusDoc = fs.readFileSync(path.join(__dirname, '..', '..', 'commands', 'instinct-status.md'), 'utf8');
test('instinct-status command uses shared inline resolver (no stale legacy fallback) (#2037)', () => {
assert.strictEqual((instinctStatusDoc.match(/var r=/g) || []).length, 1);
assert.strictEqual((instinctStatusDoc.match(/\['marketplaces','ecc'\]/g) || []).length, 1);
assert.strictEqual((instinctStatusDoc.match(/\['marketplaces','everything-claude-code'\]/g) || []).length, 1);
assert.strictEqual((instinctStatusDoc.match(/\['ecc','everything-claude-code'\]/g) || []).length, 1);
// The pre-fix template hard-coded the legacy path as a fallback when
// CLAUDE_PLUGIN_ROOT was unset. Asserting its absence prevents regression.
assert.ok(
!instinctStatusDoc.includes('python3 ~/.claude/skills/continuous-learning-v2/scripts/instinct-cli.py'),
'instinct-status should not hard-code the legacy ~/.claude install path as a fallback'
);
});
console.log(`Passed: ${passed}`);
console.log(`Failed: ${failed}`);
process.exit(failed > 0 ? 1 : 0);