@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.
- package/bootstrap/lib/steps.sh +14 -5
- package/install.sh +21 -0
- 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/package.json +1 -1
package/bootstrap/lib/steps.sh
CHANGED
|
@@ -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
|
-
#
|
|
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
|
|
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
|
|
757
|
-
if claude plugin install "$spec"
|
|
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
|
|
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.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 <
|
|
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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentikos/omega-os",
|
|
3
|
-
"version": "0.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"
|