* fix: use ${CLAUDE_PLUGIN_ROOT} brace form in hook commands
Hook commands referenced $CLAUDE_PLUGIN_ROOT (bare form), which Claude
Code does not substitute on Windows — the variable is left for the shell
to expand and comes back empty, so node tried to load C:\scripts\run.cjs
and SessionStart hooks failed with a cjs/loader:1424 MODULE_NOT_FOUND
error. The braced ${CLAUDE_PLUGIN_ROOT} form is substituted by Claude Code
before the command reaches the shell, matching the pattern used by other
plugins (agentmemory, superpowers). Applies to all 25 hook command lines.
* fix(hooks): complete the braced placeholder migration across the normalizer
The manifest change alone did not hold. scripts/lib/hook-command-normalizer.mjs
emitted the bare $CLAUDE_PLUGIN_ROOT form and treated the braced spelling as
legacy to rewrite away, and both scripts/plugin-setup.mjs and
scripts/repair-plugin-cache.mjs run that normalizer and write hooks.json back to
disk. Any install that ran plugin setup converted the corrected manifest
straight back to the bare form, so the Windows startup failure returned.
plugin-shipping-surface.mjs accepts either spelling, so no drift check caught it.
Why braced is correct rather than merely different: the bare form relies on a
POSIX shell expanding an environment variable. The Windows prefix invokes node
directly with no sh in front of it, so the plugin root never expands there and
node fails loading <drive>:\scripts\run.cjs. Under sh both spellings expand
identically, which makes the braced form a no-op on Unix/macOS and the only
spelling that can work on native Windows.
- normalizer: both prefixes emit braced; input patterns accept bare or braced so
existing caches are repaired rather than skipped; all branches emit braced
- hooks.json: convert the remaining dev-only PostToolUse hook the original
change predated (52 occurrences total, previously 50)
- plugin-setup-deps test: exercise the real normalizer instead of a private copy
of its rules, since that duplicate is what let manifest and patcher drift
- repair-plugin-cache test: expect braced output while keeping bare fixtures as
input, proving legacy installs are upgraded
Refs #4042
* chore(inventory): regenerate inventory graph for #4042
* fix(hooks): migrate the TypeScript Windows patcher to the braced placeholder
src/hooks/setup/index.ts carries a third copy of the hook-command rewriting
rules, independent of scripts/lib/hook-command-normalizer.mjs, and it also
emitted the bare form. Left alone it would rewrite hooks.json back to
$CLAUDE_PLUGIN_ROOT on Windows init and reintroduce the failure.
Its input patterns now accept either spelling so existing caches are repaired,
and output is always braced. Contract tests that asserted the bare spelling are
updated: windows-patch, hooks-command-escaping, preemptive-compaction-hook and
setup-contracts-regression.
Full local suite: the CLAUDE_PLUGIN_ROOT-related failures are gone and the
remaining failures match the dev baseline exactly (10 pre-existing files,
unrelated to this change).
Refs #4042
* chore(inventory): regenerate inventory graph for #4042 windows patcher
* fix(hooks): update workflow-drift-guard Stop registration to the braced placeholder
The Stop-hook drift guard pins the exact hooks.json registration, so it still
asserted the bare spelling and failed on CI after the migration.
Refs #4042
* chore(inventory): regenerate inventory graph for #4042 drift-guard fix
---------
Co-authored-by: gaebal-gajae <clawdbot@users.noreply.github.com>
* fix(state): survive a missing better-sqlite3 native binding with an actionable diagnostic (#4016)
* chore(inventory): regenerate inventory-graph baseline for state lock fallback
* fix(state): give the shipped hook lock the same fallback and make stale owner reclamation identity-verified
* fix(state): keep the lock diagnostic out of turn control flow and preserve the pre-SQLite fallback contract
CI Test was red on two integration suites. Three regressions, all from making
lock shortfalls authoritative rather than diagnostic:
1. isStateFileLockingSupported() hardcoded true, dropping the NODE_ENV=test
override. The owner-file fallback is a real backend, so the production
answer is right, but the override simulates a host with no exclusive
backend at all — which is exactly the state the fallback contract is
written against. Honor the override, default to true.
2. The test-override branch of acquireStateFileLockSync lost
'if (requireExclusive) return null'. The cancel-signal validation lock is
exclusive-required, so without it an exact legacy signal was honored
without exclusive locking.
3. commitWorkflowAdvance / refreshWorkflowBoundary lock failures were emitted
as block reasons. A contended lock left the transition uncommitted before
this change too, but the stage prompt still reached the agent and the
transition landed on the next turn. Report the shortfall on stderr and keep
that control flow; #4016's actionable binding message is unchanged.
workflow-profile-stop-transition 184/184 and workflow-profile-lock-recovery
18/18 pass locally at this head.
* chore(inventory): repoint baseline after the lock contract fix
* fix(state): separate 'any locking backend' from 'exclusive acquisition available'
The previous round made isStateFileLockingSupported() honor the flock test
override, which restored the cancel-signal contract but broke the new
'reclaims a proven stale recovery claim using SQLite without flock' case:
emergency recovery legitimately has SQLite even when flock is simulated absent.
These are two different questions. isStateFileLockingSupported() goes back to
true — the owner-file fallback is a real backend, and recovery must not
downgrade. New isExclusiveStateLockingAvailable() honors the override and is
what the cancel-signal authentication path asks, because that path decides
whether a failed exclusive acquisition means 'a real contender holds it'
(do not honor the signal) or 'there is no exclusive backend here' (fall
through to the enforceability check).
Threaded through both bridge re-export lists and the installer bridge so the
plugin and installed-template hook copies see the same API.
Local: workflow-profile-stop-transition + workflow-profile-lock-recovery
202/202, installer and plugin-setup suites 336/336, tsc clean.
* chore(inventory): repoint baseline after the exclusive-locking probe split
* fix(state): move the flock-absent contract into the cancel-signal caller
CI showed the previous round still red on 'reclaims a proven stale recovery
claim using SQLite without flock': failing exclusive acquisition closed inside
the lock primitive also closed it for the recovery path, which legitimately
has SQLite when only flock is simulated absent.
The primitive goes back to the author's behavior. The contract now lives where
it is actually needed: cancel-signal authentication skips acquisition entirely
when isExclusiveStateLockingAvailable() is false, so it never authenticates
state through the best-effort fallback lock, and falls through to the
enforceability check exactly as it did before this PR.
Local: workflow-profile-stop-transition + workflow-profile-lock-recovery
202/202, tsc clean.
* chore(inventory): repoint baseline after moving the flock contract to the caller
* fix(state): let the recovery claim bypass the flock simulation into SQLite
Root cause of the remaining red test, which was already failing at the
original head: openMutationDb() refused the SQLite backend whenever
stateFileLockingTestOverride() was false, ignoring bypassTestOverride. So the
emergency recovery claim — the one caller that explicitly opts out of the
simulation — retried 50 times and returned an 'unverifiable' failure with a
perfectly healthy binding, and recoverEmergencyStateFile() reported false.
The flock simulation describes a host without the external flock binary, not a
host without SQLite. openMutationDb now takes bypassTestOverride and the
acquire path forwards it, which is exactly what 'reclaims a proven stale
recovery claim using SQLite without flock' asserts.
Local: workflow-profile-lock-recovery + workflow-profile-stop-transition
202/202.
* chore(inventory): repoint baseline after the recovery-claim SQLite bypass
---------
Co-authored-by: clawdbot <clawdbot@users.noreply.github.com>
* Fix Windows plugin hook manifest commands
The plugin loader reads hooks/hooks.json directly, so settings-time rewrites cannot save fresh Windows users from sh/find-node command hooks. Ship direct node run.cjs commands and keep setup self-healing stale cached manifests to that same shape.
Constraint: Native Windows PostToolUse:Bash cannot execute plugin manifest hooks routed through sh/find-node before settings hooks exist.
Rejected: Settings-only rewrite | fresh plugin users hit the source manifest before setup overrides can apply.
Confidence: high
Scope-risk: narrow
Directive: Keep hooks/hooks.json command hooks direct node run.cjs unless Claude plugin loader gains a cross-platform bootstrap contract.
Tested: npm test -- --run src/__tests__/hooks-command-escaping.test.ts src/__tests__/setup-contracts-regression.test.ts src/__tests__/doctor-conflicts.test.ts; npm run build
* Preserve Unix hook bootstrap while keeping Windows manifests native
Keep the shipped manifest Windows-spawnable, but make plugin cache repair platform-aware so non-Windows installs restore the find-node bootstrap required for nvm/fnm hook PATH safety. Tighten stale cache parsing and add regression coverage for both directions.
Constraint: PR #3124 must preserve the #3121 native Windows direct-node manifest fix while unblocking Unix/macOS non-interactive PATH safety.
Rejected: Reverting hooks/hooks.json to sh/find-node universally | would reintroduce the native Windows #3121 blocker.
Confidence: high
Scope-risk: narrow
Directive: Keep shipped hooks/hooks.json Windows-native; use platform-aware setup repair for Unix/macOS bootstrap requirements.
Tested: npm test -- --run src/__tests__/plugin-setup-deps.test.ts src/hooks/setup/__tests__/windows-patch.test.ts src/__tests__/hooks-command-escaping.test.ts src/__tests__/doctor-conflicts.test.ts src/__tests__/setup-contracts-regression.test.ts
Tested: npm run build
Tested: manifest/platform audit over hooks/hooks.json confirmed 24 shipped commands direct-node, Unix repair maps to find-node run.cjs, Windows repair stays direct-node.
Not-tested: Native Windows runtime execution; covered by manifest repair tests and direct-node audit.
---------
Co-authored-by: Codex Review <codex-review@example.com>
SessionEnd now treats empty shutdown stdin as an expected no-op, and published hook commands use portable sh while retaining find-node bootstrap support for Unix node managers.\n\nConstraint: Hotfix scope limited to OMC hook regressions #3104, #3105, and #3106.\nRejected: Direct node-only hook commands | would drop Unix nvm/fnm PATH recovery through find-node.sh.\nConfidence: high\nScope-risk: narrow\nDirective: Keep hook command source free of absolute shell paths; installer normalization may still heal legacy /bin/sh payloads.\nTested: npm ci; npm test -- --run src/__tests__/session-end-empty-stdin.test.ts src/__tests__/hooks-command-escaping.test.ts src/__tests__/plugin-setup-deps.test.ts src/__tests__/setup-contracts-regression.test.ts src/__tests__/npm-package-hook-surface.test.ts; npm run build\nNot-tested: Native Windows Claude Code hook spawn outside this Linux CI-like worktree
Co-authored-by: Codex Review <codex-review@example.com>
Follow-up to PR #3068 anti-slop sweep. Seven findings addressed:
- Delete duplicate cleanup-readiness scaffolding under
.omx/plans/source-overall-cleanup/ (4 prefixed drafts superseded by
un-prefixed canonical siblings).
- find-node.sh: capture the absolute node path from `command -v` instead
of storing the bare string "node", so step 2 honors the script's
promise to bypass PATH at exec time.
- Consolidate the deprecated-MCP-provider predicate: export
isDeprecatedMcpProvider and DEPRECATED_MCP_PROVIDER_WARNING from the
delegation-routing barrel and consume from src/config/loader.ts, so
the codex/gemini compatibility rule has one source of truth.
- Replace the regex-literal-reparse hook-portability test in
plugin-setup-deps with four behavior tests that exercise the actual
patching rules against in-memory inputs.
- Remove the stray empty .tmp-post-tool-use-failure-tests/ directory and
add .tmp-*/ to .gitignore so prefix-variant temp dirs are ignored.
- Reconcile competing pattern-numbering comments in plugin-setup.mjs.
- Note in src/config/loader.ts that TEAM_ROLE_PROVIDERS contains /team
CLI worker providers, not the deprecated MCP delegationRouting.
Constraint: preserve all PR #3068 behavior; this pass is consolidation
and hygiene only.
Constraint: loader.ts deprecation log text must stay verbatim (two
config tests pin the substring).
Rejected: subprocess-based plugin-setup test | hooksJsonPath is hard
coded relative to the script and would mutate the real repo file.
Rejected: importing the patcher into the test | plugin-setup.mjs has no
patcher export; refactoring it was out of scope for an anti-slop pass.
Confidence: high
Scope-risk: narrow
Directive: F5's behavior test mirrors plugin-setup.mjs patching logic
inline. If you change the patching rules in plugin-setup.mjs, update
the inline patchCommand helper in plugin-setup-deps.test.ts to match —
the test will not auto-detect drift.
Not-tested: full-suite vitest had one unrelated flake in
src/team/__tests__/rebase-smoke.test.ts (waitForEventInLog timeout
under load); passes 6/6 in isolation, no slop-cleanup change touches
src/team/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Resolve the post-cleanup security gate by accepting npm audit's lockfile-only dependency updates and restoring plugin hook portability so setup contracts cannot bake a local Node binary into shipped hooks. Rebuilt bridge artifacts so generated outputs match the updated dependency graph.
Constraint: G003 required build, lint, targeted/full tests, audit, and generated artifact inspection before ultragoal checkpointing.
Rejected: leaving hooks/hooks.json with a machine-local node_modules/node/bin/node path | violates setup portability contracts and reproduces issue #2348.
Rejected: manually editing generated bridge outputs | build scripts are the artifact source of truth.
Confidence: high
Scope-risk: moderate
Directive: Keep hooks/hooks.json source-like and portable; persist absolute Node paths only in user config/runtime helpers, never in shipped hook metadata.
Tested: npm test -- --run src/__tests__/setup-contracts-regression.test.ts src/installer/__tests__/hook-command-portability.test.ts; npm test -- --run src/team/__tests__/rebase-smoke.test.ts; npm run build; npm run lint; npm audit --omit=dev; node bridge/cli.cjs --help; node bridge/cli.cjs --version
Not-tested: full npm test -- --run had one transient rebase-smoke timeout, rerun of that file passed.
Install a POSIX cached HUD statusLine launcher to return the last session-scoped HUD line immediately while refreshing the canonical HUD renderer in the background. Preserve Windows direct Node execution and harden cache keys with session/env/transcript fallbacks, including legacy CLAUDECODE_SESSION_ID support.\n\nCloses #2843
The HUD statusline wrapper previously guessed the active plugin
location via a hardcoded OMC_DEV=1 fallback that matched only
~/Workspace, ~/workspace, and ~/projects. Any other checkout (e.g.
~/_Git, ~/code, ~/src) landed in the stale marketplace clone.
The fix is two-sided:
1. The omc CLI launcher captures --plugin-dir from argv and exports
OMC_PLUGIN_ROOT into the spawned Claude Code process. Claude Code
propagates env to the statusline subprocess; the wrapper reads
OMC_PLUGIN_ROOT as its highest-priority resolution step.
2. A new --plugin-dir-mode flag (auto-enabled when OMC_PLUGIN_ROOT
is set) makes omc setup skip agent/skill sync, since the plugin
provides them at runtime.
The HUD wrapper body was extracted to scripts/lib/hud-wrapper-template.txt
as a single source of truth consumed by both install paths
(src/installer/index.ts and scripts/plugin-setup.mjs via the new
src/lib/hud-wrapper-template.ts). Env var and path literals were
centralised in src/lib/env-vars.ts and src/lib/paths.ts. A
consistency test asserts the template file stays in sync with the
TS constants.
Test coverage:
- CLI env propagation via module-level execFileSync mock (6 cases)
- Commander pipeline tests for setup precedence using the real
buildProgram() export (6 cases)
- Installer filesystem e2e for --plugin-dir-mode (4 cases)
- HUD wrapper fall-through assertions pinned via cache-stub marker
and scrubbed PATH/NODE_PATH env
- Template drift guardrails (hud-wrapper-template-sync,
paths-consistency)
Net: +14 tests (7709 → 7723), full suite green.
Constraint: Claude Code does not propagate --plugin-dir to statusline subprocesses (no env var, no stdin field)
Constraint: Must work with multiple CLAUDE_CONFIG_DIR profiles sharing the same plugin checkout via different aliases
Rejected: Persisting pluginRoot to .omc-config.json | stale across alias re-points and clashes across parallel configs
Rejected: Extending the OMC_DEV hardcoded path list | arbitrary; next checkout location hits the same wall
Confidence: high
Scope-risk: narrow
Directive: The HUD wrapper at scripts/lib/hud-wrapper-template.txt must stay a dumb loader — version-specific logic belongs in dist/hud/index.js so parallel --plugin-dir installs can coexist with one shared wrapper file on disk
Not-tested: Mixed-mode install where OMC is enabled as a marketplace plugin AND launched via --plugin-dir pointing at a different repo version
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two related fixes for the issue where v4.11.1 ships
hooks/hooks.json with the GitHub Actions runner's node path
hardcoded into every command:
"/opt/hostedtoolcache/node/20.20.2/x64/bin/node" \"\$CLAUDE_PLUGIN_ROOT\"/scripts/run.cjs ...
That path does not exist on user machines, so every hook fails
with "No such file or directory".
Root cause: src/__tests__/hud-marketplace-resolution.test.ts
executes scripts/plugin-setup.mjs against the real repo
hooks/hooks.json during \`npm test\`. plugin-setup rewrites bare
\`node\` to \`process.execPath\` (the CI runner's node path) and
the mutated file gets packed by the subsequent \`npm publish\`.
Once that broken tarball is published, the existing patch logic
in plugin-setup.mjs cannot recover: its regex only matches bare
\`node ...\`, not absolute-path commands, so on the user's
machine the patch is a no-op and the stale CI path stays.
Fixes:
1. scripts/plugin-setup.mjs — make the patch self-healing.
In addition to the bare-\`node\` branch, also match commands
that already use an absolute node path. If the path differs
from the current process.execPath AND either does not exist
on disk or contains \`/hostedtoolcache/\`, rewrite it to the
current nodeBin. This lets every existing v4.11.1 install
recover on its next setup run without any user action.
2. .github/workflows/release.yml — restore hooks/hooks.json
from git after \`npm test\` and before \`npm publish\`, so a
test-mutated hooks.json can never ship again.
Refs #2348
Several code paths hardcoded ~/.claude instead of resolving the active config directory. Introduce
getClaudeConfigDir() as a shared helper (with ESM/CJS/shell mirrors in scripts/lib/) and update
all call sites:
- transcript validation: allow paths under the active config directory
- transcript fallback resolution: build projects/ lookups from the active config directory instead
of inline env-var fallback
- rules discovery: use getClaudeConfigDir() instead of hardcoded path
- rules injector: remove dead homeDir parameter from findRuleFiles and USER_RULE_DIR export;
breaking change to the public surface (no npm dependents)
- uninstall: preserve existing CLAUDE_CONFIG_DIR env var
- CLI: use getClaudeConfigDir() for runtime paths and config directory descriptions
(default: ~/.claude/)
- orchestrator: allow absolute paths under the active config directory while preserving
project-root and relative-path checks
- skills tools: reference the active config directory in runtime output and help text
- shared memory: read .omc-config.json from the active config directory
- session history search: resolve transcript roots from the active config directory
- auto-slash-command executor: replace hardcoded ~/.claude in error message output
- factcheck guard: add ${CLAUDE_CONFIG_DIR} token to forbidden_path_prefixes defaults and token
expander, replacing the hardcoded ${HOME}/.claude prefix
- config-dir helper: implement full getClaudeConfigDir() in config-dir.ts with tilde expansion
and trailing-slash normalization, replacing the trivial getConfigDir() wrapper and the re-export
from paths.ts
- runtime Node scripts: use shared config-dir helpers (ESM and CJS) instead of repeating
~/.claude fallbacks
- standalone hook templates: add templates/hooks/lib/config-dir.mjs shared helper (mirrors
scripts/lib/config-dir.mjs) so template scripts resolve the config directory consistently
- HUD wrapper: import the shared lib/config-dir helper instead of embedding duplicate
config-directory resolution logic
- persistent-mode scripts: resolve native tasks/todos from [$CLAUDE_CONFIG_DIR|~/.claude]
- shell scripts: use a shared config-dir.sh helper with ~ expansion and trailing-slash
normalization
- installer: copy config-dir helpers alongside standalone hooks and the HUD find-node.sh helper
- plugin setup: move nodeBin to module scope so both settings.json and hooks.json patching blocks
can access it (pre-existing const scoping bug where hooks.json patch always failed silently)
- skill snippets: replace $HOME/.claude with ${CLAUDE_CONFIG_DIR:-$HOME/.claude} in executable
shell snippets across 8 skill files
- skill prose instructions: replace hardcoded ~/.claude in LLM-actionable directives (Read/Write
tool targets, bash code blocks, path references in step instructions) across 9 skill files so
an LLM executing the skill resolves the active config directory
- HUD usage API: document and test that Keychain service names hash the exact CLAUDE_CONFIG_DIR
string, preserving distinct service-name mapping for ~-prefixed vs expanded inputs
- test files: align mock paths from paths.js to config-dir.js; fix vi.mock hoisting in
doctor-conflicts.test.ts; resolve macOS /var symlink mismatch in bridge-integration,
team-status, and edge-cases tests; update string-pattern assertions in hud-windows.test.ts
and mingw-escape.test.ts
- test script: source lib/config-dir.sh in scripts/test-pr25.sh for post-install path
verification
Adds focused regression coverage in:
- src/__tests__/auto-update.test.ts
- src/__tests__/cli-config-stop-callback.test.ts
- src/__tests__/config-dir.test.ts
- src/__tests__/delegation-enforcement-levels.test.ts
- src/__tests__/doctor-conflicts.test.ts
- src/__tests__/hud-api-key-source.test.ts
- src/__tests__/hud-marketplace-resolution.test.ts
- src/__tests__/hud-windows.test.ts
- src/__tests__/hud/cli-diagnostic.test.ts
- src/__tests__/hud/usage-api-lock.test.ts
- src/__tests__/hud/usage-api-stale.test.ts
- src/__tests__/hud/usage-api.test.ts
- src/__tests__/installer.test.ts
- src/__tests__/purge-stale-cache.test.ts
- src/__tests__/session-history-search.test.ts
- src/__tests__/setup-claude-md-script.test.ts
- src/__tests__/shared-memory.test.ts
- src/hooks/factcheck/__tests__/factcheck.test.ts
- src/installer/__tests__/standalone-hook-reconcile.test.ts
- src/notifications/__tests__/config-merge.test.ts
- src/notifications/__tests__/profiles.test.ts
- src/openclaw/__tests__/config.test.ts
- src/skills/__tests__/mingw-escape.test.ts
- src/team/__tests__/bridge-integration.test.ts
- src/team/__tests__/edge-cases.test.ts
- src/team/__tests__/inbox-outbox.test.ts
- src/team/__tests__/message-router.test.ts
- src/team/__tests__/outbox-reader.test.ts
- src/team/__tests__/team-registration.test.ts
- src/team/__tests__/team-status.test.ts
* Preserve HUD loading for npm installs
The HUD wrapper now tries the published npm package name before the
branded compatibility path so npm-installed users no longer hit the
misleading "Plugin not installed" fallback. The plugin post-install
script and installer-generated wrapper now share the same compatibility
order, and regression tests cover the npm fallback explicitly.
I also tightened two existing tests that were flaky or stale relative
to current behavior so the full verification lane can pass reliably.
Constraint: npm package is published as oh-my-claude-sisyphus while plugin/cache branding remains oh-my-claudecode
Constraint: must preserve existing plugin cache, marketplace, and branded compatibility paths
Rejected: Rename all branded runtime paths to npm package name | would break plugin/cache conventions and widen scope beyond the bug
Rejected: Only swap the import string without fallback | loses compatibility for branded/local installs
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep npm package fallback order aligned between installer-generated HUD wrappers and scripts/plugin-setup.mjs
Tested: npm test -- --run src/hooks/__tests__/bridge-openclaw.test.ts src/team/__tests__/api-interop.dispatch.test.ts src/__tests__/hud-marketplace-resolution.test.ts src/__tests__/hud-build-guidance.test.ts src/__tests__/plugin-setup-devpaths.test.ts
Tested: npx tsc --noEmit
Tested: npm run lint
Tested: npm run build
Tested: npm test -- --run
Not-tested: live manual npm-global HUD install in a real Claude environment
* fix: revert unintended test change in api-interop.dispatch
The devPaths array in the generated HUD wrapper script had 4 entries
where entries 3-4 were exact duplicates of entries 1-2 (Workspace and
workspace variants). Removed the 2 duplicate lines.
Confidence: high
Scope-risk: narrow
The npm-published tarball does not include node_modules, so when Claude
Code extracts the plugin into its cache the runtime dependencies are
missing, causing ERR_MODULE_NOT_FOUND.
Fix 1: Add a post-install step in plugin-setup.mjs that detects missing
node_modules/commander and runs `npm install --omit=dev --ignore-scripts`
to restore production dependencies without re-triggering the setup script.
Fix 2: Remove the `prepare` script from package.json so that `npm install`
in the plugin cache directory no longer triggers `tsc` (which requires
devDependencies that are absent). The build step already exists in
`prepublishOnly` and runs before `npm publish`.
Fixes#1113
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Wrap executable and script paths in quotes to prevent breakage on
installations where paths contain spaces.
Closes#931
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Root fix for recurring Windows hook failures (#909, #899, #892, #869).
On Windows, `sh` resolves to a PE32+ binary (MSYS2/Git Bash) that the OS
refuses to execute in Claude Code's hook subprocess, producing
"cannot execute binary file: Exec format error".
**Changes:**
- `scripts/run.cjs`: new cross-platform CJS wrapper that re-invokes the
target .mjs using `process.execPath`, eliminating the shell entirely.
- `hooks/hooks.json`: replace every `sh "…/find-node.sh" "…/X.mjs"` entry
with `node "…/run.cjs" "…/X.mjs"` (plain `node` as portable template).
- `scripts/plugin-setup.mjs`: universal post-install patch (all platforms)
replaces the leading `node` token with the absolute `process.execPath` so
nvm/fnm users and Windows users both get the right binary without PATH
discovery. Backward-compat Windows patch migrates old `sh find-node.sh`
installs to the new `run.cjs` chain.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
On Windows with MSYS2/Git Bash the sh->find-node.sh->node chain introduced
in v4.3.4 (#892) triggers Claude Code UI bug anthropics/claude-code#17088,
which mislabels every successful hook as an error. find-node.sh exists solely
to locate node for nvm/fnm users on Unix, where node is not on PATH in
non-interactive shells. On Windows, node.exe is always on PATH so the sh
wrapper is unnecessary and harmful.
Fix: at setup time, patch hooks.json inside the plugin directory to rewrite
every sh+find-node.sh command to a direct `node` invocation. The patch is
applied in two places so it fires as early as possible:
1. scripts/plugin-setup.mjs — runs when the plugin is first installed.
2. src/hooks/setup/index.ts processSetupInit — runs on the first SessionStart
after the plugin is loaded, covering any update that overwrites hooks.json.
The patch is idempotent: already-direct commands are left untouched, and the
file is only written when at least one command is actually changed.
Also exports patchHooksJsonForWindows for direct unit testing, and adds
6 tests in src/hooks/setup/__tests__/windows-patch.test.ts covering the
simple case, trailing args preservation, idempotency, multi-event patching,
and missing-file no-ops.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
The omc-hud.mjs wrapper scripts in plugin-setup.mjs and
src/installer/index.ts hardcoded ~/.claude as the plugin cache base,
ignoring the CLAUDE_CONFIG_DIR environment variable. This caused a
mismatch where omc-doctor (which uses getClaudeConfigDir() respecting
CLAUDE_CONFIG_DIR) reported the plugin as installed while the HUD
wrapper looked in the wrong directory and showed 'HUD not built'.
Fixes:
- plugin-setup.mjs: use CLAUDE_CONFIG_DIR env var for pluginCacheBase
- plugin-setup.mjs: fix devPath dynamic import to use pathToFileURL
- src/installer/index.ts: use CLAUDE_CONFIG_DIR env var for pluginCacheBase
- skills/hud/SKILL.md: sync omc-hud.mjs template with installer version
(adds builtVersions filter, OMC_DEV guard, npm fallback, CLAUDE_CONFIG_DIR,
and updated error messages replacing old '[OMC] HUD not built' message)
- src/__tests__/hud-windows.test.ts: update assertion for CLAUDE_CONFIG_DIR fix
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Node.js hooks fail silently for nvm/fnm users because claude Code invokes
hook commands in a non-interactive shell that does not source ~/.bashrc or
~/.zshrc, so bare `node` is not on PATH.
Changes:
- Add src/utils/resolve-node.ts with resolveNodeBinary() that probes
process.execPath → which node → nvm paths → fnm paths → system paths
and returns an absolute path (never bare 'node' when avoidable).
- Add scripts/find-node.sh, a POSIX shell wrapper that reads the stored
nodeBinary from ~/.claude/.omc-config.json then falls back through the
same priority chain; exits 0 on failure so hooks never block Claude Code.
- Update hooks/hooks.json to invoke all hook scripts via find-node.sh
instead of bare `node`, using sh "${CLAUDE_PLUGIN_ROOT}/scripts/find-node.sh".
- Update installer/index.ts to use resolveNodeBinary() for the HUD
statusLine command and to persist the detected path as nodeBinary in
~/.claude/.omc-config.json for use by find-node.sh at runtime.
- Update scripts/plugin-setup.mjs to use process.execPath for the HUD
statusLine and to persist nodeBinary to .omc-config.json.
- Add nodeBinary?: string field to OMCConfig interface in auto-update.ts.
- Add src/__tests__/resolve-node.test.ts with 10 tests covering
pickLatestVersion() and resolveNodeBinary() (all passing).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
path.join() produces backslash paths on Windows, which breaks the
statusLine command in ~/.claude/settings.json since Claude Code 2.1.47.
Normalize to forward slashes with .replace(/\\/g, '/') in both the
installer and plugin-setup script.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Windows plugin cache uses backslash separators and the `cache/omc`
intermediate directory, but skill scripts used Unix-only `~` expansion,
`ls`/`sort -V`, and plugin-setup.mjs was missing `pathToFileURL` for
dynamic imports.
- Add `getPluginCacheBase()` utility in `src/utils/paths.ts`
- Fix `plugin-setup.mjs`: add `pathToFileURL` for Windows dynamic import
- Fix `usage-api.ts`: use `path.join` with separate segments
- Replace Unix-only bash in omc-doctor, hud, omc-setup skills with
cross-platform Node.js one-liners
- Add Windows path resolution tests to hud-windows.test.ts
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
All hardcoded ~/.claude paths now respect the CLAUDE_CONFIG_DIR
environment variable when set, enabling custom config directory
locations. Added src/utils/config-dir.ts as the canonical source
and updated getClaudeConfigDir() in paths.ts to delegate to it.
Closes#559
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Detect version drift between plugin root, npm package, and CLAUDE.md
- Notify user to run 'omc update' when components are out of sync
- Add npm registry update check with 24h cache and 2s timeout
- Clean up old plugin cache versions on session start (keep latest 2)
- Fix HUD wrapper to filter for built versions before selecting latest
- Add <!-- OMC:VERSION:X.Y.Z --> marker to CLAUDE.md for version tracking
- Update mergeClaudeMd() to inject version marker dynamically
- Fix update notification to recommend 'omc update' instead of '/plugin install'
Fixes from code review:
- Return 'unknown' when CLAUDE.md exists but lacks version marker
- Report legacy users as "needs migration" instead of silently skipping
- Use string equality for drift detection (more reliable than semverCompare)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Plugin cache structure is:
~/.claude/plugins/cache/omc/oh-my-claudecode/<version>/
NOT oh-my-claude-sisyphus/oh-my-claude-sisyphus/
Bump to v3.0.4
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use correct npm package path: oh-my-claude-sisyphus/oh-my-claude-sisyphus
- Update HUD wrapper to omc-hud.mjs with [OMC] branding
- Always update settings.json statusLine on setup
- Bump to v3.0.3
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- plugin-setup.mjs: [Sisyphus] → [OMC], sisyphus-hud.mjs → omc-hud.mjs
- Auto-migrate settings.json from old HUD path
- Add both dev path variants for compatibility
- Bump to v3.0.2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add Sisyphus HUD statusline for multi-agent visualization
Implement a standalone HUD that displays orchestration state in Claude Code's
statusline:
- Ralph loop iteration tracking (ralph:3/10)
- Ultrawork mode badge (ultrawork, ultrawork-ralph)
- PRD story progress (US-002)
- Context window usage with threshold colors (ctx:67%)
- Active subagent count (agents:2)
- Background task tracking (bg:3/5)
- Todo completion progress (todos:2/5)
Key features:
- Parses Claude Code stdin JSON for context_window data
- Parses transcript JSONL for agents and todos
- Reads existing .sisyphus/*.json state files
- Color-coded thresholds (green->yellow->red)
- Three presets: minimal, focused, full
- Auto-installs during npm install
- /hud command for configuration
Files added: 14 new files in src/hud/
Files modified: bridge.ts (background task hooks), installer/index.ts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add Claudeception learned skills system
Implement a system for Claude to extract, store, and reuse learned skills
from conversation sessions. Skills are stored in YAML frontmatter format
and automatically injected into context when triggers match.
Features:
- Hybrid skill storage (user ~/.claude/skills/ + project .sisyphus/skills/)
- YAML frontmatter parsing for skill metadata
- Trigger-based skill matching and injection
- Quality gate validation for skill extraction
- Pattern detection for extractable moments (problem-solution, technique, etc.)
- Promotion from ralph-progress learnings to skills
- Configuration system with persistence
- /claudeception command for managing skills
New files:
- src/hooks/learned-skills/ (12 modules)
- scripts/skill-injector.mjs (UserPromptSubmit hook)
- src/__tests__/learned-skills/ (6 test files, 41 tests)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(hud): Add type-coded agent visualization with model tier colors
Enhanced HUD agent display with multiple visualization formats for better parallel agent visibility.
- Single-character type codes (O=oracle, E=explore, S=sisyphus-junior, etc.)
- Model tier via case (Uppercase=Opus, lowercase=Sonnet/Haiku)
- Color-coded by tier (Magenta=Opus, Yellow=Sonnet, Green=Haiku)
- Duration indicators (<10s: none, 10-59s: (Xs), 1-9m: (Xm), ≥10m: !)
- Configurable formats: count, codes, codes-duration, detailed
- 44 new tests
* refactor: Rename claudeception to mnemosyne (goddess of memory)
Rename the learned skills module to use Greek mythology naming:
- Module: learned-skills -> mnemosyne
- Command: /claudeception -> /mnemosyne
- Exports: Claudeception* -> Mnemosyne*
Mnemosyne was the Titan goddess of memory in Greek mythology,
which fits perfectly for a system that remembers knowledge
from past sessions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: Bump version to 3.0.0-beta and update CHANGELOG
- Update package.json version to 3.0.0-beta
- Add comprehensive CHANGELOG entry for v3.0.0-beta:
- Mnemosyne learned skills system
- Sisyphus HUD statusline
- 443 total tests
- Breaking changes documented
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Prevent duplicate skills/plugins and add cancel commands
- Add isRunningAsPlugin() to detect Claude Code plugin context
- Skip file installation when CLAUDE_PLUGIN_ROOT is set (plugin mode)
- Update cancel-ralph to clear both local AND global state files
- Add cancel-ultrawork command for standalone ultrawork cancellation
- Add HUD agent type-coded visualization with model tier colors
Fixes duplicate agents/skills appearing when installed via both
npm global and Claude Code plugin marketplace.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(hud): Make wrapper script check development paths first
The HUD wrapper script now checks common development locations
before falling back to npm package import. This allows the HUD
to work during development when the package isn't published.
Development paths checked:
- ~/Workspace/oh-my-claude-sisyphus/dist/hud/index.js
- ~/workspace/oh-my-claude-sisyphus/dist/hud/index.js
- ~/projects/oh-my-claude-sisyphus/dist/hud/index.js
- ~/dev/oh-my-claude-sisyphus/dist/hud/index.js
- ~/code/oh-my-claude-sisyphus/dist/hud/index.js
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: Add plugin.json manifest for Claude Code plugin system
Enables installation as a Claude Code plugin instead of npm postinstall.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: Add local plugin installation guide
Documents how to install oh-my-claude-sisyphus as a Claude Code plugin
from a local development directory using the marketplace system.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(installer): Always install HUD even in plugin mode
- Skip agent/command/hook file copying when running as plugin
- Still install HUD wrapper script and settings.json config
- Updated HUD wrapper to check plugin cache first
- Plugin mode is now the preferred installation method for 3.0.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add mnemosyne.md command file for plugin mode
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor!: Plugin-only installation for 3.0.0
BREAKING CHANGE: Removed npm postinstall. Install via plugin only:
claude plugin marketplace add /path/to/oh-my-claude-sisyphus
claude plugin install oh-my-claude-sisyphus@oh-my-claude-sisyphus
- Removed postinstall script from package.json
- Added plugin postInstall hook for HUD setup
- Added all plugin assets to npm package files
- Created plugin-setup.mjs for automatic HUD configuration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(hud): Add multi-line agent visualization
Add new 'multiline' format for agent display that renders each running
agent on its own line with tree characters for visual hierarchy.
- Add renderAgentsMultiLine() function with tree char output (├─, └─)
- Add agentsMaxLines config option to control max detail lines
- Update render.ts to compose header + detail lines
- Set multiline as default for focused/full presets
- Add 9 new tests for multiline format (110 HUD tests pass)
Example output:
[SISYPHUS] ralph:3/10 | ultrawork | agents:3 | todos:2/5
├─ O oracle 2m analyzing architecture patterns...
├─ e explore 45s searching for test files
└─ s sj-junior 1m implementing validation logic
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add ralph-plan mode for iterative consensus planning
Adds new command that orchestrates Prometheus, Oracle, and Momus in an
iterative loop until all agents are satisfied with the plan quality.
Workflow: Prometheus plans → Oracle advises → Momus reviews → iterate
until Momus approves (OKAY verdict).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(hud): Keep background agents as running in transcript parser
Background agents return a tool_result immediately with "Async agent
launched" text, but this doesn't mean they're completed. The transcript
parser was incorrectly marking them as completed.
Now checks if tool_result content contains "Async agent launched" and
keeps those agents in 'running' status until actual completion.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Address Oracle verification feedback for ralph-plan
- Add state tracking mechanism (.sisyphus/ralph-plan-state.json)
- Fix step numbering (merged Steps 5 and 6 into unified Step 5)
- Clarify Oracle invocation timing (conditional, with two scenarios)
- Add iteration observability output ([RALPH-PLAN Iteration N/5] logs)
- Document "direct planning mode" for Prometheus (bypasses interview)
- Add cancellation documentation
- Clarify quality gates are orchestrator-verified
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Final Oracle verification fixes for ralph-plan
- Update cancel-ralph to handle ralph-plan-state.json
- Add quality gate enforcement details (orchestrator responsibility)
- Document PLAN_READY signal convention for Prometheus integration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(hud): Prefer dev paths over plugin cache in HUD wrapper
Dev paths now take priority so local development changes are picked up
immediately without being shadowed by old plugin cache versions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(hud): Add /hud setup command for auto-installation
- Add `/hud setup` command to install/repair HUD statusline
- `/hud` now auto-detects missing HUD and guides setup
- Include bash script to find plugin-setup.mjs from cache or dev paths
- Update troubleshooting to reference /hud setup
Fixes issue where /plugin add doesn't run postInstall hook
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: HUD setup guidance and learned skills path
Session Start Hook:
- Add HUD installation check on session start
- Show guidance to run /hud setup if HUD not configured
Mnemosyne Learned Skills:
- Change user-level skills path from ~/.claude/skills/sisyphus-learned/
to ~/.claude/commands/sisyphus-learned/
- Claude Code loads commands from ~/.claude/commands/, not skills/
- Update documentation in mnemosyne.md and installer
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: Mnemosyne skill matching and test isolation
Scoring Fix:
- Quality/usage scores now only apply when trigger/tag matches
- Prevents skills from matching purely on quality score
Test Isolation:
- finder.test.ts: Filter for project-scope candidates
- loader.test.ts: Filter for project-scope skills
- Tests now pass regardless of user-level skills present
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(hud): show last activated skill in statusline
Enhances HUD visibility by tracking and displaying the last activated skill:
- types.ts: Add SkillInvocation interface, lastActivatedSkill to TranscriptData,
lastSkill to HudRenderContext and HudElementConfig, enable in all presets
- transcript.ts: Parse Skill/proxy_Skill tool_use blocks from transcript
- skills.ts: Add renderLastSkill(), update renderSkills() with optional lastSkill,
add duplicate detection (don't show skill:ultrawork when ultrawork is active)
- render.ts: Pass lastSkill to renderSkills(), handle standalone lastSkill mode
- index.ts: Pass transcriptData.lastActivatedSkill to render context
- hud.md: Update documentation with new skill:name element
HUD now shows: [SISYPHUS] ultrawork skill:prometheus | ctx:67% | ...
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(hud): detect background agent completion and sort freshest first
- Add background agent completion detection via TaskOutput results
- Extract agentId from "Async agent launched" messages
- Parse TaskOutput <status>completed</status> to mark agents done
- Map background agent IDs to original tool_use_ids
- Sort agents by start time (freshest first, oldest last)
- Add sortByFreshest() helper function
- Apply to all agent render functions
Fixes issue where background agents accumulated time indefinitely.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(hud): add rate limit display (5h and weekly usage)
Fetch rate limits from Anthropic OAuth API and display in statusline.
Based on jarrodwatts/claude-hud implementation.
- Add usage-api.ts: OAuth credential reading and API fetching
- Add limits.ts: Rate limit rendering with color thresholds
- Display format: 5h:X% wk:Y% with green/yellow/red colors
- 60s cache TTL to avoid API hammering
- Works with Pro/Max/Team subscriptions (not API users)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(skills): consolidate to single source of truth with SKILL.md files
- Migrate 7 builtin skills to bundled SKILL.md files (sisyphus, ralph-loop,
ralph-init, analyze, deepsearch, prometheus, review)
- Rewrite skills.ts from 1158 lines of hardcoded content to 156 lines of
dynamic loader that reads from skills/*/SKILL.md at runtime
- Add YAML frontmatter parsing for skill metadata (name, description, model,
agent, argument-hint)
- Add skill caching with clearSkillsCache() for testing
- Update tests to expect 12 skills (was 10)
- Remove ~1000 lines of duplicate skill definitions
Skills are now maintained in one place (skills/*/SKILL.md) instead of being
duplicated between TypeScript and markdown files.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: reduce large TypeScript files by 78% with dynamic loading
Replace inline string constants with dynamic file loading at runtime:
- installer/index.ts: 3324 → 525 lines (84% reduction)
- Load agent definitions from /agents/*.md
- Load command definitions from /commands/*.md
- Load CLAUDE.md content from /docs/CLAUDE.md
- agents/definitions.ts: 1594 → 462 lines (71% reduction)
- Import base agents from individual .ts files
- Load tiered variant prompts from /agents/*.md at runtime
- installer/hooks.ts: 1679 → 478 lines (72% reduction)
- Extract 10 hook scripts to /templates/hooks/
- Load via loadTemplate() function at runtime
Additional changes:
- Add tools: field to all 11 base agent .md files
- Update tests for new file structure
- Add "types": ["node"] to tsconfig.json
Total: 6597 → 1465 lines (78% reduction, ~5100 lines removed)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(agents): add explicit model routing for sub-agents
Claude Code doesn't auto-apply model field from agent frontmatter.
This hybrid fix ensures correct model routing:
- Add model hints to all agent descriptions (Haiku/Sonnet/Opus)
- Add explicit model= parameter to all Task calls in skills/commands
- Update TypeScript definitions with model hints
Agents updated: 11 base agents + 8 tiered variants
Files updated: 22 (agents, commands, skills, definitions.ts)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(hud): add OpenCode-inspired UX elements and fix state bugs
New features:
- Context pressure warnings: "COMPRESS?" at 80%, "CRITICAL" at 85%
- Extended thinking indicator (cyan "thinking" when reasoning active)
- Session health indicator with duration and color-coded status
- New presets: 'opencode' and 'dense' configurations
Bug fixes:
- Clear pendingPermissionMap on each parse to prevent stale APPROVE?
- Add staleness detection for state files (ignore >2 hours old)
- Disable permissionStatus by default (heuristic unreliable)
New files:
- src/hud/elements/permission.ts
- src/hud/elements/thinking.ts
- src/hud/elements/session.ts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(mnemosyne): update skills directory path and enhance extraction docs
- Change USER_SKILLS_DIR from commands/sisyphus-learned to skills/sisyphus-learned
- Skills are now read by skill-injector.mjs hook instead of Claude Code commands
- Enhanced mnemosyne.md with quality gates, anti-patterns, and evaluation criteria
- Added detailed guidance on what makes a useful vs. generic skill
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(plugin): remove invalid skills array from marketplace schema
The skills field was causing "Invalid schema: plugins.0.skills: Invalid input"
validation error. Skills are auto-discovered via plugin.json glob pattern.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: rebrand to oh-my-claudecode with skills-first architecture
- Rename plugin from oh-my-claude-sisyphus to oh-my-claudecode
- Migrate commands to skills/*/SKILL.md structure (auto-discovered)
- Update plugin.json to minimal schema (name, version, description, skills)
- Remove explicit hooks/agents declarations (auto-discovered)
- Update all agent references and documentation
- Fix plugin validation errors
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: update GitHub URLs to v3.0.0-beta branch temporarily
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: prepare v3.0.0 release with zero-learning-curve UX
BREAKING CHANGES:
- Package renamed from oh-my-claude-sisyphus to oh-my-claudecode
- All SISYPHUS_* env vars renamed to OMC_*
- Directory ~/.sisyphus → ~/.omc, .sisyphus → .omc
- Skills dir ~/.claude/skills/sisyphus-learned → omc-learned
Major changes:
- Rewrite README to < 130 lines (zero-learning-curve focus)
- Add magic keywords (ralph, ralplan, ulw, plan) for power users
- Deprecate install.sh in favor of plugin-only installation
- Add "Delegate Always" and "Learner Agent" guidance to docs
- Update all agent codes in HUD (O→A, s→x, sj→exec)
- Bump version to 3.0.0 stable
- Create comprehensive MIGRATION.md for 2.x users
- Archive old README to docs/FULL-README.md
- Add /omc-setup skill for first-time configuration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(readme): add oh-my-zsh philosophy tagline
"Some advanced users customize zsh for years - most of us just use oh-my-zsh.
Don't learn Claude Code. Just use OMC."
Also adds updated website assets with matching philosophy.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: fix remaining version references to 3.0.0
- AGENTS.md: 3.0.0-beta → 3.0.0
- docs/LOCAL_PLUGIN_INSTALL.md: 3.0.0-beta → 3.0.0
- Regenerate package-lock.json
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>