Commit Graph

298 Commits

Author SHA1 Message Date
haelyra
bdbd90a47f test(install): scale uninstall CLI timeout for Windows CI
The uninstall cases run two full CLI passes (install, then uninstall)
over several hundred files under a flat 30s timeout, which is tight
enough on Windows CI to fail intermittently with spawnSync ETIMEDOUT.
install-apply.test.js already scales its timeout by platform for the
same reason; match that precedent rather than re-running past the flake.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 15:09:34 -04:00
haelyra
6aaa41e028 feat(install): require an explicit hook decision at the apply layer
The guided installer asks how ECC hooks should run, but that consent
lived only in the wizard path. Running install-apply directly with a
profile that includes hooks-runtime still materialized the hook runtime
with no disclosure and no decision.

Gate the apply layer instead, so every entry point is covered:

- disclose the six hook capability groups when a plan would materialize
  the hook runtime, and refuse to apply until the caller decides
- --enable-hooks confirms the hook runtime; --no-hooks installs the rest
  of the selection without it and records the reduced module closure in
  install-state
- surface the pending decision as a dry-run warning
- show the same capability disclosure in the guided installer's plan
  preview, so the wizard's hook question states what it is asking about

Plans that never materialize hooks (Kimi, --profile minimal,
--without baseline:hooks) are unaffected and need no flag. Repair and
uninstall operate on already-recorded state and stay unchanged.

The capability taxonomy and the held-materialization behavior come from
Samarjeet Singh Tomar's PR #2634, reworked to fit the single-decision
consent model that shipped with the guided installer in #2649.

Co-Authored-By: Samarjeet Singh Tomar <samar_tomar@hotmail.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 15:09:34 -04:00
haelyra
299544e680 fix: count observations for whitespace paths 2026-08-29 16:07:00 -04:00
haelyra
1bdda4bdac fix: close validator and path edge cases 2026-08-29 15:36:59 -04:00
haelyra
703163275d test: honor per-invocation Bash overrides 2026-08-29 15:11:38 -04:00
haelyra
30c41a9bde fix: close truth and portability review gaps 2026-08-29 14:55:14 -04:00
haelyra
9542c33454 test(skill-stocktake): cover canonical symlink discovery
Co-authored-by: LKL-ZREO <891878708@qq.com>
2026-08-29 14:55:13 -04:00
haelyra
e82e477034 test(pack): tolerate slow Windows extraction 2026-08-29 14:53:54 -04:00
haelyra
4c7e965209 fix(gan): distinguish scores from verdict thresholds 2026-08-29 14:24:16 -04:00
van3hardy
b2a8091440 test(opencode): guard plugin.tool existence before shape assertion 2026-08-29 13:40:57 -04:00
van3hardy
e72f1e6824 test(opencode): assert init does not call shell and root plugin tools 2026-08-29 13:40:56 -04:00
van3hardy
f932e63b0a test(opencode): assert built entry is a working plugin, not just an export shape 2026-08-29 13:40:56 -04:00
van3hardy
f0684fda32 test(opencode): assert built entry exports only the plugin function 2026-08-29 13:40:56 -04:00
benno0o
7c2bc54be2 test: verify Corepack uses the pinned pnpm version 2026-08-29 13:40:56 -04:00
benno0o
b48f22f08c fix: address pre-push pnpm review findings 2026-08-29 13:40:53 -04:00
benno0o
03b441792e fix: resolve pnpm in Git Bash pre-push hook 2026-08-29 13:40:53 -04:00
haelyra
656d4b5746 Merge pull request #2869 from actus7/consolidate/mcp-health-v3
fix(hooks): consolidate MCP health-check fixes (3 PRs)
2026-08-29 00:22:27 -04:00
haelyra
2aebdd3408 Merge pull request #2870 from actus7/consolidate/hooks-observer-v3
fix(hooks): consolidate hooks and observer fixes (5 PRs)
2026-08-28 18:29:03 -04:00
haelyra
70f42102fc test(evolve): support Windows line endings 2026-08-28 16:25:30 -04:00
haelyra
950caaaae1 fix(hooks): preserve short sessions and quote evolved metadata 2026-08-28 16:08:19 -04:00
haelyra
b7d6c61b1e Merge remote-tracking branch 'origin/main' into maint/pr-2870-current 2026-08-28 16:03:10 -04:00
haelyra
1953a749a2 Merge remote-tracking branch 'origin/main' into maint/pr-2873-current 2026-08-28 15:59:31 -04:00
haelyra
204cc2d2a3 fix(release): stage ECC 2.2 launch safely 2026-08-25 17:19:45 -04:00
haelyra
856733263c test(opencode): cover legacy upgrade edge cases 2026-08-25 12:28:23 -04:00
aoright
4d8893f607 fix(ci): add tool cache directories to check-unicode-safety ignore list
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
2026-08-24 22:27:39 -03:00
cadenli
c5ea82f6bf fix: accept standard tools list metadata 2026-08-24 22:27:31 -03:00
John Ellison
7aa071c5e9 fix(continuous-learning-v2): emit loadable frontmatter from evolve --generate
Artifacts written by `evolve --generate` are inert: Claude Code (and every
spec-compliant Agent Skills client) injects only `name` + `description` at
startup and will not load an artifact missing them.

Today the generator writes:
  - skills:   `# {name}` with no frontmatter block at all
  - commands: `# {cmd_name}` with no frontmatter block at all
  - agents:   `model`/`tools` only, no `name`, no `description`

So the whole evolve pipeline terminates in files that can never load. I hit
this on a real install: 12 generated artifacts across two projects, none of
which Claude Code had ever seen.

This adds a `_evolved_description()` helper and emits proper frontmatter for
all three artifact kinds. The description is sanitised for the two things that
break loaders: `: ` in an unquoted scalar (rejected by strict YAML parsers)
and `<`/`>` (system-prompt injection risk).

Adds two tests to tests/scripts/instinct-cli-evolve-generate.test.js. Both
fail against current main and pass with this change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 22:26:22 -03:00
haelyra
01779a4a2b test(release): cover final review blockers 2026-08-24 21:14:29 -04:00
haelyra
7d9f70c501 test(release): enforce release-note filename convention 2026-08-24 21:08:51 -04:00
haelyra
17ab179ecc test(release): enforce versioned notes contract 2026-08-24 20:40:35 -04:00
dajiaohuang
6d42f32ca8 fix(tests): support npm pack object output 2026-08-24 20:09:12 -04:00
Santhi Prakash
56dafcc5e3 fix(scripts): require legacy ownership manifest for auto fallback
Restrict the automatic `uninstall` legacy Codex sync fallback to homes
that have a legacy ownership manifest (`~/.codex/ecc/legacy-sync-state.json`).
Marker-only AGENTS.md files are no longer auto-detected as legacy installs,
so a normal `uninstall` will not silently modify user-owned instructions.
The explicit `--legacy-codex-sync` flag still handles marker-only and
manifest-backed cleanup.

Also:
- Track the AGENTS.md path in removedPaths when a marker block is removed.
- Refactor codex home resolution into a helper.
- Add regression tests for marker-only auto vs. explicit behavior.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-08-24 20:09:12 -04:00
Santhi Prakash
f4f5cf9027 fix(scripts): avoid false-positive legacy Codex sync detection
Tighten uninstall auto-detection so it only falls back to the legacy
sync-ecc-to-codex.sh path when there is an ownership manifest
(~/.codex/ecc/legacy-sync-state.json) or an ECC marker block in
~/.codex/AGENTS.md. Previously a clean Codex home with unrelated prompt
files could be misclassified as a legacy install, causing uninstall to
skip normal install-state reconciliation and exit with a partial warning.

Also make the no-state fallback return 'not-found' when there is no
marker to remove and no candidate files to clean, and make explicit
--legacy-codex-sync report the same on a clean home.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-08-24 20:09:12 -04:00
Santhi Prakash
09d6d22c09 fix(scripts): auto-detect legacy sync-ecc-to-codex.sh installs in uninstall
When no install-state is found for the current context, `ecc uninstall`
now checks for the legacy `sync-ecc-to-codex.sh` ownership manifest under
`~/.codex/ecc/legacy-sync-state.json` and, if present, rolls back the
managed Codex artifacts it recorded. It restores previous `config.toml`
and `AGENTS.md` content instead of deleting them, removes generated
prompts/docs/copies, and leaves unrelated Codex conversation history and
user config keys untouched. A fallback `--legacy-codex-sync` flag still
forces the legacy path explicitly, and `--dry-run` previews the cleanup.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-08-24 20:09:12 -04:00
haelyra
6e66dfbae8 test(release): add ECC 2.2 readiness regressions 2026-08-24 20:08:41 -04:00
Affaan Mustafa
d0366ea8e8 Merge pull request #2800 from affaan-m/affaan/nasiko-control-plane-integration
feat: add opt-in Nasiko control-plane bridge
2026-08-15 21:48:12 -04:00
haelyra
73e9a44c0b test(install): compare canonical PowerShell install roots 2026-08-15 14:20:01 -04:00
haelyra
ffe5edc47c test(install): normalize PowerShell project path assertion 2026-08-15 13:40:59 -04:00
haelyra
21accf1726 docs(antigravity): clarify project-root installation 2026-08-15 13:16:41 -04:00
Affaan Mustafa
9ba25b9360 fix: harden Nasiko artifact lifecycle 2026-08-15 02:22:29 -04:00
haelyra
0a7d2787c4 fix(install): arm rollback before legacy sync 2026-08-13 18:30:39 -04:00
haelyra
9bec31faf7 test(uninstall): record managed copy digest 2026-08-13 18:10:00 -04:00
haelyra
1db5c8ab4a fix(install): harden ECC installer lifecycle
Make Antigravity 2.0 installs native and safely migrate legacy state. Ensure doctor, repair, status projection, repeat installs, legacy Codex sync, and uninstall converge without losing user files. Exclude Python bytecode and harden repo-scan bootstrap guidance.

Gate publishing and pull-request merges on one exact packed artifact completing install, repeat, drift, repair, status, and uninstall across Linux, macOS, and Windows.

Co-authored-by: lorencifernando-coder <lorenci.fernando@gmail.com>

Co-authored-by: Suliman Abdulrazzaq <suliman9000a@gmail.com>

Co-authored-by: Wu Shuwen <mikewushuwen@outlook.com>
2026-08-13 16:42:51 -04:00
haelyra
569b1d5b32 fix: disable Claude co-author attribution by default (#2758)
* fix: disable Claude co-author attribution by default

* fix: harden default co-author opt-out and correct the docs

Follow-up on the co-author default in this PR.

- Remove the existsSync/writeFileSync race in the installer settings write
  (CodeQL js/file-system-race, high). A single guarded read now covers the
  fresh-install case, and unreadable or non-object settings are left untouched.
- Respect `attribution` as an explicit user choice. It supersedes
  `includeCoAuthoredBy` in Claude Code 2.1.x, so a user who configured it would
  otherwise have had a dead key written into their settings.
- Share one opt-out rule via scripts/lib/claude-commit-attribution.js instead of
  duplicating it across the installer and plugin setup.
- Update the git-workflow rule and its nine mirrors and translations, which
  still told users ECC does not ship this setting.

We keep writing the deprecated `includeCoAuthoredBy` key rather than
`attribution`: unknown keys fail Claude Code settings validation, so writing
`attribution` would break users on older versions.
2026-08-12 00:43:58 -04:00
Seekers2001
5a2453e167 feat: add council-multi-model skill (heterogeneous Codex review) (#2281)
* feat: add council-multi-model skill (heterogeneous Codex review)

Rebased onto latest main to resolve the merge conflict (the branch had gone
DIRTY as main advanced). Trimmed to just the skill files (no top-level
README/AGENTS edits), mirroring the merged #2381. Previously reviewed
favorably by greptile/coderabbit/daltino.

* feat: add Entry B (independent parallel propose + aggregate, MoA-style) alongside Entry A (review)

Splits the skill into two entries depending on what already exists:
Entry A (unchanged) reviews an existing draft. New Entry B has every
voice (Claude x3 + Codex if available) answer the same question fully
independently and in parallel, then aggregates without collapsing
disagreement or blending incompatible approaches into one hybrid.
For the heaviest decisions the two chain: B first, then A's review
step on the aggregation -- with an explicit honesty caveat when Codex
already proposed in B and so cannot independently judge the result.

* feat: prefer Codex MCP tool over the SDK script when available

mcp__codex__codex is now the primary path for both Entry A's
heterogeneous review and Entry B's independent proposal -- zero relay,
talks directly to OpenAI's backend, no temp file or shell escaping
needed. The openai-codex SDK script becomes the fallback for sessions
without that MCP tool configured; behavior and guardrails (read-only,
verbatim quoting, explicit 'absent' labeling) are unchanged.

* fix: register council-multi-model install path

* docs: sync skill catalog count

* fix: publish council-multi-model skill

* fix: harden council multi-model fallback

* docs: sync remaining skill count

* fix: narrow multi-model council to bounded review

* fix: address council adapter review feedback

* fix(council-multi-model): enforce tool-less Codex review

* fix(council-multi-model): close Codex tool boundary

---------

Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
2026-08-11 16:30:04 -04:00
haelyra
ae303fb6c1 fix(plan-canvas): deliver browser chat to the agent every time (#2739)
Feedback sent from the canvas only reached an agent through a live
/api/await long poll. When a turn ended with no await parked,
queueFeedback wrote the message to sessions.json and nothing ever
consumed it, so sending appeared to do nothing at all. The presence pill
made it worse: workingKeys had no expiry and the feedback handler never
broadcast presence, so it froze on "agent working" while nobody was
listening.

Delivery:
- Add the stop:plan-canvas-pending hook. It drains undelivered feedback
  and blocks the Stop, handing the messages to the agent, so a canvas
  message lands even when no await is running. Scoped to sessions under
  cwd so parallel agents cannot swallow each other's feedback; set
  ECC_PLAN_CANVAS_STOP_SCOPE=all to widen. Honors stop_hook_active and
  fails open on every error path.
- run-with-flags.js did not await a hook's run(), so any async hook
  silently degraded to pass-through. Fixed; plan-canvas-pending is the
  only async hook today.

Presence and indicators:
- Presence is now ended/typing/thinking/listening/queued/waiting.
  thinking and typing self-expire (90s/30s) and a 5s sweep pushes the
  decay to an idle browser, so the pill can no longer stick.
- Broadcast presence when feedback is queued, and clear the activity
  state when an agent reply lands.
- Add POST /api/session/:key/typing so agents can drive the indicator.
- Chat shows an animated dots bubble for thinking and typing, plus an
  explicit note when a message is queued with nobody listening.
  Respects prefers-reduced-motion.
- Send status reports what actually happened instead of always claiming
  the agent will pick it up.

CLI and skill:
- Add `ecc-plan-canvas pending` and `typing <file> --state ...`.
- SKILL.md documents background await as the primary pattern and makes
  replying in the canvas mandatory.

Tests: 6 new server cases covering queued presence, the typing endpoint,
state expiry and the sweep, plus a new hook suite covering delivery,
drain-once, stop_hook_active, cwd scoping and fail-open.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 18:15:25 -04:00
Affaan Mustafa
649def769b fix: complete Discord delivery receipts reliably (#2738)
* test: reproduce Actions receipt completion mismatch

* fix: complete Discord receipts with Actions identity
2026-08-09 16:44:18 -04:00
Affaan Mustafa
cdbb25bf9d fix: deliver announcements through a scoped Discord webhook (#2737)
* test: reproduce Discord webhook announcement gap

* fix: deliver ECC announcements through channel webhook

* test: cover webhook replay and least privilege

* fix: make webhook delivery durable and least privilege

* test: cover trusted receipts and cross-workflow races

* fix: serialize and authenticate announcement receipts
2026-08-09 16:41:27 -04:00
Affaan Mustafa
2d46e80e09 fix: deliver ECC announcements to Discord (#2732) 2026-08-09 06:37:04 -04:00
Affaan Mustafa
9de131420b fix(ito-compute): complete device auth lifecycle (#2706) 2026-08-07 14:53:13 -04:00