@agentikos/omega-os 0.19.19 → 0.19.20

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.
@@ -734,27 +734,36 @@ step_claude_plugins() {
734
734
 
735
735
  # Register every marketplace referenced by the selected plugins (excluding
736
736
  # those marked `builtin: true`).
737
+ #
738
+ # Source format MUST be `<owner>/<repo>` for the Claude CLI. We strip
739
+ # any legacy `github:` prefix the catalog may still carry (pre-v0.19.20
740
+ # catalogs used `github:owner/repo` which fails with "Invalid
741
+ # marketplace source format").
737
742
  while IFS= read -r src; do
738
743
  [ -z "$src" ] && continue
744
+ src="${src#github:}"
739
745
  info "registering marketplace: $src"
740
746
  if claude plugin marketplace add "$src" >>"$LOG_FILE" 2>&1; then
741
747
  ok "marketplace ok: $src"
742
748
  else
743
- # Already registered or other non-fatal; log only.
749
+ # Likely already registered non-fatal, log only.
744
750
  info "marketplace add returned non-zero (may already be registered): $src"
745
751
  fi
746
752
  done < <(_claude_plugins_marketplaces_for "$catalog" "$selected")
747
753
 
754
+ # `claude plugin install` does NOT accept `-s <scope>` (verified against
755
+ # Claude Code 2.1.150 — the plugin help only documents --config). The
756
+ # scope is per-install determined by where the plugin manifest declares
757
+ # it; we keep `scope:` in the catalog only as documentation.
748
758
  local failed=""
749
759
  local id
750
760
  while IFS= read -r id; do
751
761
  [ -z "$id" ] && continue
752
- local spec scope
762
+ local spec
753
763
  spec="$(_claude_plugins_install_spec "$catalog" "$id")"
754
- scope="$(_claude_plugins_scope_for "$catalog" "$id")"
755
764
  [ -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
765
+ info "installing claude plugin: $spec"
766
+ if claude plugin install "$spec" >>"$LOG_FILE" 2>&1; then
758
767
  ok "claude plugin installed: $id"
759
768
  else
760
769
  err "claude plugin $id failed to install — see $LOG_FILE; continuing"
package/install.sh CHANGED
@@ -207,3 +207,24 @@ record_state_version
207
207
 
208
208
  # Final boxed celebration + verdict from `omega doctor --json`.
209
209
  post_install_card
210
+
211
+ # v0.19.20 — drop the user into a fresh login shell so $PATH (now
212
+ # containing $OMEGA_HOME/Agentik_Tools/bin) and OMEGA_HOME are loaded
213
+ # immediately. Without this, the user had to remember to
214
+ # `source ~/.zshrc` or open a new terminal — bad UX.
215
+ #
216
+ # Only re-exec when:
217
+ # * stdin is a tty (interactive install, not piped/CI)
218
+ # * we're not running under --non-interactive
219
+ # * the user isn't already in a non-default shell we don't understand
220
+ # * an `omega` binary exists at the canonical path
221
+ #
222
+ # Otherwise we just print the instruction so the user knows what to do.
223
+ if [ -t 0 ] && [ "${NONINTERACTIVE:-0}" != "1" ] \
224
+ && [ -x "$OMEGA_HOME/Agentik_Tools/bin/omega" ]; then
225
+ log ""
226
+ log "${C_DIM}::${C_RST} reloading your shell so \`omega\` is on PATH…"
227
+ log "${C_DIM}::${C_RST} type ${C_BOLD}omega${C_RST} to open the session manager"
228
+ log ""
229
+ exec "${SHELL:-/bin/bash}" -l
230
+ 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.20"
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.20"
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.20
@@ -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
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.20",
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"