@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.
@@ -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
- # Already registered or other non-fatal; log only.
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 scope
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 (scope=$scope)"
757
- if claude plugin install "$spec" -s "$scope" >>"$LOG_FILE" 2>&1; then
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
- "40-mcp:step_mcp"
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
@@ -188,7 +188,7 @@ from omega_engine.genesis import (
188
188
  )
189
189
  from omega_engine import plan as plan_v7
190
190
 
191
- __version__ = "0.19.19"
191
+ __version__ = "0.19.21"
192
192
 
193
193
  __all__ = [
194
194
  "__version__",
@@ -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 spawn_aisb_chat(omega_home: str | Path | None = None) -> str:
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.18instead of running our Python REPL (`omega aisb chat-loop`),
266
- we now run the canonical `claude` CLI inside a dedicated project dir
267
- seeded with the AISB master persona (``Agentik_SSOT/agents/aisb/CLAUDE.md``).
268
- User sees the SAME interactive Claude Code TUI they get with bare
269
- `claude`, but pre-loaded with AISB's identity, the L3 orchestrator
270
- role, and full OmegaOS context.
302
+ v0.19.20moved 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
- cwd=$HOME is the legacy crash fix (spawn() default would inherit
276
- the npm/_npx cache dir which can disappear); the `claude` process
277
- itself runs with cwd = the context dir we just created.
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
- spawn(name, command=f"cd {ctx_dir} && exec claude",
285
- cwd=str(Path.home()))
286
- return name
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) -> str:
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, then runs
295
- `claude` there with ``ANTHROPIC_API_KEY`` exported from the vault.
296
- Setting the env var makes Claude Code use the API key instead of
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" # Hermès reads architecture as persona
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
- cmd = f"cd {ctx_dir} && exec claude"
355
+ run_cmd = "claude"
323
356
  else:
324
- cmd = (f"cd {ctx_dir} && "
325
- f"ANTHROPIC_API_KEY={api_key} exec claude")
326
- spawn(name, command=cmd, cwd=str(Path.home()))
327
- return name
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "omega-engine"
3
- version = "0.19.19"
3
+ version = "0.19.21"
4
4
  description = "The Omega OS orchestration engine — event-sourced, verified-completion agent graphs."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1 +1 @@
1
- 0.19.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 <source>`
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> -s <scope>`
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: "github:anthropics/claude-plugins-official"
30
+ source: "anthropics/claude-plugins-official"
21
31
  description: "Anthropic's official plugin marketplace"
22
- builtin: true
23
- - id: anthropic-skills
24
- source: "github:anthropics/skills"
25
- description: "Anthropic's official skill collection (find-skills, document skills, etc.)"
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: "github:thedotmack/claude-mem"
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.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"