Commit Graph
619 Commits
Author SHA1 Message Date
Yann Roberto 159440d259 chore: sync context routing branch with main 2026-10-05 00:13:45 +08:00
basil-k-aji-dev cd85014b9e fix(plan-canvas): route session state through CLAUDE_CONFIG_DIR
The Plan Canvas library wrote ~/.claude/plan-canvas while the SessionStart
and Stop hooks read CLAUDE_CONFIG_DIR/plan-canvas. Under a second profile
SessionStart missed open reviews and Stop let a turn end with feedback
still queued.

Expand a leading ~ in CLAUDE_CONFIG_DIR the way scripts/lib/agent-data-home.js
does, so a profile written as ~/.claude-work resolves to one directory rather
than two.

Add hook-level coverage that spawns each hook with a distinct
CLAUDE_CONFIG_DIR and no ECC_* override, plus a producer-to-consumer round
trip. Eight of the nine cases fail against the previous revision.
2026-10-03 20:20:40 +05:30
basil-k-aji-dev 14d54a9285 test(agent-data-home): pin the trusted root that moves with CLAUDE_CONFIG_DIR
getDefaultClaudeAgentDataHome() is one of the two roots
resolveAllowedProjectConfigHome() accepts, so following CLAUDE_CONFIG_DIR
moves a security boundary and not just a default. The case asserts the
containment holds at the new location and nowhere else: a path inside the
relocated root is accepted, while the old ~/.claude, a traversal out of the
new root, and an arbitrary home path are all still refused.

It bites. Re-adding ~/.claude as a third allowed root, which is the obvious
way to get this wrong, turns the case red.
2026-10-03 12:50:23 +05:30
basil-k-aji-dev 00d73fbae2 fix(hooks): honor CLAUDE_CONFIG_DIR instead of writing to ~/.claude
Claude Code points every profile-local path at CLAUDE_CONFIG_DIR when it is
set, but ECC hooks kept reading and writing ~/.claude. A session launched
under a second profile left its bash log, cost tracker, metrics, session data
and skill runs in the default profile, where the other one reads them back.

Two groups, as reported:

- getDefaultClaudeAgentDataHome() in scripts/lib/agent-data-home.js now
  follows the variable, which covers every hook reaching ~/.claude through
  resolveAgentDataHome(). ECC_AGENT_DATA_HOME still wins, so the documented
  workaround keeps working.
- plan-canvas-pending, plan-canvas-sessions, mcp-health-check and
  post-bash-command-log hard-coded os.homedir()/.claude and now resolve the
  same way, matching scripts/hooks/ecc-statusline.js:68.

A blank value is ignored rather than resolved, since path.resolve('  ')
returns the process cwd and would scatter profile data through whatever
directory the session started in.

Fixes #3266
2026-10-03 12:34:14 +05:30
Karim FarahatandClaude Opus 5.5 5ecca8883e test: isolate OpenCode config dirs in state-store CLI tests
The OpenCode install target resolves its root from OPENCODE_CONFIG_DIR,
then XDG_CONFIG_HOME/opencode, before falling back to HOME. Inheriting
either variable still let a developer's real OpenCode install-state reach
the spawned status CLI and fail the same four tests. Point both into the
isolated home.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 15:34:17 +04:00
Karim FarahatandClaude Opus 5.5 3ebc9bd3d2 test: isolate HOME in state-store CLI tests
The status CLI reconciles install-state discovered under $HOME. The
state-store tests spawned it with the developer's real environment, so on
any machine with ECC installed the real ~/.claude install was counted as an
extra warning and four status/work-items assertions failed (3 attention
items instead of 2). CI stays green only because runners have no install.

Point HOME and USERPROFILE at an empty temp dir for spawned CLIs, cleaned up
on exit. Callers can still override via options.env.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 15:05:45 +04:00
Affaan Mustafa c05b2d6614 chore: retire the Everything Claude Code name, ECC only (#3330)
* chore: retire the Everything Claude Code name, ECC only

Replace the expanded product name and the everything-claude-code slug
with ECC across READMEs, translated docs, harness folders, skills,
commands, scripts and examples. Repo URLs now point at affaan-m/ECC.

Rename repo-internal artifacts to ecc forms (ecc-conventions skill,
ecc-guardrails, ecc-research-playbook, ecc-team-config, ecc-instincts
with ecc-* ids) and update .claude/ecc-tools.json.

Legacy install ids, plugin dirs, package names and MCP prefixes stay
where existing installs resolve against them. The codex global-state
check and harness-audit repo detection accept the new name first and
the legacy one as a fallback. The Discord bot prefers ~/GitHub/ECC and
falls back to the nested legacy checkout path.

Refresh the skill-triggers registryDigest for the changed skill text.

* fix(ecc-tools): drop managed paths to the removed Claude repo skill

.claude/skills/<repo-skill>/SKILL.md was deleted in #2770 but stayed listed in
ecc-tools.json and the team config. Remove those entries and point the Claude
Code adapter at the existing .agents/skills/ecc-conventions/SKILL.md.
2026-10-01 17:50:41 -05:00
Yann Roberto 2d2712b899 fix(context): honor directive order and singular rejections 2026-10-01 15:03:34 +08:00
Yann Roberto 184c657788 fix(sessions): preserve committed results on lock cleanup errors 2026-10-01 14:59:29 +08:00
Jeffrey Montoya ab45ed1edf test(gateguard): pin questions for classes that skip profiling 2026-10-01 02:15:54 -04:00
Yann Roberto b1ba495997 fix(sessions): serialize alias read-modify-write operations 2026-10-01 13:27:55 +08:00
Yann Roberto f302863d58 fix(context): respect indirect skill citations in auto routing 2026-10-01 13:27:51 +08:00
haelyra 7c03203dd8 Merge remote-tracking branch 'refs/remotes/pr/3267' into maint/stewardship-batch-2026-09-30 2026-09-30 13:21:01 -04:00
haelyra c965a61da5 Merge remote-tracking branch 'refs/remotes/pr/2655' into maint/stewardship-batch-2026-09-30
# Conflicts:
#	.claude-plugin/marketplace.json
#	.claude-plugin/plugin.json
#	AGENTS.md
#	README.md
#	README.zh-CN.md
#	docs/de-DE/README.md
#	docs/es/README.md
#	docs/ja-JP/README.md
#	docs/ko-KR/README.md
#	docs/pt-BR/README.md
#	docs/ru/README.md
#	docs/th/README.md
#	docs/tr/AGENTS.md
#	docs/tr/README.md
#	docs/uk-UA/README.md
#	docs/ur/README.md
#	docs/vi-VN/README.md
#	docs/zh-CN/AGENTS.md
#	docs/zh-CN/README.md
#	docs/zh-TW/README.md
#	scripts/lib/install-manifests.js
2026-09-30 13:20:41 -04:00
Yann Roberto 3768c03653 fix(state-store): preserve permission errors after lock retries 2026-10-01 01:03:41 +08:00
Yann Roberto 94cd7db7c3 fix(state-store): retry Windows contention and repair fixtures 2026-10-01 00:25:22 +08:00
Jeffrey Montoya d39fcd8ac3 refactor(gateguard): read the transcript tail through a small shared module 2026-09-30 12:13:10 -04:00
drakeo338andClaude Sonnet 5.5 b802ec80a6 test(hooks): compare project sharing path against the canonical temp dir
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 16:06:15 +00:00
Jeffrey Montoya eab92ed21d perf(gateguard): skip plain character runs when lexing code 2026-09-30 11:35:49 -04:00
Jeffrey Montoya b7f80ff012 perf(gateguard): load modules and parse searches only when a call needs them 2026-09-30 11:35:49 -04:00
drakeo338andClaude Sonnet 5.5 334b7847bd fix(hooks): keep ~/.claude eligible as project sharing root with CLAUDE_CONFIG_DIR
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 12:43:02 +00:00
Jeffrey Montoya b15c0538f6 refactor(gateguard): split change profile and search filters into focused modules 2026-09-30 00:23:08 -04:00
drakeo338 01c9a670de fix(hooks): honor CLAUDE_CONFIG_DIR for the default agent data home
getDefaultClaudeAgentDataHome ignored CLAUDE_CONFIG_DIR and always returned ~/.claude, so sessions with a relocated Claude config dir wrote ECC data to the wrong place when ECC_AGENT_DATA_HOME was unset. Fixes #3266.
2026-09-30 03:06:16 +00:00
Jeffrey Montoya 8a1f763184 test(gateguard): create file symlinks for the hard-link case on Windows 2026-09-29 21:50:27 -04:00
Jeffrey Montoya 10639a0c9e fix(gateguard): gate NotebookEdit and hard-linked targets
NotebookEdit is gated as a first-touch edit of notebook_path.
A file with more than one hard link gets no credit, trivial, sibling or cap allowance.
2026-09-29 21:50:26 -04:00
Jeffrey Montoya 4e33e29005 test(gateguard): use descriptive helper and fixture names 2026-09-29 21:50:26 -04:00
Jeffrey Montoya 20eb2395e9 fix(gateguard): gate MultiEdit by its file_path and widen surface checks
Also refuses rg -z as read-only and never writes metrics through a symlink.
2026-09-29 21:50:26 -04:00
Jeffrey Montoya 6e677b008c fix(gateguard): judge comment-only edits against the file they change 2026-09-29 21:50:25 -04:00
Jeffrey Montoya 82420f061a fix(gateguard): treat directive comments and continuations as code 2026-09-29 21:50:24 -04:00
Jeffrey Montoya 42e9072136 feat(gateguard): credit test files by their module stem
Drop the hardcoded baseline alias from the evaluation script and refresh the results.
2026-09-29 21:50:23 -04:00
Jeffrey Montoya 21ea5f96a8 feat(gateguard): profile shell scripts and Python module constants 2026-09-29 21:50:22 -04:00
Jeffrey Montoya 0301055327 feat(gateguard): build condensed code hints from the question ids 2026-09-29 21:50:21 -04:00
Jeffrey Montoya d591999ec0 feat(gateguard): add metrics event schema and report script 2026-09-29 21:50:19 -04:00
Jeffrey Montoya 77ddf9a792 feat(gateguard): pass read-only shell commands before the routine gate
The first command that can change something is still gated.
2026-09-29 21:50:17 -04:00
Jeffrey Montoya c3b2a7e627 feat(gateguard): name the closest search that did not count
One sanitized line in the denial with a reason code, from the cached turn scan.
2026-09-29 21:50:15 -04:00
Jeffrey Montoya ad0d9183ff feat(gateguard): pass comment and whitespace-only edits
The file stays unchecked, so the next code change is still gated; counted in trivial_allows.
2026-09-29 21:50:14 -04:00
Jeffrey Montoya 10f67715b1 feat(gateguard): ask code questions that fit the change
Stable question ids; local call sites instead of importers when no public
declaration is touched; data question only when the change handles data.
2026-09-29 21:50:13 -04:00
Jeffrey Montoya a7fd960b20 feat(gateguard): add change profile for first-touch edits
Pure, bounded analysis of Edit/Write text: public surface, data handling, and comment/whitespace-only edits.
2026-09-29 21:50:12 -04:00
Jeffrey Montoya ea86d156fe refactor(gateguard): move search evidence and state helpers to lib 2026-09-29 21:50:12 -04:00
Jeffrey Montoya 442a6da150 test(gateguard): cover added sensitive key and credential names
List id_ecdsa, id_dsa, .netrc and .pgpass as sensitive in the skill docs.
2026-09-29 21:50:12 -04:00
Jeffrey MontoyaandSulimanAbdulrazzaq e98a9da288 feat(gateguard): improve first-touch signal quality and session efficiency
- Ask class-specific first-touch questions (instruction, test, prose,
  config, code); code questions are unchanged.
- Credit a completed Glob/Grep/LS or shell search from the current human
  turn that covered the target; Read and exclusion globs never count.
- Collapse same-class new-file creations in one directory within a turn.
- Add opt-in GATEGUARD_FACT_FORCE_MAX_DENIALS session cap (from #2755).
- Always gate sensitive targets, judged on lexical and real paths.
- Canonicalize checked-path keys.

Closes #2608

Co-authored-by: SulimanAbdulrazzaq <suliman9000a@gmail.com>
2026-09-29 21:49:46 -04:00
haelyra 759d841b24 merge: preserve PR #3243 rollback redraw regression 2026-09-29 18:25:59 -04:00
haelyra 97d3c73257 Merge branch 'main' into feat/bengali-language-support 2026-09-29 14:58:53 -04:00
pasmud a85f43b1fa test(control-pane): assert the rollback redraws without waiting for a resize
The malformed-drawing rollback test took its marker baseline before the
malformed poll but only checked it after resizeAgain(). Resize redraws
the accepted view on its own, so the test still passed with the
immediate rollback redraw removed and the canvas left blank until the
operator resized.

Record the log position alongside the baseline and assert the retained
markers are on the canvas immediately after the malformed poll, before
any resize. Scoped to the drawing case, since the events and lanes
cases fail before draw() starts and correctly do not redraw.

Mutating the implementation confirms the assertion bites: disabling the
rollback draw and removing it entirely both fail it with the message
"the rollback must redraw the retained markers immediately".

Test-only change. control-plane-view-ui 27/27, control-plane-view
13/13, control-plane-view-ui-a11y 18/18, ESLint clean on the test file.
2026-09-29 14:02:41 +00:00
Patrick Obrtal 285f1a789e fix: reconcile stale managed install operations 2026-09-28 22:07:05 +02:00
affaan-m ed4b856bfe fix(state-store): preserve ownership and errors through cleanup
Preserve the original contributor histories and apply the exact independently reviewed repair.

Source-Parent: 5785183108
Review-Manifest-SHA256: e223d98c24e357715527b786257901d2ef0bebadb75ac61e5c000fe60da10f9a
2026-09-28 07:29:56 -04:00
affaan-m c5bb5579fe fix(codex): separate project guidance from user install defaults
Preserve the original contributor histories and apply the exact independently reviewed repair.

Source-Parent: 81df6475b2
Review-Manifest-SHA256: 272ae1970f0b94fe40dbb974b509b7333682176259f5a1493bbae12d9a7e70cb
2026-09-28 06:42:33 -04:00
Yann Roberto 5785183108 fix(control-pane): bound concurrent mutation workers 2026-09-28 17:26:53 +08:00
Yann Roberto 688e939b29 fix(state-store): address contention and pragma review findings 2026-09-28 16:54:24 +08:00
Yann Roberto 521de010bc fix(state-store): preserve concurrent writes across processes 2026-09-28 16:31:09 +08:00