Release includes:
- feat(team): cursor-agent as 4th tmux worker type (#2736)
- fix(keyword-detector): stop false-positive autopilot on "autonomous" (#2739)
- fix(self-improve): scope artifacts by topic for safer resumes (#2732)
Constraint: 4 version files must remain in sync (package.json, plugin.json, marketplace.json, package-lock.json)
Constraint: dist/ is gitignored but tracked; force-add required for new files
Confidence: high
Scope-risk: narrow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Includes the autoresearch-as-a-skill migration (#2727) and the
company-context MCP contract scaffolding. Both ship as opt-in
experimental surfaces; minor bump reflects the new functionality
even though the features are not yet GA.
Constraint: autoresearch migration touches shared skill-state and persistent-mode plumbing — minor bump signals upgrade caution despite the experimental label
Confidence: high
Scope-risk: moderate
Bumps all version files to 4.12.0. Includes 6 new features, 67 bug
fixes, and 3 other changes across 121 merged PRs since v4.11.3.
Highlights:
- feat(team): per-role provider and model routing (#2614)
- feat(hud): narrow elementOrder config for main-line layout (#2655)
- feat(ci): upgrade test to catch install/update regressions (#2635)
- fix: align stop hook to persistent-mode.mjs + output contracts (#2653)
- fix(session-start): stale CLAUDE_PLUGIN_ROOT symlink resolution (#2630)
- fix(pre-tool-enforcer): OMC_STATE_DIR centralized resolver (#2621)
- fix(keyword-detector): ignore pasted transcript blocks (#2631)
- test(skills): isolate bridge-rewrite test from Claude runner env leakage
Scope-risk: broad
Confidence: high
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rebuild dist/ and force-add 244 previously untracked dist files
(including dist/hud/elements/hostname.js) that were gitignored
but required for plugin-cache installs to work correctly.
Fixes#2417, #2404, #2365, #2366
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds the missing developer/contributor documentation for running OMC from a
local checkout, and teaches `omc doctor` to accept `--plugin-dir` in parity
with `omc` and `omc setup`.
Docs
- New CONTRIBUTING.md at repo root covering fork & upstream setup, three
linking flows (plugin-dir, marketplace, no-plugin) with a comparison
table, suggested shell aliases, rebuilding, tests/lint, and rebasing
onto upstream/dev or upstream/main.
- New docs/REFERENCE.md "Plugin directory flags" section documenting
omc --plugin-dir, claude --plugin-dir (direct), omc setup --plugin-dir-mode,
omc doctor --plugin-dir (NEW), OMC_PLUGIN_ROOT env var, and a decision
matrix. Also calls out --plugin-dir as the recommended local-dev flow
(no plugin cache = hot iteration).
- docs/LOCAL_PLUGIN_INSTALL.md: adds a hot-reload caveat for the marketplace
flow and a no-marketplace alternative subsection.
- docs/GETTING-STARTED.md: one-paragraph "running from a local checkout"
callout.
- docs/DEVELOPERS.md: 3-line pointer to CONTRIBUTING.md.
- README.md and 11 translated READMEs: cross-links to the new REFERENCE
section and a Contributing pointer. Translated files carry
<!-- TODO(i18n) --> markers for maintainer-driven translation sync.
Code
- New src/lib/plugin-dir.ts exposing resolvePluginDirArg(), reused by
src/cli/launch.ts (refactor, no behavior change) and src/cli/index.ts.
- omc doctor and omc doctor conflicts now accept --plugin-dir <path>.
A preAction hook on the parent doctor command resolves the path,
warns if it overrides a pre-existing OMC_PLUGIN_ROOT, and exits
with a red error on empty/whitespace input instead of a raw stack.
- New npm run dev:full script running tsc --watch plus all six esbuild
bundle steps in watch mode concurrently. scripts/build-*.mjs gained
a --watch flag via esbuild.context().watch(). concurrently added as
a devDependency.
Tests
- src/lib/__tests__/plugin-dir.test.ts: 6 unit tests covering absolute,
relative, empty, whitespace-only, and ~-non-expansion edge cases.
- src/cli/__tests__/doctor-plugin-dir.test.ts: 10 tests including a real
Commander parseAsync on `doctor conflicts --plugin-dir /tmp/foo` that
would catch silent unwiring of the flag.
Constraint: Existing --plugin-dir launcher semantics in launch.ts must
not change (plugin-dir-capture tests still pass).
Constraint: REFERENCE.md must only gain additions; no existing sections
touched.
Rejected: Expanding ~ in resolvePluginDirArg | path.resolve() does not
and the behavior is now pinned by test + documented instead.
Rejected: Translating the 11 localized READMEs in-place | maintainer
handles i18n sync post-merge per upstream convention.
Confidence: high
Scope-risk: moderate
Directive: Any new --plugin-dir consumer must import resolvePluginDirArg
from src/lib/plugin-dir.ts rather than re-implementing path resolution.
Not-tested: dev:full watcher behavior on Windows (concurrently SIGINT
forwarding).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The release branch still advertised 4.10.2 even after the release PR was opened. This updates the package version, lockfile, plugin metadata, and docs marker through the repo's version sync path so packaging and release automation target 4.11.0 consistently.
Constraint: Release automation reads package.json version for npm publish and notes generation
Constraint: Version sync must use the existing scripts/sync-version.sh path
Rejected: Leave version drift for a later commit | would keep the release PR internally inconsistent
Rejected: Hand-edit only package.json/package-lock.json | would skip synced plugin/docs metadata
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Use npm version --no-git-tag-version on release branches so satellite version files stay in sync
Tested: npm version 4.11.0 --no-git-tag-version
Not-tested: Full repository test suite
Not-tested: Fresh CI run after pushing this commit
The release branch still advertised 4.10.1/4.10.0 metadata, rejected
non-dev release PRs, and had emitted runtime artifacts that no longer
matched source changes. This change syncs release metadata to 4.10.2,
loosens the base-branch guard for release and hotfix targets, and
rebuilds shipped bridge/dist outputs so the published package matches the
reviewed source.
Constraint: Release automation and published artifacts must stay in sync for tag-driven npm/GitHub releases
Rejected: Ship with stale 4.10.1 metadata and patch later | would risk skipped npm publish and misleading release notes
Rejected: Keep dev-only PR gate | blocks valid release and hotfix PR flows
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: If source runtime files change before release, rerun the build so shipped bridge/dist artifacts stay aligned
Tested: npm run lint
Tested: npx tsc --noEmit
Tested: npm run build
Tested: npm run test:run -- --reporter=dot
Not-tested: GitHub Actions release workflow against a real v4.10.2 tag
- Add scripts/sync-version.sh to sync version across satellite files
(plugin.json, marketplace.json, docs/CLAUDE.md) on npm version
- Add 'version' lifecycle hook in package.json
- Fix release.yml to generate fresh release notes at tag time instead
of using stale .github/release-body.md
- Enable generate_release_notes for GitHub auto-generated changelog
as fallback
The package.json scripts section referenced ./scripts/ask-codex.sh and
./scripts/ask-gemini.sh, but these files do not exist in the repository.
Remove the two broken script entries.
Confidence: high
Scope-risk: narrow
Two outdated references remained after the first pass: dead deprecated
package build aliases that no longer participate in the runtime, and a
seminar demo model string still pointing at the old Sonnet 4.5 family.
This follow-up removes the orphaned aliases, updates the live-demo note to
Sonnet 4.6, and extends the narrow docs contract test so both regressions
fail fast next time.
Constraint: Keep the follow-up limited to the exact blockers found on PR #1800
Rejected: Narrow the PR scope instead of fixing the leftovers | user preferred completing the cleanup in the same PR
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: When removing deprecated scripts, also remove their last package.json aliases so green PRs do not keep shipping dead surfaces
Tested: npm ci && ./node_modules/.bin/vitest run src/__tests__/tier0-docs-consistency.test.ts
Tested: node -e "JSON.parse(require('fs').readFileSync('package.json','utf8')); console.log('package.json parse: OK')"
Not-tested: Seminar/demo flow execution in a live audience environment
Updated the 4.9.0 versioned release surfaces and drafted the
release notes/body without publishing, tagging, or pushing a
release. The prep was grounded by a targeted smoke pass over the
highest-risk recent changes: team shutdown cleanup, marketplace
reload sync safety, regex-sensitive live-data and keyword paths,
and lightweight autoresearch Claude setup flows.
Constraint: Do not perform the actual release in this prep pass
Constraint: Current worktree has a broken tracked node_modules symlink, so verification used a temporary local relink and restored it afterward
Rejected: Full release execution now | user explicitly requested prep only
Rejected: Full test suite qualification | slower than requested targeted smoke lane for this pass
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: Before publishing, give CHANGELOG.md and .github/release-body.md a final editorial review and optionally run npm run build for broader sanity
Tested: Targeted smoke suite (9 files / 385 tests): team+marketplace 74 passed; regex/live-data+keyword detector 270 passed; autoresearch 41 passed
Not-tested: Full build and broader regression suite outside the requested risk surfaces
Bump version across all version files (package.json, plugin.json,
marketplace.json, docs/CLAUDE.md) and update CHANGELOG.md with
major hotfixes since v4.8.1.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds scripts/release.ts that automates the entire pre-release workflow:
- Bumps version across all 5 files (package.json, plugin.json, marketplace.json, docs/CLAUDE.md, lockfile)
- Generates CHANGELOG.md from conventional commits
- Creates .github/release-body.md with contributor @mentions
- Runs sync-metadata for doc badge updates
- Supports --dry-run for previewing changes
Also updates release.yml to use generated release-body.md when present.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(setup): add rtk token optimization integration
* revert(setup): remove RTK integration from PR #1489
* fix(hooks): fail open on critical context exhaustion
* fix(skill): harden omc-teams tmux and agent validation
* Add Ralph critic selection for verification
* fix(doctor): accept supported omc config keys
* feat(openclaw): normalize native clawhip signals
* fix: skip legacy agent sync when plugin agents exist
* fix(hud): preserve stale usage limits on API failures
* Reduce startup OMC guidance context
* fix: clean up stale transient files on session end (#1510)
- session-end: cleanupTransientState now removes agent-replay-*.jsonl,
last-tool-error.json, hud-state.json, hud-stdin-cache.json,
idle-notif-cooldown.json, *-stop-breaker.json, cancel-signal files
inside session dirs, and empty session directories
- keyword-detector: activateState adds project_path field for parity
with TypeScript activateUltrawork in bridge.ts
- persistent-mode: readStateFileWithSession adds fallback scan of all
session directories when session-scoped path lookup fails
* fix(hud): reduce transient usage API retry hammering (#1513)
* fix(hooks): add missing continue: false to persistent-mode.cjs Stop hook
The .cjs Stop hook outputs `{ decision: "block" }` without
`continue: false` when blocking stops for active modes. The original
fix (#1216) added `continue: false` to the .mjs scripts but the .cjs
version was never updated, and subsequent commits (#1306, #1330, #1374,
#1480, #1482) did not carry over this fix.
Since hooks.json references the .cjs version, the plugin Stop hook has
been missing hard-block capability, allowing sessions to end mid-execution.
- Add `continue: false` to all 12 blocking outputs in persistent-mode.cjs
- Add `continue: false` to context-guard-stop.mjs (1 output)
- Add `continue: false` to code-simplifier.mjs and its template (1 each)
Closes#1516
* feat(doc-specialist): add first-pass context hub guidance (#1519)
* Add skill pipeline handoff metadata (#1520)
* chore: remove stale root development artifacts (#1526)
* docs(rebrand): update scoped guidance docs (#1527)
* docs: rebrand main README to oh-my-openagent (#1528)
* docs: rebrand localized readmes to oh-my-openagent (#1529)
* revert: undo unauthorized rebrand PRs 1527-1529
* docs: fix outdated install references in REFERENCE.md
- Update platform support table: "curl or npm" → "Claude Code Plugin"
for macOS/Linux, consistent with the deprecation notice at the top
of the Installation section
- Replace deprecated curl uninstall one-liner with the plugin uninstall
command (/plugin uninstall oh-my-claudecode@oh-my-claudecode)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: remove stale analytics references
* fix(team): port startup hardening from omx
* fix(team): finish runtime hardening port
* fix(team): resolve worktree mailbox trigger paths
* fix(hud): avoid repeated watch mode initialization
* feat: add session history search
* fix(team): require real startup evidence
* fix(routing): normalize explicit model IDs in all code paths (#1415)
The prior fix (PR #1464) only normalized auto-injected models but missed
two paths where full model IDs like 'claude-sonnet-4-6' leaked through:
1. enforceModel() passed explicitly-provided models as-is without
normalizing to CC aliases (sonnet/opus/haiku)
2. buildLaunchArgs() in model-contract.ts passed model directly to
--model flag for team worker launches
Extract normalizeToCcAlias() helper and apply it in both paths.
Add 5 tests covering explicit ID normalization and Bedrock ID handling.
Closes#1415
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore(release): bump version to v4.7.10
Version bumps:
- package.json: 4.7.9 → 4.7.10
- .claude-plugin/plugin.json: 4.7.9 → 4.7.10
- .claude-plugin/marketplace.json: 4.7.9 → 4.7.10
- CHANGELOG.md: Updated release header
Includes rebuilt dist artifacts for:
- Bedrock model routing fixes
- Team runtime hardening
- Session history search feature
- Lazy agent loading
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: ChoKhoOu <38033263+ChoKhoOu@users.noreply.github.com>
Co-authored-by: Yong <yong@levvels.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Carlos Cubas <carloscubas82@gmail.com>
Prepare the 4.7.8 release with updated version metadata, changelog, and rebuilt bridge/dist artifacts for distribution.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(ask): add ask-codex and ask-gemini skills with provider-specific CLI args
- Add codex as valid ask provider alongside claude and gemini
- Create ask-codex and ask-gemini skill surfaces (SKILL.md) for plugin discovery
- Add wrapper scripts (scripts/ask-codex.sh, scripts/ask-gemini.sh) with
PATH-independent repo-local CLI entrypoint execution
- Use provider-specific CLI args: codex exec --dangerously-bypass-approvals-and-sandbox,
gemini -p --yolo, claude -p
- Fix test env: strip CLAUDECODE env var from spawned test processes to prevent
nested session detection failures
- Update skill tests with alias-aware counts (38/37/38) and ask-codex expectations
- Add wrapper wiring tests: provider dispatch, prompt forwarding, env passthrough,
exit code propagation, PATH-shadow isolation
- Update docs (REFERENCE.md, CLAUDE.md, AGENTS.md) with ask-codex references
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: rebuild bridge/cli.cjs with codex provider support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: resolve pre-existing lint errors and team-help test failure
- Fix empty catch blocks in runtime-cli.ts, runtime-v2.ts, scaling.ts
- Replace empty interface with type alias in state/tasks.ts
- Update team-help test to check team.ts instead of index.ts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The legacy team command (runTeamCommand + TEAM_COMMAND_USAGE) was not
removed when the new commands/team.ts handler was integrated, causing
Commander to throw "cannot add command 'team' as already have command
'team'" on every CLI invocation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Problem
CI was failing because tests couldn't find agent prompt files. The
getPackageDir() function in prompt-helpers.ts and utils.ts had a bug
where it prioritized the CJS path over ESM.
In vitest, typeof __dirname returns "string" but the value is undefined,
so join(__dirname, "..") resolved to ".." (parent of cwd) instead of
the package root.
## Solution
- Prioritize ESM path (import.meta.url) over CJS path
- Add truthy check for __dirname: typeof __dirname !== 'undefined' && __dirname
## Version bump
- package.json: 4.6.5 -> 4.6.6
- plugin.json: 4.6.3 -> 4.6.6
- marketplace.json: 4.6.3 -> 4.6.6
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaced external jsonc-parser dependency with a lightweight internal
implementation to fix runtime-cli.cjs failing in plugin marketplace installs.
- Created src/utils/jsonc.ts with parseJsonc() and stripJsoncComments()
- Updated src/config/loader.ts to use internal parser
- Removed jsonc-parser from external deps in build-runtime-cli.mjs
Resolves#1316
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixed getPackageDir() functions to properly detect CJS bundle context:
- Reordered checks to prioritize __dirname (CJS) over import.meta.url (ESM)
- Fixed in: prompt-helpers.ts, utils.ts, installer/index.ts, installer/hooks.ts
- Fixed isMainModule() check in hooks/bridge.ts for CJS compatibility
The import.meta?.url check was being transformed by esbuild into
importMetaUrl?.url which always returned undefined, causing path
resolution failures in the bundled CLI.
Resolves#1314
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes runtime error when running `omc` CLI:
- TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string
- Caused by `import.meta.url` being undefined in CJS format
Changes:
- scripts/build-cli.mjs: Add banner injection for import.meta.url polyfill
- Inject: const importMetaUrl = require("url").pathToFileURL(__filename)
- Define: import.meta.url -> importMetaUrl
- Rebuild bridge/cli.cjs with fix
- Bump version to 4.6.3 across all files
- Update CHANGELOG
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add scripts/build-cli.mjs to bundle src/cli/index.ts into bridge/cli.cjs
- Update package.json bin entries to point at bridge/cli.cjs
- Add bridge/cli.cjs to files array for npm publish
- Add build:cli script and include in main build chain
Fixes#1290 - CLI now works after plugin marketplace install without
requiring node_modules at runtime.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Align release artifacts to 4.6.0 and add changenote coverage for dev→main shipping, while fixing runtime-cli bundling so codex workers no longer fail with missing jsonc-parser impl modules.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tmux new-session and split-window run commands via a non-login,
non-interactive shell, so tools installed via nvm, pyenv, conda,
etc. are invisible. Add wrapWithLoginShell() that starts a login
shell (-lc) and explicitly sources the user's RC file (.bashrc,
.zshrc) before running the wrapped command.
Applied to runClaudeOutsideTmux() and createHudWatchPane().
Bump version to 4.5.5.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>