@agentikos/omega-os 0.19.19 → 0.19.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bootstrap/lib/steps.sh +162 -5
- package/install.sh +28 -1
- package/omega/Agentik_Engine/omega_engine/__init__.py +1 -1
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +5 -2
- package/omega/Agentik_Engine/omega_engine/tmux.py +63 -28
- package/omega/Agentik_Engine/pyproject.toml +1 -1
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +68 -35
- package/omega/Agentik_SSOT/clis/clis-catalog.yaml +151 -0
- package/package.json +1 -1
package/bootstrap/lib/steps.sh
CHANGED
|
@@ -463,6 +463,154 @@ PY
|
|
|
463
463
|
|
|
464
464
|
# --- 40 -----------------------------------------------------------------------
|
|
465
465
|
#
|
|
466
|
+
# step_clis — install system CLIs + Printing Press CLI library.
|
|
467
|
+
#
|
|
468
|
+
# Replaces step_mcp as the default integration story (v0.19.21+). The
|
|
469
|
+
# rationale per the operator: MCP servers are token-expensive (each
|
|
470
|
+
# call pays protocol round-trip + server system prompt overhead). System
|
|
471
|
+
# CLIs that Claude Code shells out to via `Bash` are predictable, cheap,
|
|
472
|
+
# and survive without a long-lived server process. Printing Press
|
|
473
|
+
# (https://printingpress.dev) extends that model with agent-native CLIs
|
|
474
|
+
# that ship local SQLite mirrors — even cheaper than remote API calls.
|
|
475
|
+
#
|
|
476
|
+
# Three phases:
|
|
477
|
+
# 1. AUDIT — detect what's already installed; render a status table.
|
|
478
|
+
# 2. NATIVE — install missing recommended native binaries via the
|
|
479
|
+
# OS package manager (or npm-global / curl fallback).
|
|
480
|
+
# 3. PRINTING PRESS — install the PP factory + the recommended CLIs
|
|
481
|
+
# from the library catalog.
|
|
482
|
+
#
|
|
483
|
+
# Idempotent — re-running only acts on what's still missing.
|
|
484
|
+
step_clis() {
|
|
485
|
+
local catalog="$OMEGA_HOME/Agentik_SSOT/clis/clis-catalog.yaml"
|
|
486
|
+
[ -f "$catalog" ] || { err "CLI catalog missing: $catalog"; return 1; }
|
|
487
|
+
PYTHONPATH="$OMEGA_HOME/Agentik_Engine" python3 - "$catalog" "$OMEGA_PKG" <<'PY' 2>>"$LOG_FILE"
|
|
488
|
+
import os
|
|
489
|
+
import shutil
|
|
490
|
+
import subprocess
|
|
491
|
+
import sys
|
|
492
|
+
import yaml
|
|
493
|
+
|
|
494
|
+
catalog_path = sys.argv[1]
|
|
495
|
+
pkg = sys.argv[2] # apt | dnf | brew | unknown
|
|
496
|
+
|
|
497
|
+
with open(catalog_path) as f:
|
|
498
|
+
catalog = yaml.safe_load(f) or {}
|
|
499
|
+
|
|
500
|
+
# ─── Phase 1: audit ───────────────────────────────────────────
|
|
501
|
+
print("\n ──── CLI audit ────")
|
|
502
|
+
ok_count = 0
|
|
503
|
+
missing = []
|
|
504
|
+
for entry in catalog.get("native", []):
|
|
505
|
+
cli_id = entry["id"]
|
|
506
|
+
binary = entry.get("binary", cli_id)
|
|
507
|
+
if shutil.which(binary):
|
|
508
|
+
print(f" ok {cli_id:<14} ({binary} present)")
|
|
509
|
+
ok_count += 1
|
|
510
|
+
else:
|
|
511
|
+
rec = entry.get("recommended", False)
|
|
512
|
+
tag = "MISSING (recommended)" if rec else "missing (optional)"
|
|
513
|
+
print(f" -- {cli_id:<14} {tag}")
|
|
514
|
+
missing.append(entry)
|
|
515
|
+
print(f" → {ok_count}/{len(catalog.get('native', []))} native CLIs present\n")
|
|
516
|
+
|
|
517
|
+
# ─── Phase 2: install missing recommended native CLIs ─────────
|
|
518
|
+
def _run(cmd, env=None, timeout=600):
|
|
519
|
+
try:
|
|
520
|
+
proc = subprocess.run(cmd, capture_output=True, text=True,
|
|
521
|
+
timeout=timeout, env=env)
|
|
522
|
+
return proc.returncode, proc.stdout + proc.stderr
|
|
523
|
+
except (subprocess.SubprocessError, FileNotFoundError) as e:
|
|
524
|
+
return 1, str(e)
|
|
525
|
+
|
|
526
|
+
installed_now = []
|
|
527
|
+
failed_now = []
|
|
528
|
+
for entry in missing:
|
|
529
|
+
if not entry.get("recommended", False):
|
|
530
|
+
continue
|
|
531
|
+
cli_id = entry["id"]
|
|
532
|
+
install = entry.get("install", {})
|
|
533
|
+
rc, out, attempt = 1, "", ""
|
|
534
|
+
|
|
535
|
+
if pkg in install: # platform-specific package name
|
|
536
|
+
if pkg == "brew":
|
|
537
|
+
rc, out = _run(["brew", "install", install[pkg]])
|
|
538
|
+
attempt = f"brew install {install[pkg]}"
|
|
539
|
+
elif pkg == "apt":
|
|
540
|
+
rc, out = _run(["sudo", "apt-get", "install", "-y", "-qq", install[pkg]])
|
|
541
|
+
attempt = f"apt-get install {install[pkg]}"
|
|
542
|
+
elif pkg == "dnf":
|
|
543
|
+
rc, out = _run(["sudo", "dnf", "install", "-y", "-q", install[pkg]])
|
|
544
|
+
attempt = f"dnf install {install[pkg]}"
|
|
545
|
+
elif "npm_global" in install and shutil.which("npm"):
|
|
546
|
+
rc, out = _run(["npm", "install", "-g", "--silent", install["npm_global"]])
|
|
547
|
+
attempt = f"npm install -g {install['npm_global']}"
|
|
548
|
+
elif "curl" in install:
|
|
549
|
+
# curl|bash installer — last resort
|
|
550
|
+
rc, out = _run(["bash", "-c", f"curl -fsSL {install['curl']} | bash"])
|
|
551
|
+
attempt = f"curl {install['curl']} | bash"
|
|
552
|
+
else:
|
|
553
|
+
print(f" skip {cli_id}: no install method for pkg={pkg}")
|
|
554
|
+
continue
|
|
555
|
+
|
|
556
|
+
binary = entry.get("binary", cli_id)
|
|
557
|
+
if shutil.which(binary):
|
|
558
|
+
print(f" ok {cli_id:<14} (installed via {attempt})")
|
|
559
|
+
installed_now.append(cli_id)
|
|
560
|
+
else:
|
|
561
|
+
print(f" fail {cli_id}: {attempt} returned rc={rc}")
|
|
562
|
+
failed_now.append(cli_id)
|
|
563
|
+
|
|
564
|
+
# ─── Phase 3: Printing Press ──────────────────────────────────
|
|
565
|
+
pp_core = catalog.get("printing_press_core", {})
|
|
566
|
+
pp_clis = catalog.get("printing_press_clis", [])
|
|
567
|
+
|
|
568
|
+
print(f"\n ──── Printing Press ({len(pp_clis)} library CLIs available) ────")
|
|
569
|
+
|
|
570
|
+
# Install PP core (printer + library client) if not present
|
|
571
|
+
if not shutil.which("ppi-update") and not shutil.which("npx"):
|
|
572
|
+
print(" skip: neither ppi-update nor npx on PATH — install Node first")
|
|
573
|
+
elif not shutil.which("ppi-update"):
|
|
574
|
+
install_cmd = pp_core.get("install_method", "")
|
|
575
|
+
if install_cmd:
|
|
576
|
+
print(f" installing Printing Press core: {install_cmd}")
|
|
577
|
+
rc, out = _run(["bash", "-c", install_cmd], timeout=300)
|
|
578
|
+
if rc == 0:
|
|
579
|
+
print(" ok Printing Press core installed")
|
|
580
|
+
else:
|
|
581
|
+
print(f" warn Printing Press core install rc={rc} — library CLIs may still work via npx")
|
|
582
|
+
else:
|
|
583
|
+
print(" ok Printing Press core already installed")
|
|
584
|
+
|
|
585
|
+
# Install recommended PP library CLIs (one npx call per recommended entry)
|
|
586
|
+
pp_lib_cmd = ["npx", "-y", "@mvanhorn/printing-press-library"]
|
|
587
|
+
pp_ok = 0
|
|
588
|
+
pp_failed = []
|
|
589
|
+
for entry in pp_clis:
|
|
590
|
+
if not entry.get("recommended", False):
|
|
591
|
+
continue
|
|
592
|
+
cli_id = entry["id"]
|
|
593
|
+
print(f" installing pp-cli: {cli_id}…")
|
|
594
|
+
rc, out = _run([*pp_lib_cmd, "install", cli_id], timeout=300)
|
|
595
|
+
if rc == 0:
|
|
596
|
+
print(f" ok {cli_id}")
|
|
597
|
+
pp_ok += 1
|
|
598
|
+
else:
|
|
599
|
+
print(f" fail {cli_id}: rc={rc}")
|
|
600
|
+
pp_failed.append(cli_id)
|
|
601
|
+
|
|
602
|
+
print(f"\n ──── Summary ────")
|
|
603
|
+
print(f" Native CLIs installed this run: {installed_now or '(none missing)'}")
|
|
604
|
+
print(f" Native CLIs that failed: {failed_now or '(none)'}")
|
|
605
|
+
print(f" Printing Press CLIs installed: {pp_ok} (of {sum(1 for e in pp_clis if e.get('recommended'))} recommended)")
|
|
606
|
+
print(f" Printing Press CLIs that failed: {pp_failed or '(none)'}")
|
|
607
|
+
print(f" Non-recommended CLIs available via: omega cli install <id>")
|
|
608
|
+
PY
|
|
609
|
+
return 0
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
# --- 40-legacy ----------------------------------------------------------------
|
|
613
|
+
#
|
|
466
614
|
# step_mcp — present the MCP/plugin catalog as a checklist (interactive) or
|
|
467
615
|
# apply the manifest's `mcp:` list (headless). For each selected entry:
|
|
468
616
|
# 1. install the server binary into Agentik_Tools/<id>/
|
|
@@ -734,27 +882,36 @@ step_claude_plugins() {
|
|
|
734
882
|
|
|
735
883
|
# Register every marketplace referenced by the selected plugins (excluding
|
|
736
884
|
# those marked `builtin: true`).
|
|
885
|
+
#
|
|
886
|
+
# Source format MUST be `<owner>/<repo>` for the Claude CLI. We strip
|
|
887
|
+
# any legacy `github:` prefix the catalog may still carry (pre-v0.19.20
|
|
888
|
+
# catalogs used `github:owner/repo` which fails with "Invalid
|
|
889
|
+
# marketplace source format").
|
|
737
890
|
while IFS= read -r src; do
|
|
738
891
|
[ -z "$src" ] && continue
|
|
892
|
+
src="${src#github:}"
|
|
739
893
|
info "registering marketplace: $src"
|
|
740
894
|
if claude plugin marketplace add "$src" >>"$LOG_FILE" 2>&1; then
|
|
741
895
|
ok "marketplace ok: $src"
|
|
742
896
|
else
|
|
743
|
-
#
|
|
897
|
+
# Likely already registered — non-fatal, log only.
|
|
744
898
|
info "marketplace add returned non-zero (may already be registered): $src"
|
|
745
899
|
fi
|
|
746
900
|
done < <(_claude_plugins_marketplaces_for "$catalog" "$selected")
|
|
747
901
|
|
|
902
|
+
# `claude plugin install` does NOT accept `-s <scope>` (verified against
|
|
903
|
+
# Claude Code 2.1.150 — the plugin help only documents --config). The
|
|
904
|
+
# scope is per-install determined by where the plugin manifest declares
|
|
905
|
+
# it; we keep `scope:` in the catalog only as documentation.
|
|
748
906
|
local failed=""
|
|
749
907
|
local id
|
|
750
908
|
while IFS= read -r id; do
|
|
751
909
|
[ -z "$id" ] && continue
|
|
752
|
-
local spec
|
|
910
|
+
local spec
|
|
753
911
|
spec="$(_claude_plugins_install_spec "$catalog" "$id")"
|
|
754
|
-
scope="$(_claude_plugins_scope_for "$catalog" "$id")"
|
|
755
912
|
[ -z "$spec" ] && { info "no install spec for $id — skipping"; continue; }
|
|
756
|
-
info "installing claude plugin: $spec
|
|
757
|
-
if claude plugin install "$spec"
|
|
913
|
+
info "installing claude plugin: $spec"
|
|
914
|
+
if claude plugin install "$spec" >>"$LOG_FILE" 2>&1; then
|
|
758
915
|
ok "claude plugin installed: $id"
|
|
759
916
|
else
|
|
760
917
|
err "claude plugin $id failed to install — see $LOG_FILE; continuing"
|
package/install.sh
CHANGED
|
@@ -147,7 +147,13 @@ STEPS=(
|
|
|
147
147
|
"35-providers:step_providers"
|
|
148
148
|
"36-tmux-config:step_tmux_config"
|
|
149
149
|
"37-hermes-brief:step_hermes_brief"
|
|
150
|
-
|
|
150
|
+
# v0.19.21 — MCP install dropped from the default sequence. MCPs are
|
|
151
|
+
# token-expensive (each call pays the protocol round-trip + the
|
|
152
|
+
# server's system prompt overhead). We replace with system CLIs +
|
|
153
|
+
# Printing Press (https://printingpress.dev) — agent-native CLIs
|
|
154
|
+
# with local SQLite mirrors. Re-enable opt-in via:
|
|
155
|
+
# omega tool install <id> (still wired for one-offs)
|
|
156
|
+
"40-clis:step_clis"
|
|
151
157
|
"45-claude-plugins:step_claude_plugins"
|
|
152
158
|
)
|
|
153
159
|
if [ "$PROFILE" != "minimal" ]; then
|
|
@@ -207,3 +213,24 @@ record_state_version
|
|
|
207
213
|
|
|
208
214
|
# Final boxed celebration + verdict from `omega doctor --json`.
|
|
209
215
|
post_install_card
|
|
216
|
+
|
|
217
|
+
# v0.19.20 — drop the user into a fresh login shell so $PATH (now
|
|
218
|
+
# containing $OMEGA_HOME/Agentik_Tools/bin) and OMEGA_HOME are loaded
|
|
219
|
+
# immediately. Without this, the user had to remember to
|
|
220
|
+
# `source ~/.zshrc` or open a new terminal — bad UX.
|
|
221
|
+
#
|
|
222
|
+
# Only re-exec when:
|
|
223
|
+
# * stdin is a tty (interactive install, not piped/CI)
|
|
224
|
+
# * we're not running under --non-interactive
|
|
225
|
+
# * the user isn't already in a non-default shell we don't understand
|
|
226
|
+
# * an `omega` binary exists at the canonical path
|
|
227
|
+
#
|
|
228
|
+
# Otherwise we just print the instruction so the user knows what to do.
|
|
229
|
+
if [ -t 0 ] && [ "${NONINTERACTIVE:-0}" != "1" ] \
|
|
230
|
+
&& [ -x "$OMEGA_HOME/Agentik_Tools/bin/omega" ]; then
|
|
231
|
+
log ""
|
|
232
|
+
log "${C_DIM}::${C_RST} reloading your shell so \`omega\` is on PATH…"
|
|
233
|
+
log "${C_DIM}::${C_RST} type ${C_BOLD}omega${C_RST} to open the session manager"
|
|
234
|
+
log ""
|
|
235
|
+
exec "${SHELL:-/bin/bash}" -l
|
|
236
|
+
fi
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -2908,15 +2908,18 @@ def cmd_menu(_args: argparse.Namespace) -> int:
|
|
|
2908
2908
|
if chosen_key is None:
|
|
2909
2909
|
return 0
|
|
2910
2910
|
if chosen_key == NEW_AISB:
|
|
2911
|
+
# "+ New AISB" means the user wants a FRESH session — kill
|
|
2912
|
+
# the existing AISB-chat first so we don't attach to a dead
|
|
2913
|
+
# one (claude died, OAuth missing, etc.).
|
|
2911
2914
|
return _attach_or_spawn_chat(
|
|
2912
2915
|
"AISB-chat",
|
|
2913
|
-
spawn_fn=tmux.spawn_aisb_chat,
|
|
2916
|
+
spawn_fn=lambda h: tmux.spawn_aisb_chat(h, force_replace=True),
|
|
2914
2917
|
label="AISB master (Claude Code on Max OAuth)",
|
|
2915
2918
|
)
|
|
2916
2919
|
if chosen_key == NEW_HERMES:
|
|
2917
2920
|
return _attach_or_spawn_chat(
|
|
2918
2921
|
"Hermes-chat",
|
|
2919
|
-
spawn_fn=tmux.spawn_hermes_chat,
|
|
2922
|
+
spawn_fn=lambda h: tmux.spawn_hermes_chat(h, force_replace=True),
|
|
2920
2923
|
label="Hermès (Claude Code on Anthropic API)",
|
|
2921
2924
|
)
|
|
2922
2925
|
# Otherwise it's an existing session name — just attach.
|
|
@@ -259,49 +259,85 @@ def _ensure_chat_context_dir(home: Path, label: str,
|
|
|
259
259
|
return ctx_dir
|
|
260
260
|
|
|
261
261
|
|
|
262
|
-
def
|
|
262
|
+
def _spawn_with_shell_then_run(
|
|
263
|
+
name: str,
|
|
264
|
+
*,
|
|
265
|
+
cwd: str | Path,
|
|
266
|
+
run_command: str,
|
|
267
|
+
force_replace: bool = False,
|
|
268
|
+
) -> str:
|
|
269
|
+
"""Spawn a tmux session that starts the user's interactive shell at
|
|
270
|
+
``cwd``, then types ``run_command`` + Enter into it. This way:
|
|
271
|
+
|
|
272
|
+
* The shell stays alive even if ``run_command`` exits (claude
|
|
273
|
+
with no auth, claude exited cleanly, etc.) — user still sees
|
|
274
|
+
the shell and can debug.
|
|
275
|
+
* The shell sources the user's rc files normally (PATH, env, etc.)
|
|
276
|
+
so ``claude`` resolves to the operator's binary.
|
|
277
|
+
|
|
278
|
+
Used by spawn_aisb_chat / spawn_hermes_chat. ``force_replace=True``
|
|
279
|
+
kills any existing session of the same name first — the menu's
|
|
280
|
+
"+ New" actions pass this so the user always gets a fresh session
|
|
281
|
+
instead of attaching to a dead one.
|
|
282
|
+
"""
|
|
283
|
+
if force_replace and is_alive(name):
|
|
284
|
+
kill(name)
|
|
285
|
+
if is_alive(name):
|
|
286
|
+
return name
|
|
287
|
+
# 1. Create a detached session running the user's login shell at cwd.
|
|
288
|
+
rc, _ = _tmux("new-session", "-d", "-s", name, "-c", str(cwd))
|
|
289
|
+
if rc != 0:
|
|
290
|
+
return name
|
|
291
|
+
# 2. Send the launch command + Enter into the shell. We use
|
|
292
|
+
# `send-keys` (not the new-session command arg) so the shell stays
|
|
293
|
+
# alive even if the launched binary exits.
|
|
294
|
+
_tmux("send-keys", "-t", name, run_command, "Enter")
|
|
295
|
+
return name
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def spawn_aisb_chat(omega_home: str | Path | None = None,
|
|
299
|
+
force_replace: bool = False) -> str:
|
|
263
300
|
"""Spawn the AISB master chat tmux session — REAL Claude Code TUI.
|
|
264
301
|
|
|
265
|
-
v0.19.
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
role, and full OmegaOS context.
|
|
302
|
+
v0.19.20 — moved from ``exec claude`` (which kills the session when
|
|
303
|
+
claude exits) to ``spawn shell + send-keys claude``. The shell stays
|
|
304
|
+
alive even if claude can't start (no Max OAuth wired, etc.), so the
|
|
305
|
+
user lands inside the session and sees the actual failure instead of
|
|
306
|
+
"ça fait rien du tout" silent attach-to-dead.
|
|
271
307
|
|
|
272
308
|
Auth: Claude Max OAuth (inherited from the user's shell env, no env
|
|
273
309
|
override needed — `claude` reads `~/.claude/.credentials.json`).
|
|
274
310
|
|
|
275
|
-
|
|
276
|
-
the
|
|
277
|
-
|
|
311
|
+
``force_replace=True`` kills any existing AISB-chat first — used by
|
|
312
|
+
the `omega` session manager's "+ New" action so the user gets a
|
|
313
|
+
fresh session each time.
|
|
278
314
|
"""
|
|
279
315
|
name = "AISB-chat"
|
|
280
316
|
home = Path(omega_home or os.environ.get("OMEGA_HOME")
|
|
281
317
|
or Path.home() / "Omega")
|
|
282
318
|
persona = home / "Agentik_SSOT" / "agents" / "aisb" / "CLAUDE.md"
|
|
283
319
|
ctx_dir = _ensure_chat_context_dir(home, "aisb-master", persona)
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
320
|
+
return _spawn_with_shell_then_run(
|
|
321
|
+
name, cwd=ctx_dir, run_command="claude",
|
|
322
|
+
force_replace=force_replace,
|
|
323
|
+
)
|
|
287
324
|
|
|
288
325
|
|
|
289
|
-
def spawn_hermes_chat(omega_home: str | Path | None = None
|
|
326
|
+
def spawn_hermes_chat(omega_home: str | Path | None = None,
|
|
327
|
+
force_replace: bool = False) -> str:
|
|
290
328
|
"""Spawn the Hermès chat tmux session — REAL Claude Code TUI, but on
|
|
291
329
|
Anthropic API (Hermès's own paid key, budget-isolated from Max OAuth).
|
|
292
330
|
|
|
293
331
|
Mirrors ``spawn_aisb_chat`` for the L2 companion: drops a Hermès
|
|
294
|
-
persona ``CLAUDE.md`` into a dedicated context dir,
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
the Max OAuth — same TUI, different billing surface.
|
|
332
|
+
persona ``CLAUDE.md`` into a dedicated context dir, exports
|
|
333
|
+
``ANTHROPIC_API_KEY`` (from vault) before launching `claude`. Same
|
|
334
|
+
shell-stays-alive pattern.
|
|
298
335
|
"""
|
|
299
336
|
name = "Hermes-chat"
|
|
300
337
|
home = Path(omega_home or os.environ.get("OMEGA_HOME")
|
|
301
338
|
or Path.home() / "Omega")
|
|
302
|
-
persona = home / "Agentik_SSOT" / "docs" / "LAYERS.md"
|
|
339
|
+
persona = home / "Agentik_SSOT" / "docs" / "LAYERS.md"
|
|
303
340
|
ctx_dir = _ensure_chat_context_dir(home, "hermes", persona)
|
|
304
|
-
# Resolve Anthropic key from vault → fallback to existing env.
|
|
305
341
|
try:
|
|
306
342
|
from omega_engine.vault import vault_read
|
|
307
343
|
api_key = (vault_read(home, "ANTHROPIC_API_KEY_HERMES") or "").strip()
|
|
@@ -309,9 +345,6 @@ def spawn_hermes_chat(omega_home: str | Path | None = None) -> str:
|
|
|
309
345
|
api_key = ""
|
|
310
346
|
if not api_key:
|
|
311
347
|
api_key = (os.environ.get("ANTHROPIC_API_KEY") or "").strip()
|
|
312
|
-
# If no key, fall back to Max OAuth (Hermès will share AISB's
|
|
313
|
-
# billing — not ideal but better than failing). Surface a marker
|
|
314
|
-
# file in the context dir so the user sees the warning on first launch.
|
|
315
348
|
if not api_key:
|
|
316
349
|
(ctx_dir / "NO_ANTHROPIC_KEY.md").write_text(
|
|
317
350
|
"# Hermès — no Anthropic API key wired\n\n"
|
|
@@ -319,12 +352,14 @@ def spawn_hermes_chat(omega_home: str | Path | None = None) -> str:
|
|
|
319
352
|
"own paid Anthropic budget instead of the AISB Max OAuth.\n\n"
|
|
320
353
|
" omega vault write ANTHROPIC_API_KEY_HERMES sk-ant-...\n"
|
|
321
354
|
)
|
|
322
|
-
|
|
355
|
+
run_cmd = "claude"
|
|
323
356
|
else:
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
357
|
+
# Single-line shell statement; send-keys passes it as-is.
|
|
358
|
+
run_cmd = f"ANTHROPIC_API_KEY={api_key} claude"
|
|
359
|
+
return _spawn_with_shell_then_run(
|
|
360
|
+
name, cwd=ctx_dir, run_command=run_cmd,
|
|
361
|
+
force_replace=force_replace,
|
|
362
|
+
)
|
|
328
363
|
|
|
329
364
|
|
|
330
365
|
# ---------------------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.19.
|
|
1
|
+
0.19.21
|
|
@@ -4,44 +4,53 @@
|
|
|
4
4
|
# (interactive) or apply the manifest's `claude_plugins:` list (headless). For
|
|
5
5
|
# each selected plugin, the installer:
|
|
6
6
|
#
|
|
7
|
-
# 1. ensures the marketplace is registered: `claude plugin marketplace add <
|
|
7
|
+
# 1. ensures the marketplace is registered: `claude plugin marketplace add <owner>/<repo>`
|
|
8
8
|
# (skipped if `source: builtin` — already present after a fresh install)
|
|
9
|
-
# 2. installs it: `claude plugin install <name>@<marketplace
|
|
9
|
+
# 2. installs it: `claude plugin install <name>@<marketplace>`
|
|
10
10
|
#
|
|
11
11
|
# Maintained by the claudecode-educator (Agentik_Orchestration/educators/).
|
|
12
12
|
# Secrets are referenced by name only — never stored here.
|
|
13
13
|
#
|
|
14
14
|
# Marketplaces are listed once; plugins reference them by `marketplace:` id.
|
|
15
|
+
#
|
|
16
|
+
# IMPORTANT — marketplace id != github source.
|
|
17
|
+
# When `claude plugin marketplace add anthropics/skills` runs, the
|
|
18
|
+
# Claude CLI derives an id from the marketplace.json `name` field in the
|
|
19
|
+
# repo, which can be different from the repo name. We tracked these by
|
|
20
|
+
# hand (verified on the VPS as of 2026-05-25).
|
|
21
|
+
#
|
|
22
|
+
# Source format: `<owner>/<repo>` — NO `github:` prefix (the prefix
|
|
23
|
+
# previously bundled here caused `marketplace add` to fail with
|
|
24
|
+
# "Invalid marketplace source format").
|
|
15
25
|
|
|
16
26
|
version: 1
|
|
17
27
|
|
|
18
28
|
marketplaces:
|
|
19
29
|
- id: claude-plugins-official
|
|
20
|
-
source: "
|
|
30
|
+
source: "anthropics/claude-plugins-official"
|
|
21
31
|
description: "Anthropic's official plugin marketplace"
|
|
22
|
-
builtin: true
|
|
23
|
-
- id: anthropic-skills
|
|
24
|
-
source: "
|
|
25
|
-
description: "Anthropic's official
|
|
26
|
-
builtin: false
|
|
27
|
-
trust: high
|
|
28
|
-
- id: vercel-labs-skills
|
|
29
|
-
source: "github:vercel-labs/skills"
|
|
30
|
-
description: "Vercel Labs skills (skill discovery CLI + find-skills)"
|
|
32
|
+
builtin: true # auto-registered by claude CLI
|
|
33
|
+
- id: anthropic-agent-skills
|
|
34
|
+
source: "anthropics/skills"
|
|
35
|
+
description: "Anthropic's official Agent Skills repo (document-skills, claude-api, example-skills)"
|
|
31
36
|
builtin: false
|
|
32
37
|
trust: high
|
|
33
|
-
- id: davila7-templates
|
|
34
|
-
source: "github:davila7/claude-code-templates"
|
|
35
|
-
description: "Community-maintained Claude Code templates and skills"
|
|
36
|
-
builtin: false
|
|
37
|
-
trust: medium
|
|
38
38
|
- id: thedotmack
|
|
39
|
-
source: "
|
|
39
|
+
source: "thedotmack/claude-mem"
|
|
40
40
|
description: "claude-mem memory + observation system"
|
|
41
41
|
builtin: false
|
|
42
42
|
trust: medium
|
|
43
|
+
- id: daymade-skills
|
|
44
|
+
source: "daymade/claude-code-skills"
|
|
45
|
+
description: "Community skill creator marketplace (daymade) — includes skill-creator-style tooling"
|
|
46
|
+
builtin: false
|
|
47
|
+
trust: medium
|
|
43
48
|
|
|
44
49
|
catalog:
|
|
50
|
+
# All entries below were verified to exist + install cleanly on a real
|
|
51
|
+
# Claude Code 2.1.150+ install before being committed here. See the
|
|
52
|
+
# commit message of v0.19.20 for the audit trail.
|
|
53
|
+
|
|
45
54
|
- id: claude-mem
|
|
46
55
|
name: claude-mem
|
|
47
56
|
description: "Long-term memory + observation system across sessions"
|
|
@@ -75,26 +84,50 @@ catalog:
|
|
|
75
84
|
secrets: [STRIPE_SECRET_KEY]
|
|
76
85
|
recommended: false
|
|
77
86
|
|
|
78
|
-
- id: skill-creator
|
|
79
|
-
name: skill-creator
|
|
80
|
-
description: "Generate new SKILL.md files with Claude's help (Anthropic official)"
|
|
81
|
-
category: meta
|
|
82
|
-
marketplace: anthropic-skills
|
|
83
|
-
scope: user
|
|
84
|
-
recommended: true
|
|
85
|
-
|
|
86
|
-
- id: find-skills
|
|
87
|
-
name: find-skills
|
|
88
|
-
description: "Discover skills across marketplaces (vercel-labs); pairs with skill-auditor"
|
|
89
|
-
category: meta
|
|
90
|
-
marketplace: vercel-labs-skills
|
|
91
|
-
scope: user
|
|
92
|
-
recommended: true
|
|
93
|
-
|
|
94
87
|
- id: document-skills
|
|
95
88
|
name: document-skills
|
|
96
89
|
description: "Anthropic official suite — docx, pdf, pptx, xlsx (creation + editing)"
|
|
97
90
|
category: documents
|
|
98
|
-
marketplace: anthropic-skills
|
|
91
|
+
marketplace: anthropic-agent-skills
|
|
99
92
|
scope: user
|
|
100
93
|
recommended: true
|
|
94
|
+
|
|
95
|
+
- id: pr-review-toolkit
|
|
96
|
+
name: pr-review-toolkit
|
|
97
|
+
description: "Pull request review tooling — analyse diffs, suggest fixes"
|
|
98
|
+
category: dev
|
|
99
|
+
marketplace: claude-plugins-official
|
|
100
|
+
scope: user
|
|
101
|
+
recommended: false
|
|
102
|
+
|
|
103
|
+
- id: code-review
|
|
104
|
+
name: code-review
|
|
105
|
+
description: "Static code review with style + quality heuristics"
|
|
106
|
+
category: dev
|
|
107
|
+
marketplace: claude-plugins-official
|
|
108
|
+
scope: user
|
|
109
|
+
recommended: false
|
|
110
|
+
|
|
111
|
+
- id: feature-dev
|
|
112
|
+
name: feature-dev
|
|
113
|
+
description: "Feature development workflow — spec → impl → review"
|
|
114
|
+
category: dev
|
|
115
|
+
marketplace: claude-plugins-official
|
|
116
|
+
scope: user
|
|
117
|
+
recommended: false
|
|
118
|
+
|
|
119
|
+
- id: mcp-server-dev
|
|
120
|
+
name: mcp-server-dev
|
|
121
|
+
description: "Scaffold + iterate on new MCP servers"
|
|
122
|
+
category: dev
|
|
123
|
+
marketplace: claude-plugins-official
|
|
124
|
+
scope: user
|
|
125
|
+
recommended: false
|
|
126
|
+
|
|
127
|
+
- id: plugin-dev
|
|
128
|
+
name: plugin-dev
|
|
129
|
+
description: "Build + test new Claude Code plugins"
|
|
130
|
+
category: meta
|
|
131
|
+
marketplace: claude-plugins-official
|
|
132
|
+
scope: user
|
|
133
|
+
recommended: false
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Omega OS — system CLI catalog (v0.19.21+)
|
|
2
|
+
#
|
|
3
|
+
# Replaces the v0.19.20 MCP catalog. Rationale: MCP servers are
|
|
4
|
+
# token-expensive (each call pays the protocol round-trip + the server's
|
|
5
|
+
# system prompt overhead). System CLIs that Claude Code calls via `Bash`
|
|
6
|
+
# are cheap, predictable, and survive without a running server.
|
|
7
|
+
#
|
|
8
|
+
# Printing Press (https://printingpress.dev) ships ~50 agent-native CLIs
|
|
9
|
+
# with local SQLite mirrors for offline queries — even cheaper than
|
|
10
|
+
# remote API calls. We pull a curated subset by default.
|
|
11
|
+
#
|
|
12
|
+
# Maintained by the connection-educator (Agentik_Orchestration/educators/).
|
|
13
|
+
# Secrets are referenced by name only — operator wires them at install
|
|
14
|
+
# time or later via `omega vault write <REF> <value>`.
|
|
15
|
+
|
|
16
|
+
version: 1
|
|
17
|
+
|
|
18
|
+
# --- 1. Native binaries — install via system package manager -----------
|
|
19
|
+
# These are the bedrock — `omega audit` and most workflows assume
|
|
20
|
+
# they're on PATH.
|
|
21
|
+
native:
|
|
22
|
+
- id: gh
|
|
23
|
+
name: GitHub CLI
|
|
24
|
+
install: { brew: "gh", apt: "gh", dnf: "gh" }
|
|
25
|
+
recommended: true
|
|
26
|
+
- id: vercel
|
|
27
|
+
name: Vercel CLI
|
|
28
|
+
install: { npm_global: "vercel" }
|
|
29
|
+
recommended: true
|
|
30
|
+
- id: wrangler
|
|
31
|
+
name: Cloudflare Wrangler
|
|
32
|
+
install: { npm_global: "wrangler" }
|
|
33
|
+
recommended: false
|
|
34
|
+
- id: pnpm
|
|
35
|
+
name: pnpm package manager
|
|
36
|
+
install: { brew: "pnpm", npm_global: "pnpm" }
|
|
37
|
+
recommended: true
|
|
38
|
+
- id: bun
|
|
39
|
+
name: Bun runtime + package manager
|
|
40
|
+
install: { brew: "oven-sh/bun/bun", curl: "https://bun.sh/install" }
|
|
41
|
+
recommended: true
|
|
42
|
+
- id: ripgrep
|
|
43
|
+
name: ripgrep (rg) — fast code search
|
|
44
|
+
install: { brew: "ripgrep", apt: "ripgrep", dnf: "ripgrep" }
|
|
45
|
+
binary: rg
|
|
46
|
+
recommended: true
|
|
47
|
+
- id: bat
|
|
48
|
+
name: bat — better cat with syntax highlight
|
|
49
|
+
install: { brew: "bat", apt: "bat", dnf: "bat" }
|
|
50
|
+
recommended: false
|
|
51
|
+
- id: jq
|
|
52
|
+
name: jq — JSON processor
|
|
53
|
+
install: { brew: "jq", apt: "jq", dnf: "jq" }
|
|
54
|
+
recommended: true
|
|
55
|
+
- id: stripe-cli
|
|
56
|
+
name: Stripe CLI
|
|
57
|
+
install: { brew: "stripe/stripe-cli/stripe" }
|
|
58
|
+
binary: stripe
|
|
59
|
+
secrets: [STRIPE_API_KEY]
|
|
60
|
+
recommended: false
|
|
61
|
+
- id: playwright
|
|
62
|
+
name: Playwright (browser automation for E2E + audits)
|
|
63
|
+
install: { npm_global: "@playwright/test" }
|
|
64
|
+
secrets: []
|
|
65
|
+
recommended: true
|
|
66
|
+
|
|
67
|
+
# --- 2. Printing Press CLIs --------------------------------------------
|
|
68
|
+
# Installed via `npx -y @mvanhorn/printing-press-library install <name>`.
|
|
69
|
+
# Each ships with a local SQLite mirror + Claude Code skill.
|
|
70
|
+
#
|
|
71
|
+
# Catalog source: github.com/mvanhorn/printing-press-library/library
|
|
72
|
+
printing_press_core:
|
|
73
|
+
install_method: "curl -fsSL https://raw.githubusercontent.com/mvanhorn/cli-printing-press/main/scripts/install.sh | bash"
|
|
74
|
+
description: "Printing Press generator + library client (ppi-* CLIs)"
|
|
75
|
+
|
|
76
|
+
printing_press_clis:
|
|
77
|
+
- id: stripe
|
|
78
|
+
category: payments
|
|
79
|
+
description: "Every Stripe entity + local SQLite mirror, cross-entity SQL"
|
|
80
|
+
secrets: [STRIPE_API_KEY]
|
|
81
|
+
recommended: true
|
|
82
|
+
- id: linear
|
|
83
|
+
category: project-management
|
|
84
|
+
description: "Linear issues + projects, local SQLite mirror, compound queries"
|
|
85
|
+
secrets: [LINEAR_API_KEY]
|
|
86
|
+
recommended: true
|
|
87
|
+
- id: jira
|
|
88
|
+
category: project-management
|
|
89
|
+
description: "Jira issues + sprints"
|
|
90
|
+
secrets: [JIRA_API_TOKEN, JIRA_HOST]
|
|
91
|
+
recommended: false
|
|
92
|
+
- id: clickup
|
|
93
|
+
category: project-management
|
|
94
|
+
description: "ClickUp tasks + spaces"
|
|
95
|
+
secrets: [CLICKUP_API_KEY]
|
|
96
|
+
recommended: false
|
|
97
|
+
- id: cal-com
|
|
98
|
+
category: productivity
|
|
99
|
+
description: "Cal.com bookings + availability"
|
|
100
|
+
secrets: [CAL_COM_API_KEY]
|
|
101
|
+
recommended: false
|
|
102
|
+
- id: figma
|
|
103
|
+
category: productivity
|
|
104
|
+
description: "Figma files + comments (read-only)"
|
|
105
|
+
secrets: [FIGMA_TOKEN]
|
|
106
|
+
recommended: false
|
|
107
|
+
- id: fireflies
|
|
108
|
+
category: productivity
|
|
109
|
+
description: "Fireflies meeting transcripts + summaries"
|
|
110
|
+
secrets: [FIREFLIES_API_KEY]
|
|
111
|
+
recommended: false
|
|
112
|
+
- id: granola
|
|
113
|
+
category: productivity
|
|
114
|
+
description: "Granola notes export"
|
|
115
|
+
secrets: [GRANOLA_API_KEY]
|
|
116
|
+
recommended: false
|
|
117
|
+
- id: apify
|
|
118
|
+
category: developer-tools
|
|
119
|
+
description: "Apify scraping actors + dataset access"
|
|
120
|
+
secrets: [APIFY_TOKEN]
|
|
121
|
+
recommended: false
|
|
122
|
+
- id: firecrawl
|
|
123
|
+
category: developer-tools
|
|
124
|
+
description: "Firecrawl web scraping with local mirror"
|
|
125
|
+
secrets: [FIRECRAWL_API_KEY]
|
|
126
|
+
recommended: false
|
|
127
|
+
- id: docker-hub
|
|
128
|
+
category: developer-tools
|
|
129
|
+
description: "Docker Hub repos + tags inspection"
|
|
130
|
+
secrets: []
|
|
131
|
+
recommended: false
|
|
132
|
+
- id: twilio
|
|
133
|
+
category: social-and-messaging
|
|
134
|
+
description: "Twilio SMS + voice + WhatsApp"
|
|
135
|
+
secrets: [TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN]
|
|
136
|
+
recommended: false
|
|
137
|
+
- id: ahrefs
|
|
138
|
+
category: marketing
|
|
139
|
+
description: "Ahrefs SEO data with local SQLite mirror"
|
|
140
|
+
secrets: [AHREFS_API_KEY]
|
|
141
|
+
recommended: false
|
|
142
|
+
- id: google-search-console
|
|
143
|
+
category: marketing
|
|
144
|
+
description: "GSC properties + queries + pages"
|
|
145
|
+
secrets: [GSC_CREDENTIALS_JSON]
|
|
146
|
+
recommended: false
|
|
147
|
+
- id: google-ads
|
|
148
|
+
category: marketing
|
|
149
|
+
description: "Google Ads campaigns + spend"
|
|
150
|
+
secrets: [GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_CLIENT_ID, GOOGLE_ADS_CLIENT_SECRET]
|
|
151
|
+
recommended: false
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentikos/omega-os",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.21",
|
|
4
4
|
"description": "Omega OS — installable agentic operating system with verified-completion orchestration. Event-sourced engine, 8-block rack, autonomous agents, MCP.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"omega-os": "bin/omega-os.js"
|