@jaguilar87/gaia 5.0.5 → 5.0.7
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +19 -0
- package/bin/cli/_install_helpers.py +1 -1
- package/bin/cli/doctor.py +20 -18
- package/bin/validate-sandbox.sh +8 -3
- package/dist/gaia-ops/.claude-plugin/plugin.json +1 -1
- package/dist/gaia-ops/skills/gaia-patterns/SKILL.md +2 -6
- package/dist/gaia-ops/skills/gaia-patterns/reference.md +2 -14
- package/dist/gaia-security/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/skills/gaia-patterns/SKILL.md +2 -6
- package/skills/gaia-patterns/reference.md +2 -14
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
{
|
|
9
9
|
"name": "gaia-ops",
|
|
10
10
|
"description": "Full DevOps orchestration for Claude Code. Eight specialized agents handle the complete development lifecycle — analysis, planning, execution, and deployment. Gaia-Ops scans your codebase to understand it and injects the right context into each sub-agent. Every command is classified by risk: read-only runs freely, state changes pause for your approval, and irreversible operations are permanently blocked.",
|
|
11
|
-
"version": "5.0.
|
|
11
|
+
"version": "5.0.7",
|
|
12
12
|
"category": "devops",
|
|
13
13
|
"author": {
|
|
14
14
|
"name": "jaguilar87",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
{
|
|
21
21
|
"name": "gaia-security",
|
|
22
22
|
"description": "Keeps you in the loop only when it matters. Gaia Security analyzes every command and classifies it into risk tiers: read-only queries run freely, simulations and validations pass through, and state-changing operations (create, delete, apply, push) pause for your explicit approval before executing. Irreversible commands like dropping databases or deleting cloud infrastructure are permanently blocked.",
|
|
23
|
-
"version": "5.0.
|
|
23
|
+
"version": "5.0.7",
|
|
24
24
|
"category": "security",
|
|
25
25
|
"author": {
|
|
26
26
|
"name": "jaguilar87",
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [5.0.7] - 2026-06-12
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- `gaia doctor` now passes (rc=0) on a clean install: the `commands` symlink (a removed surface) was dropped from the symlink checks, and `memory_fts5_count` now reads the canonical gaia.db store instead of the legacy search.db — eliminating the two warnings that made a fresh install report "degraded" in 5.0.5/5.0.6.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Release pipeline: the sandbox validation harness is now a PRE-publish gate (runs against the packed tarball before `npm publish`), and the harness fails if `gaia doctor` returns rc>=1 — so a degraded build can no longer be published.
|
|
19
|
+
|
|
20
|
+
## [5.0.6] - 2026-06-12
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
|
|
24
|
+
- **`gaia doctor` no longer reports a freshly-installed workspace as "degraded"
|
|
25
|
+
(rc=1)** — an empty project-context contracts table is now `info` (an advisory
|
|
26
|
+
to run `gaia scan`) instead of `warning`, so a clean install passes doctor with
|
|
27
|
+
rc=0. Fixes the post-publish sandbox-validation failure seen in 5.0.5.
|
|
28
|
+
|
|
10
29
|
## [5.0.5] - 2026-06-11
|
|
11
30
|
|
|
12
31
|
### Repository Hygiene, Python 3.11 Floor, v18 Schema Floor + Drift Guard, Release-Pipeline Hardening
|
|
@@ -345,7 +345,7 @@ def merge_local_hooks(
|
|
|
345
345
|
# ---------------------------------------------------------------------------
|
|
346
346
|
|
|
347
347
|
# Directories the package exposes via .claude/<name> symlinks
|
|
348
|
-
_SYMLINK_NAMES = ["agents", "tools", "hooks", "
|
|
348
|
+
_SYMLINK_NAMES = ["agents", "tools", "hooks", "config", "skills"]
|
|
349
349
|
# Files (not dirs) we link or copy into .claude/
|
|
350
350
|
_SYMLINK_FILES = ["CHANGELOG.md"]
|
|
351
351
|
|
package/bin/cli/doctor.py
CHANGED
|
@@ -762,7 +762,7 @@ def _extract_check_values(
|
|
|
762
762
|
@register_check("Symlinks", order=50)
|
|
763
763
|
def check_symlinks(project_root: Path) -> dict:
|
|
764
764
|
"""Check .claude/ symlinks resolve to package content."""
|
|
765
|
-
names = ["agents", "tools", "hooks", "
|
|
765
|
+
names = ["agents", "tools", "hooks", "config", "skills", "CHANGELOG.md"]
|
|
766
766
|
critical = {"agents", "hooks", "skills"}
|
|
767
767
|
valid = 0
|
|
768
768
|
has_critical_missing = False
|
|
@@ -935,7 +935,7 @@ def check_project_context(project_root: Path) -> dict:
|
|
|
935
935
|
return _result("project-context", "warning", f"DB read error: {exc}", "Run `gaia scan`")
|
|
936
936
|
|
|
937
937
|
if count == 0:
|
|
938
|
-
return _result("project-context", "
|
|
938
|
+
return _result("project-context", "info", "No contracts in DB", "Run `gaia scan`")
|
|
939
939
|
|
|
940
940
|
if count < 3:
|
|
941
941
|
return _result(
|
|
@@ -1053,34 +1053,36 @@ def check_memory_fts5_db(project_root: Path) -> dict:
|
|
|
1053
1053
|
|
|
1054
1054
|
@register_check("memory_fts5_count", order=130)
|
|
1055
1055
|
def check_memory_fts5_count(project_root: Path) -> dict:
|
|
1056
|
-
"""Check FTS5 indexed count against total episode count in
|
|
1057
|
-
index_path = project_root / ".claude" / "project-context" / "episodic-memory" / "index.json"
|
|
1058
|
-
|
|
1059
|
-
if not index_path.is_file():
|
|
1060
|
-
return _result("memory_fts5_count", "info", "index.json not found — no episodes yet")
|
|
1061
|
-
|
|
1062
|
-
index_data = _read_json(index_path)
|
|
1063
|
-
if not index_data:
|
|
1064
|
-
return _result("memory_fts5_count", "info", "index.json unreadable")
|
|
1065
|
-
|
|
1066
|
-
total = len(index_data.get("episodes") or [])
|
|
1056
|
+
"""Check FTS5 indexed count against total episode count in gaia.db.
|
|
1067
1057
|
|
|
1058
|
+
T6 migration: replaced legacy search_store.count()/index.json check
|
|
1059
|
+
(which read search.db and ignored GAIA_DATA_DIR) with queries against
|
|
1060
|
+
the canonical gaia.db -- episodes_fts for indexed, episodes for total.
|
|
1061
|
+
"""
|
|
1068
1062
|
try:
|
|
1069
1063
|
import sys as _sys
|
|
1070
|
-
# Ensure package root is on path for lazy import
|
|
1071
1064
|
pkg_root = str(_package_root())
|
|
1072
1065
|
if pkg_root not in _sys.path:
|
|
1073
1066
|
_sys.path.insert(0, pkg_root)
|
|
1074
|
-
from
|
|
1075
|
-
indexed = search_store.count()
|
|
1067
|
+
from gaia.store.writer import _connect as _store_connect
|
|
1076
1068
|
except ImportError:
|
|
1077
1069
|
return _result(
|
|
1078
1070
|
"memory_fts5_count",
|
|
1079
1071
|
"info",
|
|
1080
|
-
"
|
|
1072
|
+
"gaia.store.writer not importable — FTS5 count skipped",
|
|
1081
1073
|
)
|
|
1074
|
+
|
|
1075
|
+
try:
|
|
1076
|
+
con = _store_connect()
|
|
1077
|
+
try:
|
|
1078
|
+
indexed_row = con.execute("SELECT COUNT(*) FROM episodes_fts").fetchone()
|
|
1079
|
+
indexed = indexed_row[0] if indexed_row else 0
|
|
1080
|
+
total_row = con.execute("SELECT COUNT(*) FROM episodes").fetchone()
|
|
1081
|
+
total = total_row[0] if total_row else 0
|
|
1082
|
+
finally:
|
|
1083
|
+
con.close()
|
|
1082
1084
|
except Exception as exc:
|
|
1083
|
-
return _result("memory_fts5_count", "info", f"Could not query FTS5 count: {exc}")
|
|
1085
|
+
return _result("memory_fts5_count", "info", f"Could not query FTS5 count from gaia.db: {exc}")
|
|
1084
1086
|
|
|
1085
1087
|
if total == 0:
|
|
1086
1088
|
return _result("memory_fts5_count", "pass", "No episodes to index")
|
package/bin/validate-sandbox.sh
CHANGED
|
@@ -590,11 +590,16 @@ else
|
|
|
590
590
|
rc=$?
|
|
591
591
|
fi
|
|
592
592
|
ms=$(( $(now_ms) - t0 ))
|
|
593
|
-
#
|
|
594
|
-
|
|
593
|
+
# The harness gate must not pass a degraded doctor: a non-zero rc means at
|
|
594
|
+
# least one check is warning/error, so treat rc>=1 as a hard FAILURE. Only a
|
|
595
|
+
# clean rc=0 (all checks pass/info) with parseable JSON counts as PASS.
|
|
596
|
+
if [[ "${rc}" -ne 0 ]]; then
|
|
597
|
+
nonpass="$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print(', '.join(f\"{r['name']}={r['severity']}\" for r in d['checks'] if r['severity'] not in ('pass','info')))" "${out}" 2>/dev/null || echo "unparseable output")"
|
|
598
|
+
record "gaia doctor --json" "FAIL" "doctor returned rc=${rc}; non-pass: ${nonpass:-none}" "${ms}"
|
|
599
|
+
elif python3 -c "import json,sys; d=json.loads(sys.argv[1]); c=d['checks']; t=len(c); sys.exit(0 if t>=5 else 1)" "${out}" 2>/dev/null; then
|
|
595
600
|
total=$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print(len(d['checks']))" "${out}")
|
|
596
601
|
passed=$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print(sum(1 for r in d['checks'] if r['severity']=='pass'))" "${out}")
|
|
597
|
-
record "gaia doctor --json" "PASS" "${passed}/${total} checks passed" "${ms}"
|
|
602
|
+
record "gaia doctor --json" "PASS" "rc=0, ${passed}/${total} checks passed" "${ms}"
|
|
598
603
|
else
|
|
599
604
|
record "gaia doctor --json" "FAIL" "parse/threshold failure (rc=${rc})" "${ms}"
|
|
600
605
|
fi
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gaia-ops",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.7",
|
|
4
4
|
"description": "Full DevOps orchestration for Claude Code. Eight specialized agents handle the complete development lifecycle \u2014 analysis, planning, execution, and deployment. Gaia-Ops scans your codebase to understand it and injects the right context into each sub-agent. Every command is classified by risk: read-only runs freely, state changes pause for your approval, and irreversible operations are permanently blocked.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "jaguilar87",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gaia-patterns
|
|
3
|
-
description: Use when building or modifying gaia-ops components -- agents, skills, hooks, CLI tools,
|
|
3
|
+
description: Use when building or modifying gaia-ops components -- agents, skills, hooks, CLI tools, or routing config
|
|
4
4
|
metadata:
|
|
5
5
|
user-invocable: false
|
|
6
6
|
type: domain
|
|
@@ -77,10 +77,6 @@ Agents get instantiated as: identity (.md) + skills (injected from frontmatter)
|
|
|
77
77
|
|
|
78
78
|
CLI tools live in `bin/` and are registered in `package.json` `bin` field. Pattern: parse args, resolve paths (follow symlinks to source), run checks, exit with code. `gaia doctor` is the diagnostic model -- read it first.
|
|
79
79
|
|
|
80
|
-
## Command Patterns
|
|
81
|
-
|
|
82
|
-
Slash commands live in `commands/<name>.md` -- markdown files that instruct the orchestrator on `/<name>`. To add: create the `.md`, add to `build/<plugin>.manifest.json`.
|
|
83
|
-
|
|
84
80
|
## Documentation Drift Awareness
|
|
85
81
|
|
|
86
82
|
When you modify any Gaia component (hook, skill, agent definition, routing config, security rule), check if existing reference docs describe that component's behavior. If drift exists, report it via `cross_layer_impacts` in your agent_contract_handoff. The orchestrator then decides whether to dispatch a documentation update task.
|
|
@@ -91,7 +87,7 @@ When you modify any Gaia component (hook, skill, agent definition, routing confi
|
|
|
91
87
|
- Changed `_is_protected()` paths in `adapters/claude_code.py` → check `security-tiers/SKILL.md` for path documentation
|
|
92
88
|
- Added a new agent definition → check `gaia-patterns/reference.md` for agents table
|
|
93
89
|
- Modified hook enforcement logic → check `security-tiers` and `agent-protocol` references
|
|
94
|
-
- When adding or modifying files in agents/, skills/, hooks/,
|
|
90
|
+
- When adding or modifying files in agents/, skills/, hooks/, config/, bin/, tests/, build/ or the repo root, load Skill('readme-writing') to update the relevant README.md
|
|
95
91
|
|
|
96
92
|
**Format:** In `cross_layer_impacts`, list the doc file and the behavior change, e.g.:
|
|
97
93
|
```
|
|
@@ -80,14 +80,6 @@ SessionStart emits a one-shot `hookSpecificOutput.additionalContext` manifest (E
|
|
|
80
80
|
| `skill-creation/` | Technique | Injected (gaia-system) |
|
|
81
81
|
| `skills/reference.md` | Reference | On-demand (shared security-tiers ref) |
|
|
82
82
|
|
|
83
|
-
### Commands (slash commands)
|
|
84
|
-
|
|
85
|
-
| Command | File | Purpose |
|
|
86
|
-
|---------|------|---------|
|
|
87
|
-
| `/gaia` | `commands/gaia.md` | Invoke gaia meta-agent |
|
|
88
|
-
| `/scan-project` | `commands/scan-project.md` | Scan project, update project context in ~/.gaia/gaia.db |
|
|
89
|
-
| `/gaia-plan` | `commands/gaia-plan.md` | Plan a feature, create brief, decompose into tasks |
|
|
90
|
-
|
|
91
83
|
### Tools (7 subsystems)
|
|
92
84
|
|
|
93
85
|
| Subsystem | Location | Purpose |
|
|
@@ -139,7 +131,7 @@ The package ships a single `gaia` binary (`bin/gaia.js`) that dispatches to Pyth
|
|
|
139
131
|
|
|
140
132
|
| Mode | Package | What ships |
|
|
141
133
|
|------|---------|-----------|
|
|
142
|
-
| `gaia-ops` | `@jaguilar87/gaia` (full) | All hooks, all modules, all agents, all skills, all
|
|
134
|
+
| `gaia-ops` | `@jaguilar87/gaia` (full) | All hooks, all modules, all agents, all skills, all tools, all config |
|
|
143
135
|
| `gaia-security` | `@jaguilar87/gaia` (security dist) | 6 hooks (`pre_tool_use`, `post_tool_use`, `stop_hook`, `user_prompt_submit`, `session_start`, `session_end_hook`), all modules, no agents, no skills, no config |
|
|
144
136
|
|
|
145
137
|
### Detection Cascade (`hooks/modules/core/plugin_mode.py`)
|
|
@@ -159,7 +151,6 @@ The package ships a single `gaia` binary (`bin/gaia.js`) that dispatches to Pyth
|
|
|
159
151
|
| T3 approval | Claude Code native dialog (`permissionDecision: ask`) | Hook blocks with nonce, orchestrator approval flow |
|
|
160
152
|
| Agents | None | 8 agents routed by orchestrator |
|
|
161
153
|
| Skills | None | 24 skills injected per frontmatter |
|
|
162
|
-
| Commands | None | 7 slash commands |
|
|
163
154
|
| PreToolUse matchers | `Bash` only | `Bash`, `Task`, `Agent`, `SendMessage`, multi-tool |
|
|
164
155
|
| File write protection | `_is_protected()` blocks hooks/ and settings*.json for Edit/Write tools | Same -- fires regardless of permissionMode |
|
|
165
156
|
|
|
@@ -206,7 +197,7 @@ npm publish # publishes @jaguilar87/gaia
|
|
|
206
197
|
3. Run `scripts/bootstrap_database.sh` -- seeds the schema (v17), agent rows, and `schema_version`. Fail-loud: any non-zero exit writes `~/.gaia/last-install-error.json` and propagates the error.
|
|
207
198
|
4. Merge permissions, env vars, and agent key into `settings.local.json` (preserves user config).
|
|
208
199
|
5. Merge hooks from `hooks.json` into `settings.local.json` via the consolidated `merge_hooks` step.
|
|
209
|
-
6. Create `.claude/{agents, tools, hooks,
|
|
200
|
+
6. Create `.claude/{agents, tools, hooks, config, skills}` symlinks (5) plus `CHANGELOG.md` file link.
|
|
210
201
|
7. Write `plugin-registry.json` with `installed[].name == "gaia-ops"` (or `gaia-security`).
|
|
211
202
|
8. Verification.
|
|
212
203
|
|
|
@@ -229,8 +220,6 @@ The hook invoker is `python3 <script>` rather than executing the script directly
|
|
|
229
220
|
.claude/agents -> node_modules/@jaguilar87/gaia/agents/
|
|
230
221
|
.claude/tools -> node_modules/@jaguilar87/gaia/tools/
|
|
231
222
|
.claude/hooks -> node_modules/@jaguilar87/gaia/hooks/
|
|
232
|
-
.claude/commands -> node_modules/@jaguilar87/gaia/commands/
|
|
233
|
-
.claude/templates -> node_modules/@jaguilar87/gaia/templates/
|
|
234
223
|
.claude/config -> node_modules/@jaguilar87/gaia/config/
|
|
235
224
|
.claude/skills -> node_modules/@jaguilar87/gaia/skills/
|
|
236
225
|
.claude/CHANGELOG.md (file link) -> node_modules/@jaguilar87/gaia/CHANGELOG.md
|
|
@@ -333,7 +322,6 @@ ln -sf /home/jorge/ws/me/gaia-dev/agents .claude/agents
|
|
|
333
322
|
ln -sf /home/jorge/ws/me/gaia-dev/hooks .claude/hooks
|
|
334
323
|
ln -sf /home/jorge/ws/me/gaia-dev/skills .claude/skills
|
|
335
324
|
ln -sf /home/jorge/ws/me/gaia-dev/tools .claude/tools
|
|
336
|
-
ln -sf /home/jorge/ws/me/gaia-dev/commands .claude/commands
|
|
337
325
|
ln -sf /home/jorge/ws/me/gaia-dev/config .claude/config
|
|
338
326
|
```
|
|
339
327
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gaia-security",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.7",
|
|
4
4
|
"description": "Keeps you in the loop only when it matters. Gaia Security analyzes every command and classifies it into risk tiers: read-only queries run freely, simulations and validations pass through, and state-changing operations (create, delete, apply, push) pause for your explicit approval before executing. Irreversible commands like dropping databases or deleting cloud infrastructure are permanently blocked.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "jaguilar87",
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gaia-patterns
|
|
3
|
-
description: Use when building or modifying gaia-ops components -- agents, skills, hooks, CLI tools,
|
|
3
|
+
description: Use when building or modifying gaia-ops components -- agents, skills, hooks, CLI tools, or routing config
|
|
4
4
|
metadata:
|
|
5
5
|
user-invocable: false
|
|
6
6
|
type: domain
|
|
@@ -77,10 +77,6 @@ Agents get instantiated as: identity (.md) + skills (injected from frontmatter)
|
|
|
77
77
|
|
|
78
78
|
CLI tools live in `bin/` and are registered in `package.json` `bin` field. Pattern: parse args, resolve paths (follow symlinks to source), run checks, exit with code. `gaia doctor` is the diagnostic model -- read it first.
|
|
79
79
|
|
|
80
|
-
## Command Patterns
|
|
81
|
-
|
|
82
|
-
Slash commands live in `commands/<name>.md` -- markdown files that instruct the orchestrator on `/<name>`. To add: create the `.md`, add to `build/<plugin>.manifest.json`.
|
|
83
|
-
|
|
84
80
|
## Documentation Drift Awareness
|
|
85
81
|
|
|
86
82
|
When you modify any Gaia component (hook, skill, agent definition, routing config, security rule), check if existing reference docs describe that component's behavior. If drift exists, report it via `cross_layer_impacts` in your agent_contract_handoff. The orchestrator then decides whether to dispatch a documentation update task.
|
|
@@ -91,7 +87,7 @@ When you modify any Gaia component (hook, skill, agent definition, routing confi
|
|
|
91
87
|
- Changed `_is_protected()` paths in `adapters/claude_code.py` → check `security-tiers/SKILL.md` for path documentation
|
|
92
88
|
- Added a new agent definition → check `gaia-patterns/reference.md` for agents table
|
|
93
89
|
- Modified hook enforcement logic → check `security-tiers` and `agent-protocol` references
|
|
94
|
-
- When adding or modifying files in agents/, skills/, hooks/,
|
|
90
|
+
- When adding or modifying files in agents/, skills/, hooks/, config/, bin/, tests/, build/ or the repo root, load Skill('readme-writing') to update the relevant README.md
|
|
95
91
|
|
|
96
92
|
**Format:** In `cross_layer_impacts`, list the doc file and the behavior change, e.g.:
|
|
97
93
|
```
|
|
@@ -80,14 +80,6 @@ SessionStart emits a one-shot `hookSpecificOutput.additionalContext` manifest (E
|
|
|
80
80
|
| `skill-creation/` | Technique | Injected (gaia-system) |
|
|
81
81
|
| `skills/reference.md` | Reference | On-demand (shared security-tiers ref) |
|
|
82
82
|
|
|
83
|
-
### Commands (slash commands)
|
|
84
|
-
|
|
85
|
-
| Command | File | Purpose |
|
|
86
|
-
|---------|------|---------|
|
|
87
|
-
| `/gaia` | `commands/gaia.md` | Invoke gaia meta-agent |
|
|
88
|
-
| `/scan-project` | `commands/scan-project.md` | Scan project, update project context in ~/.gaia/gaia.db |
|
|
89
|
-
| `/gaia-plan` | `commands/gaia-plan.md` | Plan a feature, create brief, decompose into tasks |
|
|
90
|
-
|
|
91
83
|
### Tools (7 subsystems)
|
|
92
84
|
|
|
93
85
|
| Subsystem | Location | Purpose |
|
|
@@ -139,7 +131,7 @@ The package ships a single `gaia` binary (`bin/gaia.js`) that dispatches to Pyth
|
|
|
139
131
|
|
|
140
132
|
| Mode | Package | What ships |
|
|
141
133
|
|------|---------|-----------|
|
|
142
|
-
| `gaia-ops` | `@jaguilar87/gaia` (full) | All hooks, all modules, all agents, all skills, all
|
|
134
|
+
| `gaia-ops` | `@jaguilar87/gaia` (full) | All hooks, all modules, all agents, all skills, all tools, all config |
|
|
143
135
|
| `gaia-security` | `@jaguilar87/gaia` (security dist) | 6 hooks (`pre_tool_use`, `post_tool_use`, `stop_hook`, `user_prompt_submit`, `session_start`, `session_end_hook`), all modules, no agents, no skills, no config |
|
|
144
136
|
|
|
145
137
|
### Detection Cascade (`hooks/modules/core/plugin_mode.py`)
|
|
@@ -159,7 +151,6 @@ The package ships a single `gaia` binary (`bin/gaia.js`) that dispatches to Pyth
|
|
|
159
151
|
| T3 approval | Claude Code native dialog (`permissionDecision: ask`) | Hook blocks with nonce, orchestrator approval flow |
|
|
160
152
|
| Agents | None | 8 agents routed by orchestrator |
|
|
161
153
|
| Skills | None | 24 skills injected per frontmatter |
|
|
162
|
-
| Commands | None | 7 slash commands |
|
|
163
154
|
| PreToolUse matchers | `Bash` only | `Bash`, `Task`, `Agent`, `SendMessage`, multi-tool |
|
|
164
155
|
| File write protection | `_is_protected()` blocks hooks/ and settings*.json for Edit/Write tools | Same -- fires regardless of permissionMode |
|
|
165
156
|
|
|
@@ -206,7 +197,7 @@ npm publish # publishes @jaguilar87/gaia
|
|
|
206
197
|
3. Run `scripts/bootstrap_database.sh` -- seeds the schema (v17), agent rows, and `schema_version`. Fail-loud: any non-zero exit writes `~/.gaia/last-install-error.json` and propagates the error.
|
|
207
198
|
4. Merge permissions, env vars, and agent key into `settings.local.json` (preserves user config).
|
|
208
199
|
5. Merge hooks from `hooks.json` into `settings.local.json` via the consolidated `merge_hooks` step.
|
|
209
|
-
6. Create `.claude/{agents, tools, hooks,
|
|
200
|
+
6. Create `.claude/{agents, tools, hooks, config, skills}` symlinks (5) plus `CHANGELOG.md` file link.
|
|
210
201
|
7. Write `plugin-registry.json` with `installed[].name == "gaia-ops"` (or `gaia-security`).
|
|
211
202
|
8. Verification.
|
|
212
203
|
|
|
@@ -229,8 +220,6 @@ The hook invoker is `python3 <script>` rather than executing the script directly
|
|
|
229
220
|
.claude/agents -> node_modules/@jaguilar87/gaia/agents/
|
|
230
221
|
.claude/tools -> node_modules/@jaguilar87/gaia/tools/
|
|
231
222
|
.claude/hooks -> node_modules/@jaguilar87/gaia/hooks/
|
|
232
|
-
.claude/commands -> node_modules/@jaguilar87/gaia/commands/
|
|
233
|
-
.claude/templates -> node_modules/@jaguilar87/gaia/templates/
|
|
234
223
|
.claude/config -> node_modules/@jaguilar87/gaia/config/
|
|
235
224
|
.claude/skills -> node_modules/@jaguilar87/gaia/skills/
|
|
236
225
|
.claude/CHANGELOG.md (file link) -> node_modules/@jaguilar87/gaia/CHANGELOG.md
|
|
@@ -333,7 +322,6 @@ ln -sf /home/jorge/ws/me/gaia-dev/agents .claude/agents
|
|
|
333
322
|
ln -sf /home/jorge/ws/me/gaia-dev/hooks .claude/hooks
|
|
334
323
|
ln -sf /home/jorge/ws/me/gaia-dev/skills .claude/skills
|
|
335
324
|
ln -sf /home/jorge/ws/me/gaia-dev/tools .claude/tools
|
|
336
|
-
ln -sf /home/jorge/ws/me/gaia-dev/commands .claude/commands
|
|
337
325
|
ln -sf /home/jorge/ws/me/gaia-dev/config .claude/config
|
|
338
326
|
```
|
|
339
327
|
|