@yottagraph-app/aether-instructions 1.1.42 → 1.1.44

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.
Files changed (38) hide show
  1. package/AGENTS.md +12 -30
  2. package/CLAUDE.md +1 -0
  3. package/README.md +13 -9
  4. package/commands/build_my_app.md +7 -8
  5. package/commands/deploy_agent.md +7 -7
  6. package/commands/update_branding.md +1 -1
  7. package/commands/update_instructions.md +34 -21
  8. package/package.json +4 -5
  9. package/skills/aether/SKILL.md +57 -0
  10. package/{rules/agents-data.mdc → skills/aether/agents-data.md} +3 -6
  11. package/{rules/agents.mdc → skills/aether/agents.md} +42 -28
  12. package/{rules/architecture.mdc → skills/aether/architecture.md} +14 -20
  13. package/{rules/branding.mdc → skills/aether/branding.md} +7 -12
  14. package/{rules/cookbook-data.mdc → skills/aether/cookbook-data.md} +13 -28
  15. package/{rules/cookbook.mdc → skills/aether/cookbook.md} +2 -9
  16. package/{rules/cursor-cloud.mdc → skills/aether/cursor-cloud.md} +1 -6
  17. package/{rules/data.mdc → skills/aether/data.md} +80 -70
  18. package/{rules/deployment.mdc → skills/aether/deployment.md} +1 -6
  19. package/{rules/design.mdc → skills/aether/design.md} +1 -6
  20. package/{rules/env.mdc → skills/aether/env.md} +0 -5
  21. package/{rules/git-support.mdc → skills/aether/git-support.md} +4 -9
  22. package/{rules/instructions_warning.mdc → skills/aether/instructions_warning.md} +12 -13
  23. package/{rules/local-setup.mdc → skills/aether/local-setup.md} +1 -6
  24. package/{rules/mcp-servers.mdc → skills/aether/mcp-servers.md} +3 -7
  25. package/{rules/pref.mdc → skills/aether/pref.md} +9 -14
  26. package/skills/aether/server-data.md +48 -0
  27. package/skills/aether/server.md +60 -0
  28. package/{rules/something-broke.mdc → skills/aether/something-broke.md} +3 -7
  29. package/{rules/server.mdc → skills/aether/storage.md} +78 -108
  30. package/{rules/ui.mdc → skills/aether/ui.md} +2 -6
  31. package/skills/elemental-mcp-patterns/SKILL.md +57 -51
  32. package/variants/mcp-only/commands/build_my_app.md +6 -6
  33. package/variants/mcp-only/{rules/agents-data.mdc → skills/aether/agents-data.md} +0 -6
  34. package/variants/mcp-only/{rules/cookbook-data.mdc → skills/aether/cookbook-data.md} +3 -6
  35. package/variants/mcp-only/{rules/data.mdc → skills/aether/data.md} +1 -6
  36. package/variants/mcp-only/{rules/server-data.mdc → skills/aether/server-data.md} +9 -15
  37. package/rules/server-data.mdc +0 -54
  38. package/rules/storage.mdc +0 -54
package/AGENTS.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # Aether
2
2
 
3
+ **Read first:** [`.cursor/skills/aether/SKILL.md`](.cursor/skills/aether/SKILL.md) — the Aether skill indexes every topic below and is the canonical entry point for any work in this repo.
4
+
3
5
  **Stack:** Nuxt 3 (SPA), Vue 3 Composition API (`<script setup>`), Vuetify 3, TypeScript (required), Auth0.
4
6
 
5
7
  **Structure:** `pages/` (file-based routing), `components/`, `composables/`, `server/api/`, `agents/` (Python ADK), `mcp-servers/` (Python FastMCP).
6
8
 
7
- **Data:** This app runs on the Lovelace platform -- entities, news, filings, sentiment, relationships, events. See the `data` rule for access patterns and gotchas. Skill docs: `skills/data-model/` (entity types, properties, relationships; `SKILL.md` first), `skills/elemental-mcp-patterns/` (MCP response shapes, property type handling, Python patterns for agent tools). Do NOT call external APIs for data the platform provides.
9
+ **Data:** This app runs on the Lovelace platform -- entities, news, filings, sentiment, relationships, events. See [`data.md`](.cursor/skills/aether/data.md) in the `aether` skill for access patterns and gotchas. Additional skill docs: `skills/data-model/` (entity types, properties, relationships; `SKILL.md` first), `skills/elemental-mcp-patterns/` (MCP response shapes, property type handling, Python patterns for agent tools). Do NOT call external APIs for data the platform provides.
8
10
 
9
- **Storage:** KV (Upstash Redis) for preferences and lightweight state via `Pref<T>` from `usePrefsStore()`. Neon Postgres for relational data if connected (see the `storage` rule).
11
+ **Storage:** KV (Upstash Redis) for preferences and lightweight state via `Pref<T>` from `usePrefsStore()`. Neon Postgres for relational data if connected (see [`storage.md`](.cursor/skills/aether/storage.md) in the `aether` skill).
10
12
 
11
13
  **Source of truth:** `DESIGN.md` -- read before starting work, update when changing features. The starter UI is placeholder -- replace freely. Feature docs in `design/` for implementation planning.
12
14
 
@@ -14,44 +16,24 @@
14
16
 
15
17
  **First action for a new project:** Run `/build_my_app`.
16
18
 
17
- ## Task-specific rules
18
-
19
- Conditional rules, loaded based on what you're doing:
20
-
21
- - `architecture` — project structure, navigation, server routes, agents, MCP
22
- - `data` — Elemental API / data access patterns and gotchas
23
- - `cookbook` — copy-paste UI patterns
24
- - `cookbook-data` — data-fetching recipes
25
- - `design` — DESIGN.md workflow, feature docs
26
- - `ui` — page templates, layout patterns
27
- - `pref` — KV preferences
28
- - `branding` — colors, fonts
29
- - `server` — Nitro routes, Neon Postgres usage
30
- - `server-data` — server-side Elemental API from routes
31
- - `storage` — KV vs Neon availability and selection
32
- - `agents` — ADK agents
33
- - `agents-data` — agents calling Elemental API
34
- - `mcp-servers` — FastMCP server development
35
- - `deployment` — app, agent, and MCP server deployment
36
- - `env` — `.env` variable reference
37
- - `local-setup` — manual local dev setup
38
- - `cursor-cloud` — Cursor Cloud environment quirks
39
- - `git-support` — commit workflow and pre-commit troubleshooting
40
- - `something-broke` — error recovery, build failures
19
+ ## Task-specific topics
20
+
21
+ The `aether` skill (`.cursor/skills/aether/SKILL.md`) covers architecture, data, UI cookbook, agents, MCP servers, deployment, env, storage, troubleshooting, and more. Read `SKILL.md` first; it's a short index that points you to the specific topic file you need.
41
22
 
42
23
  ## Environment
43
24
 
44
- Detect your runtime once at startup, then read the matching rule:
25
+ Detect your runtime once at startup, then read the matching topic in the `aether` skill:
45
26
 
46
- - **Cursor Cloud** if `$HOME` starts with `/root` or `/home/ubuntu`, OR `uname -s` reports `Linux` in a container-shaped path, OR a "Dev Server" terminal was auto-started from `.cursor/environment.json`. → Read the `cursor-cloud` rule.
47
- - **Local dev** if `$HOME` is under `/Users/…` (macOS) or a normal Linux/Windows user home, and no "Dev Server" terminal is auto-running. → If `.env` and `node_modules/` are present, you're set up; otherwise read the `local-setup` rule.
27
+ - **Cursor Cloud** if `$HOME` starts with `/root` or `/home/ubuntu`, OR `uname -s` reports `Linux` in a container-shaped path, OR a "Dev Server" terminal was auto-started from `.cursor/environment.json`. → Read [`cursor-cloud.md`](.cursor/skills/aether/cursor-cloud.md).
28
+ - **Local dev** if `$HOME` is under `/Users/…` (macOS) or a normal Linux/Windows user home, and no "Dev Server" terminal is auto-running. → If `.env` and `node_modules/` are present, you're set up; otherwise read [`local-setup.md`](.cursor/skills/aether/local-setup.md).
48
29
 
49
30
  This check is cheap and only needs to run once per session.
50
31
 
51
32
  ### Cursor instructions (`.cursor/`)
52
33
 
53
- Cursor rules, commands, and skills are installed from the
34
+ Cursor commands and skills are installed from the
54
35
  `@yottagraph-app/aether-instructions` npm package during project init.
36
+ `.cursor/skills/aether/` is the main Aether skill.
55
37
  `.cursor/skills/elemental-api/` contains API skill documentation (endpoint
56
38
  reference, types, usage patterns). `.cursor/skills/data-model/` contains
57
39
  Lovelace data model documentation (entity types, schemas per fetch source).
package/CLAUDE.md ADDED
@@ -0,0 +1 @@
1
+ @AGENTS.md
package/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # @yottagraph-app/aether-instructions
2
2
 
3
- Cursor rules, commands, and skills for Aether development.
3
+ Cursor commands and skills for Aether development.
4
+
5
+ The core Aether guidance (architecture, data, UI, agents, MCP servers,
6
+ deployment, etc.) ships as the **`aether` skill** under `skills/aether/`,
7
+ with a `SKILL.md` entry point that indexes the topic files.
4
8
 
5
9
  ## Usage
6
10
 
@@ -19,18 +23,18 @@ This Cursor command will:
19
23
 
20
24
  1. Download the latest version of this package
21
25
  2. Replace files in `.cursor/` that are listed in `.cursor/.aether-instructions-manifest`
22
- 3. Extract fresh files from the package
23
- 4. Commit the changes
26
+ 3. Remove the deprecated `.cursor/rules/` directory if present (rules were replaced by the `aether` skill)
27
+ 4. Extract fresh files from the package
28
+ 5. Commit the changes
24
29
 
25
30
  ### File Naming Convention
26
31
 
27
- Package files keep their original names under `.cursor/rules/`,
28
- `.cursor/commands/`, and `.cursor/skills/`. Which paths are owned by the
29
- package is recorded in `.cursor/.aether-instructions-manifest`. Only those
30
- paths are overwritten on update; other files under `.cursor/` are not touched
31
- by the updater.
32
+ Package files keep their original names under `.cursor/commands/` and
33
+ `.cursor/skills/`. Which paths are owned by the package is recorded in
34
+ `.cursor/.aether-instructions-manifest`. Only those paths are overwritten on
35
+ update; other files under `.cursor/` are not touched by the updater.
32
36
 
33
- ### Customizing Rules/Commands
37
+ ### Customizing Commands or Skill Topics
34
38
 
35
39
  To customize something that ships with the package:
36
40
 
@@ -102,17 +102,16 @@ Then read these files to understand what's available:
102
102
 
103
103
  1. `DESIGN.md` -- project vision and current status
104
104
  2. `broadchurch.yaml` -- project config (name, gateway URL, etc.)
105
- 3. **The `data` cursor rule** -- this is critical. It describes the Query Server, the platform's primary data source. Build against platform APIs, not external sources.
106
- 4. **`.cursor/skills/`** — Each subdirectory is one skill. List them, open each skills entry (usually `SKILL.md`) and follow its structure to learn what is documented (APIs, schemas, helpers, etc.).
107
- 5. `.cursor/rules/` -- scan rule names to know what other patterns are available
105
+ 3. **The `aether` skill's `data.md` topic** (`.cursor/skills/aether/data.md`) this is critical. It describes the Query Server, the platform's primary data source. Build against platform APIs, not external sources.
106
+ 4. **`.cursor/skills/`** — Each subdirectory is one skill. Start with `.cursor/skills/aether/SKILL.md` — it's the index for every Aether topic (architecture, data, UI, agents, MCP, deployment, etc.). Then open each other skill's entry (usually `SKILL.md`) and follow its structure to learn what is documented (APIs, schemas, helpers, etc.).
108
107
 
109
- **Important: Use the platform's data.** This app runs on the Lovelace platform, which provides a Query Server with entities, news, filings, sentiment, relationships, events, and more. Read the `data` rule and the skills under `.cursor/skills/` to understand what data is available. Use `getSchema()` to discover entity types and properties at runtime.
108
+ **Important: Use the platform's data.** This app runs on the Lovelace platform, which provides a Query Server with entities, news, filings, sentiment, relationships, events, and more. Read [`data.md`](../skills/aether/data.md) in the `aether` skill and the other skills under `.cursor/skills/` to understand what data is available. Use `getSchema()` to discover entity types and properties at runtime.
110
109
 
111
110
  Key capabilities:
112
111
 
113
- - **Query Server / Elemental API** -- the primary data source. Use `useElementalClient()` from `@yottagraph-app/elemental-api/client`. See the `data` rule.
114
- - **KV storage** -- always available for preferences and lightweight data (see `pref` rule)
115
- - **Neon Postgres** -- check if `DATABASE_URL` is in `.env` for database access (see `server` rule)
112
+ - **Query Server / Elemental API** -- the primary data source. Use `useElementalClient()` from `@yottagraph-app/elemental-api/client`. See [`data.md`](../skills/aether/data.md) in the `aether` skill.
113
+ - **KV storage** -- always available for preferences and lightweight data (see [`pref.md`](../skills/aether/pref.md) in the `aether` skill)
114
+ - **Neon Postgres** -- may be available for relational data; see [`storage.md`](../skills/aether/storage.md) in the `aether` skill for how to check and how to use it
116
115
  - **AI agent chat** -- use the `useAgentChat` composable to build a chat UI for deployed agents
117
116
  - **MCP servers** -- Lovelace MCP servers may be available (check `.cursor/mcp.json`)
118
117
  - **Components** -- Vuetify 3 component library is available
@@ -191,7 +190,7 @@ Implement the plan:
191
190
  2. Extract reusable components into `components/`
192
191
  3. Put shared logic in `composables/`
193
192
  4. If the app needs navigation, add it to `app.vue` or to individual pages
194
- 5. Use `Pref<T>` for any persisted settings (see `pref.mdc`)
193
+ 5. Use `Pref<T>` for any persisted settings (see [`pref.md`](../skills/aether/pref.md) in the `aether` skill)
195
194
  6. Use Vuetify components and the project's dark theme
196
195
  7. Update `DESIGN.md` with what you built
197
196
 
@@ -52,7 +52,7 @@ ls -d agents/*/
52
52
  > └── requirements.txt
53
53
  > ```
54
54
  >
55
- > See the `agents.mdc` rule for guidance on writing ADK agents.
55
+ > See [`agents.md`](../skills/aether/agents.md) in the `aether` skill for guidance on writing ADK agents.
56
56
 
57
57
  Stop here.
58
58
 
@@ -118,12 +118,12 @@ curl -sf -X POST "<GATEWAY_URL>/api/projects/<ORG_ID>/deploy" \
118
118
 
119
119
  ```json
120
120
  {
121
- "ok": true,
122
- "method": "cloud-build",
123
- "build_id": "...",
124
- "log_url": "https://console.cloud.google.com/cloud-build/builds/...",
125
- "target": "agents/<name>",
126
- "repo": "<owner>/<repo>"
121
+ "ok": true,
122
+ "method": "cloud-build",
123
+ "build_id": "...",
124
+ "log_url": "https://console.cloud.google.com/cloud-build/builds/...",
125
+ "target": "agents/<name>",
126
+ "repo": "<owner>/<repo>"
127
127
  }
128
128
  ```
129
129
 
@@ -68,4 +68,4 @@ Compare logo and asset files in `public/` against the skill's `assets/` director
68
68
 
69
69
  ## Step 6: Commit
70
70
 
71
- Follow the `git-support.mdc` workflow to commit the changes.
71
+ Follow the [`git-support.md`](../skills/aether/git-support.md) workflow in the `aether` skill to commit the changes.
@@ -1,6 +1,6 @@
1
1
  # Update Instructions
2
2
 
3
- Update Cursor rules, commands, and skills from the `@yottagraph-app/aether-instructions` npm package.
3
+ Update Cursor commands and skills from the `@yottagraph-app/aether-instructions` npm package.
4
4
 
5
5
  ## Overview
6
6
 
@@ -10,9 +10,10 @@ This command downloads the latest instructions package and extracts it to your `
10
10
 
11
11
  1. Downloads the latest `@yottagraph-app/aether-instructions` package
12
12
  2. Deletes files listed in the existing manifest
13
- 3. Extracts fresh files from the package
14
- 4. Writes a new manifest
15
- 5. Commits the changes
13
+ 3. Removes the deprecated `.cursor/rules/` directory if present (rules were replaced by the `aether` skill)
14
+ 4. Extracts fresh files from the package
15
+ 5. Writes a new manifest
16
+ 6. Commits the changes
16
17
 
17
18
  **Your files are safe:** Only paths listed in the manifest are removed before reinstall. Other files under `.cursor/` are left alone.
18
19
 
@@ -71,7 +72,7 @@ The extracted content is in `$TEMP_DIR/package/`.
71
72
 
72
73
  ## Step 4: Delete Previously Installed Files
73
74
 
74
- Read the manifest and delete listed paths. **Skip blank lines** — an empty `rel` would run `rm -rf ".cursor/"` and wipe the whole directory. Entries prefixed with `root/` point at files at the repo root (currently just `AGENTS.md`); only remove **regular files** there, never directories.
75
+ Read the manifest and delete listed paths. **Skip blank lines** — an empty `rel` would run `rm -rf ".cursor/"` and wipe the whole directory. Entries prefixed with `root/` point at files at the repo root (currently `AGENTS.md` and `CLAUDE.md`); only remove **regular files** there, never directories.
75
76
 
76
77
  ```bash
77
78
  if [ -f .cursor/.aether-instructions-manifest ]; then
@@ -91,6 +92,12 @@ if [ -f .cursor/.aether-instructions-manifest ]; then
91
92
  fi
92
93
  ```
93
94
 
95
+ Also remove the deprecated `.cursor/rules/` directory (superseded by the `aether` skill in `.cursor/skills/aether/`):
96
+
97
+ ```bash
98
+ rm -rf .cursor/rules
99
+ ```
100
+
94
101
  ---
95
102
 
96
103
  ## Step 5: Copy New Files
@@ -98,21 +105,21 @@ fi
98
105
  Create directories if needed:
99
106
 
100
107
  ```bash
101
- mkdir -p .cursor/rules .cursor/commands .cursor/skills
108
+ mkdir -p .cursor/commands .cursor/skills
102
109
  ```
103
110
 
104
111
  Copy files from the extracted package:
105
112
 
106
113
  ```bash
107
- cp "$TEMP_DIR/package/rules/"* .cursor/rules/ 2>/dev/null || true
108
114
  cp "$TEMP_DIR/package/commands/"* .cursor/commands/ 2>/dev/null || true
109
115
  cp -r "$TEMP_DIR/package/skills/"* .cursor/skills/ 2>/dev/null || true
110
116
  ```
111
117
 
112
- Copy the root-level AGENTS.md from the package to the tenant repo root, if the package ships one:
118
+ Copy the root-level AGENTS.md and CLAUDE.md from the package to the tenant repo root, if the package ships them. `CLAUDE.md` is a one-line `@AGENTS.md` pointer so Claude Code imports the same instructions Cursor reads from `AGENTS.md`:
113
119
 
114
120
  ```bash
115
121
  [ -f "$TEMP_DIR/package/AGENTS.md" ] && cp "$TEMP_DIR/package/AGENTS.md" ./AGENTS.md
122
+ [ -f "$TEMP_DIR/package/CLAUDE.md" ] && cp "$TEMP_DIR/package/CLAUDE.md" ./CLAUDE.md
116
123
  ```
117
124
 
118
125
  ### Data-mode variant overlay
@@ -122,14 +129,17 @@ If this project uses **mcp-only** (or another non-default mode), re-apply the sa
122
129
  ```bash
123
130
  MODE=$(tr -d '\n' < .cursor/.aether-data-mode 2>/dev/null || echo "api-mcp")
124
131
  PKG="$TEMP_DIR/package"
125
- if [ "$MODE" != "api-mcp" ] && [ -d "$PKG/variants/$MODE/rules" ]; then
126
- cp "$PKG/variants/$MODE/rules/"* .cursor/rules/ 2>/dev/null || true
127
- fi
128
132
  if [ "$MODE" != "api-mcp" ] && [ -d "$PKG/variants/$MODE/commands" ]; then
129
133
  cp "$PKG/variants/$MODE/commands/"* .cursor/commands/ 2>/dev/null || true
130
134
  fi
131
135
  if [ "$MODE" != "api-mcp" ] && [ -d "$PKG/variants/$MODE/skills" ]; then
132
- cp -r "$PKG/variants/$MODE/skills/"* .cursor/skills/ 2>/dev/null || true
136
+ # Overlay per-file so default skill topics survive
137
+ for src_dir in "$PKG/variants/$MODE/skills/"*/; do
138
+ [ -d "$src_dir" ] || continue
139
+ dir_name=$(basename "$src_dir")
140
+ mkdir -p ".cursor/skills/$dir_name"
141
+ cp "$src_dir"* ".cursor/skills/$dir_name/" 2>/dev/null || true
142
+ done
133
143
  fi
134
144
  if [ "$MODE" = "mcp-only" ]; then
135
145
  rm -rf .cursor/skills/elemental-api
@@ -146,14 +156,14 @@ Build a manifest of all installed files (one relative path per line). **Do not**
146
156
 
147
157
  ```bash
148
158
  {
149
- for f in .cursor/rules/*.mdc; do [ -f "$f" ] && echo "rules/$(basename "$f")"; done
150
159
  for f in .cursor/commands/*.md; do [ -f "$f" ] && echo "commands/$(basename "$f")"; done
151
160
  for d in .cursor/skills/*/; do [ -d "$d" ] && echo "skills/$(basename "$d")"; done
152
161
  [ -f "$TEMP_DIR/package/AGENTS.md" ] && [ -f ./AGENTS.md ] && echo "root/AGENTS.md"
162
+ [ -f "$TEMP_DIR/package/CLAUDE.md" ] && [ -f ./CLAUDE.md ] && echo "root/CLAUDE.md"
153
163
  } > .cursor/.aether-instructions-manifest
154
164
  ```
155
165
 
156
- If the repo uses **bash** for this loop and a glob might match nothing, run `shopt -s nullglob` first so the loops dont treat `*.mdc` as a literal filename.
166
+ If the repo uses **bash** for this loop and a glob might match nothing, run `shopt -s nullglob` first so the loops don't treat `*.md` as a literal filename.
157
167
 
158
168
  Write the version marker:
159
169
 
@@ -179,7 +189,6 @@ Count what was installed:
179
189
 
180
190
  ```bash
181
191
  wc -l < .cursor/.aether-instructions-manifest
182
- ls .cursor/rules/*.mdc 2>/dev/null | wc -l
183
192
  ls .cursor/commands/*.md 2>/dev/null | wc -l
184
193
  ls -d .cursor/skills/*/ 2>/dev/null | wc -l
185
194
  ```
@@ -188,7 +197,6 @@ Report to user:
188
197
 
189
198
  > Updated to @yottagraph-app/aether-instructions@X.Y.Z
190
199
  >
191
- > - Rules: N files
192
200
  > - Commands: N files
193
201
  > - Skills: N directories
194
202
 
@@ -199,13 +207,16 @@ Report to user:
199
207
  Commit the updated instruction files. A root `.gitignore` rule like `skills/` can **ignore** `.cursor/skills/`; if `git add .cursor/skills/` reports ignored paths, force-add:
200
208
 
201
209
  ```bash
202
- git add .cursor/rules/ .cursor/commands/ .cursor/.aether-instructions-version .cursor/.aether-instructions-manifest
210
+ git add .cursor/commands/ .cursor/.aether-instructions-version .cursor/.aether-instructions-manifest
203
211
  git add -f .cursor/skills/
204
212
  [ -f AGENTS.md ] && git add AGENTS.md
213
+ [ -f CLAUDE.md ] && git add CLAUDE.md
214
+ # Remove the legacy rules dir from tracking if it was committed in an earlier install
215
+ git rm -rf --cached --ignore-unmatch .cursor/rules 2>/dev/null || true
205
216
  git commit -m "Update instructions to vX.Y.Z"
206
217
  ```
207
218
 
208
- Use the repos commit convention if applicable (e.g. `[Agent commit] Update instructions to vX.Y.Z`).
219
+ Use the repo's commit convention if applicable (e.g. `[Agent commit] Update instructions to vX.Y.Z`).
209
220
 
210
221
  > Changes committed. Your instructions are now up to date.
211
222
 
@@ -225,13 +236,15 @@ If you get permission errors:
225
236
 
226
237
  > Try running with appropriate permissions, or check that `.cursor/` is writable.
227
238
 
228
- ### Want to customize a rule, command, or AGENTS.md?
239
+ ### Want to customize a command, skill topic, or AGENTS.md?
229
240
 
230
- If you need to modify a package-provided file (including the root `AGENTS.md`):
241
+ If you need to modify a package-provided file (including the root `AGENTS.md` or `CLAUDE.md`):
231
242
 
232
243
  1. Edit it directly — your changes will persist until the next update
233
244
  2. To preserve changes across updates, copy it to a new name first (e.g. `cp AGENTS.md AGENTS.local.md`)
234
- 3. Remove the original's entry from `.cursor/.aether-instructions-manifest` so it won't be deleted on update (for `AGENTS.md`, remove the `root/AGENTS.md` line)
245
+ 3. Remove the original's entry from `.cursor/.aether-instructions-manifest` so it won't be deleted on update (for `AGENTS.md`, remove the `root/AGENTS.md` line; for `CLAUDE.md`, remove `root/CLAUDE.md`)
246
+
247
+ `CLAUDE.md` ships as a one-line `@AGENTS.md` pointer — Claude Code imports `AGENTS.md` via that syntax, so in most cases you only need to edit `AGENTS.md`.
235
248
 
236
249
  ### Blank line in manifest deleted `.cursor/`
237
250
 
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@yottagraph-app/aether-instructions",
3
- "version": "1.1.42",
4
- "description": "Cursor rules, commands, and skills for Aether development",
3
+ "version": "1.1.44",
4
+ "description": "Cursor commands and skills for Aether development",
5
5
  "files": [
6
- "rules",
7
6
  "commands",
8
7
  "skills",
9
8
  "variants",
10
- "AGENTS.md"
9
+ "AGENTS.md",
10
+ "CLAUDE.md"
11
11
  ],
12
12
  "repository": {
13
13
  "type": "git",
@@ -17,7 +17,6 @@
17
17
  "keywords": [
18
18
  "cursor",
19
19
  "aether",
20
- "rules",
21
20
  "commands",
22
21
  "skills"
23
22
  ],
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: aether
3
+ description: Aether app conventions, architecture, data access, UI patterns, agents, MCP servers, deployment, env, storage. Read first for any work in an Aether repo.
4
+ ---
5
+
6
+ # Aether Skill
7
+
8
+ Aether is an app framework built on Nuxt 3 + Vue 3 + Vuetify 3 + TypeScript,
9
+ running on the Lovelace platform (entities, news, filings, sentiment,
10
+ relationships, events). It follows standard Nuxt conventions -- pages in
11
+ `pages/`, components in `components/`, composables in `composables/`, server
12
+ routes in `server/api/`. Auth0 is wired in automatically. Apps can also
13
+ contain ADK **agents** (`agents/`, deployed to Vertex AI Agent Engine) and
14
+ **MCP servers** (`mcp-servers/`, deployed to Cloud Run) that deploy
15
+ independently from the web app.
16
+
17
+ This skill is the single entry point for conventions, architecture, and
18
+ copy-paste patterns. Read this file first, then follow the links below for
19
+ the specific topic you need.
20
+
21
+ ## How to Use This Skill
22
+
23
+ **Always read this `SKILL.md` file whenever you are working on any code in
24
+ an Aether tenant project.** It is the index of what guidance is available to you.
25
+
26
+ Do _not_ read every topic file up front. Instead, once you've read this
27
+ index, use the "When to read" column in the table below to decide which
28
+ specific topic files are relevant to the task in front of you, and read
29
+ only those. Re-consult this index whenever the task shifts (e.g. from
30
+ pages to agents, or from data access to deployment) to pick up any new
31
+ topics that apply.
32
+
33
+ ## Files
34
+
35
+ | File | When to read |
36
+ | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
37
+ | [architecture.md](architecture.md) | Project structure, navigation, server routes, agents, MCP. Read when adding pages, navigation, or server-side functionality. |
38
+ | [data.md](data.md) | How this app reads platform data (clients, schema discovery, entity/news/filings access, common gotchas). Read when building any feature that fetches or displays platform data. |
39
+ | [cookbook.md](cookbook.md) | Copy-paste UI patterns for common pages: data table, form, chart, dialog, master-detail. For data-fetching recipes see `cookbook-data.md`. |
40
+ | [cookbook-data.md](cookbook-data.md) | Data-fetching UI recipes: entity search, news feed, filings, and related helpers. Read with `data.md` when building pages that display platform data. |
41
+ | [design.md](design.md) | `DESIGN.md` workflow, feature docs, starter-app-is-placeholder guidance. Read when starting work, planning features, or updating project design. |
42
+ | [ui.md](ui.md) | Vue/Vuetify page templates, layouts, scrollable content, data tables, loading states. Applies when creating or editing page templates (`pages/**`, `components/**`). |
43
+ | [pref.md](pref.md) | User preferences and KV storage: `usePrefsStore`, `Pref<T>`, app namespacing (`NUXT_PUBLIC_APP_ID`). Read when working on settings persistence. |
44
+ | [branding.md](branding.md) | Visual styling, colors, typography, theming, branding, UI appearance. Read when updating brand assets or theme code. |
45
+ | [server.md](server.md) | Nitro server-side API routes (`server/**`): file-based routing, event handlers, image proxy. Read when adding server routes. For storage backends see `storage.md`; for platform-data proxying see `server-data.md`. |
46
+ | [server-data.md](server-data.md) | Reading platform data from Nitro server routes (`server/**`). Read when a server route needs to fetch platform data on behalf of the app. |
47
+ | [storage.md](storage.md) | Storage backends: KV (always on) vs Neon Postgres (if provisioned). Read when choosing persistence, wiring `getRedis()`/`getDb()`, creating tables, or handling missing credentials gracefully. |
48
+ | [agents.md](agents.md) | Conventions for developing ADK agents in `agents/**`. Read when writing or editing agent code. |
49
+ | [agents-data.md](agents-data.md) | How ADK agents access platform data (authentication, local testing env vars, mode-specific wiring). Read when an agent needs platform data (`agents/**`). |
50
+ | [mcp-servers.md](mcp-servers.md) | Conventions for developing MCP servers in `mcp-servers/**`. Read when writing or editing FastMCP servers. |
51
+ | [deployment.md](deployment.md) | App, agent, and MCP server deployment targets (Vercel, Vertex AI Agent Engine, Cloud Run). Read when pushing to main, running `/deploy_agent` or `/deploy_mcp`, or explaining how code reaches production. |
52
+ | [env.md](env.md) | `.env` variable reference (`APP_ID`, `USER_NAME`, `QUERY_SERVER_ADDRESS`, etc.). Read when adding env vars, configuring Auth0 bypass, or inspecting runtime config. |
53
+ | [local-setup.md](local-setup.md) | Manual local dev setup (`npm run init -- --local`, `npm run dev`). Read when running the app locally outside Cursor Cloud. |
54
+ | [cursor-cloud.md](cursor-cloud.md) | Cursor Cloud environment quirks (Node managed by env, dev server auto-started, skip browser testing during initial setup). Read when `$HOME` is under `/root` or `/home/ubuntu`, or when a dev-server terminal was auto-started. |
55
+ | [git-support.md](git-support.md) | Git commit workflow and conventions. Read when finishing implementation work, making commits, or troubleshooting git/pre-commit failures. |
56
+ | [something-broke.md](something-broke.md) | Error recovery and build failure troubleshooting. Read when something broke, build failed, `npm run build` errors, or the user wants to restore previous behavior. |
57
+ | [instructions_warning.md](instructions_warning.md) | Warning about editing `.cursor/` files managed by `@yottagraph-app/aether-instructions`. Read before modifying installed instruction files. |
@@ -1,9 +1,3 @@
1
- ---
2
- description: "ADK agents calling the Elemental API via broadchurch_auth and local testing env vars."
3
- alwaysApply: false
4
- globs: agents/**
5
- ---
6
-
7
1
  # Agents: Elemental API (Query Server)
8
2
 
9
3
  ## Connecting to the Elemental API
@@ -46,12 +40,14 @@ dev (`agents/` on sys.path → absolute import) and Agent Engine runtime
46
40
  `broadchurch.yaml` directly — `broadchurch_auth` handles all of this.
47
41
 
48
42
  Key endpoints:
43
+
49
44
  - `GET /elemental/metadata/schema` — entity types and properties
50
45
  - `POST /elemental/find` — search for entities by expression
51
46
  - `POST /entities/search` — search for entities by name (batch, scored)
52
47
  - `POST /elemental/entities/properties` — get entity property values
53
48
 
54
49
  Requirements for agents using the Elemental API (add to `requirements.txt`):
50
+
55
51
  ```
56
52
  google-auth>=2.20.0
57
53
  pyyaml>=6.0
@@ -160,6 +156,7 @@ def _get_mcp_url(server_name: str = "elemental") -> str:
160
156
  ```
161
157
 
162
158
  For **local dev**, set the env var:
159
+
163
160
  ```bash
164
161
  export ELEMENTAL_MCP_URL="https://mcp.news.prod.g.lovelace.ai/elemental/mcp"
165
162
  ```
@@ -1,9 +1,3 @@
1
- ---
2
- description: Rules for developing ADK agents in the agents/ directory
3
- globs: agents/**
4
- alwaysApply: false
5
- ---
6
-
7
1
  # Agent Development (Google ADK)
8
2
 
9
3
  This project supports developing and deploying AI agents alongside the UI. Agents live in the `agents/` directory and deploy to Vertex AI Agent Engine via the `/deploy_agent` command.
@@ -49,14 +43,15 @@ root_agent = Agent(
49
43
  ```
50
44
 
51
45
  Key rules:
46
+
52
47
  - The `agent.py` file MUST export a variable named `root_agent`
53
48
  - Tool functions should have detailed docstrings -- the LLM reads these to understand when and how to use each tool
54
49
  - Use `google-adk` for the agent framework, `httpx` for HTTP calls
55
50
  - Pin dependency versions in `requirements.txt` for reproducible deployments
56
51
 
57
52
  For agents that call the **Elemental API** (`broadchurch_auth`, endpoints,
58
- local `ELEMENTAL_*` env vars), see the `agents-data` rule. For agents
59
- using **Elemental MCP tools**, the `agents-data` rule also covers
53
+ local `ELEMENTAL_*` env vars), see [agents-data.md](agents-data.md) in this skill. For agents
54
+ using **Elemental MCP tools**, [agents-data.md](agents-data.md) also covers
60
55
  `McpToolset` wiring — use `StreamableHTTPConnectionParams` (not
61
56
  `SseConnectionParams`) and read the `elemental-mcp-patterns` skill for
62
57
  response handling patterns.
@@ -160,17 +155,18 @@ The response includes an `agents` array:
160
155
 
161
156
  Each agent entry has:
162
157
 
163
- | Field | Type | Description |
164
- |---|---|---|
165
- | `name` | `string` | Agent directory name (e.g. `filing_analyst`) |
166
- | `display_name` | `string` | Human-readable name for the UI |
167
- | `engine_id` | `string` | Vertex AI Agent Engine resource ID — used as `{agentId}` in query/stream URLs |
158
+ | Field | Type | Description |
159
+ | -------------- | -------- | ----------------------------------------------------------------------------- |
160
+ | `name` | `string` | Agent directory name (e.g. `filing_analyst`) |
161
+ | `display_name` | `string` | Human-readable name for the UI |
162
+ | `engine_id` | `string` | Vertex AI Agent Engine resource ID — used as `{agentId}` in query/stream URLs |
168
163
 
169
164
  The `engine_id` is the key value — it becomes the `{agentId}` path
170
165
  parameter in `/api/agent/{agentId}/stream` (the local Nitro route) and
171
166
  the portal's `/authorize` endpoint.
172
167
 
173
168
  **How agents get populated:** The portal discovers agents from two sources:
169
+
174
170
  1. **Firestore** — agents registered by the deploy workflow (`deploy-agent.yml`
175
171
  calls `POST /api/agents/{tenantId}` to register)
176
172
  2. **Agent Engine API** — the portal also queries Vertex AI for reasoning
@@ -226,9 +222,26 @@ A typical stream for an agent that uses a tool:
226
222
 
227
223
  ```json
228
224
  [
229
- { "content": { "parts": [{ "functionCall": { "name": "search", "args": {"q": "AAPL 8-K"} } }], "role": "model" } },
230
- { "content": { "parts": [{ "functionResponse": { "name": "search", "response": {"results": ["..."]} } }], "role": "tool" } },
231
- { "content": { "parts": [{ "text": "Here is the summary of the 8-K filing..." }], "role": "model" } }
225
+ {
226
+ "content": {
227
+ "parts": [{ "functionCall": { "name": "search", "args": { "q": "AAPL 8-K" } } }],
228
+ "role": "model"
229
+ }
230
+ },
231
+ {
232
+ "content": {
233
+ "parts": [
234
+ { "functionResponse": { "name": "search", "response": { "results": ["..."] } } }
235
+ ],
236
+ "role": "tool"
237
+ }
238
+ },
239
+ {
240
+ "content": {
241
+ "parts": [{ "text": "Here is the summary of the 8-K filing..." }],
242
+ "role": "model"
243
+ }
244
+ }
232
245
  ]
233
246
  ```
234
247
 
@@ -259,13 +272,13 @@ automatically.
259
272
 
260
273
  SSE event types:
261
274
 
262
- | Event | Data Shape | Description |
263
- |---|---|---|
264
- | `text` | `{ "text": "..." }` | Agent text output (replaces previous text) |
265
- | `function_call` | `{ "name": "...", "args": {...} }` | Agent is calling a tool |
266
- | `function_response` | `{ "name": "...", "response": {...} }` | Tool returned a result |
267
- | `error` | `{ "message": "...", "code": "..." }` | Error during processing (`code` is `PERMISSION_DENIED` for IAM failures) |
268
- | `done` | `{ "session_id": "...", "text": "..." }` | Stream complete with final text |
275
+ | Event | Data Shape | Description |
276
+ | ------------------- | ---------------------------------------- | ------------------------------------------------------------------------ |
277
+ | `text` | `{ "text": "..." }` | Agent text output (replaces previous text) |
278
+ | `function_call` | `{ "name": "...", "args": {...} }` | Agent is calling a tool |
279
+ | `function_response` | `{ "name": "...", "response": {...} }` | Tool returned a result |
280
+ | `error` | `{ "message": "...", "code": "..." }` | Error during processing (`code` is `PERMISSION_DENIED` for IAM failures) |
281
+ | `done` | `{ "session_id": "...", "text": "..." }` | Stream complete with final text |
269
282
 
270
283
  For custom agent UIs that need streaming, import `readSSE`:
271
284
 
@@ -299,14 +312,14 @@ to the original plain object are invisible to the template.
299
312
  // WRONG — local ref bypasses Vue's reactivity, UI won't update:
300
313
  const msg: ChatMessage = { id: '...', role: 'agent', text: '', streaming: true };
301
314
  messages.value.push(msg);
302
- msg.text = 'hello'; // data changes, but Vue doesn't know
303
- msg.streaming = false; // template still shows typing indicator
315
+ msg.text = 'hello'; // data changes, but Vue doesn't know
316
+ msg.streaming = false; // template still shows typing indicator
304
317
 
305
318
  // CORRECT — access through the reactive array:
306
319
  messages.value.push({ id: '...', role: 'agent', text: '', streaming: true });
307
320
  const idx = messages.value.length - 1;
308
- messages.value[idx].text = 'hello'; // Vue detects this
309
- messages.value[idx].streaming = false; // template re-renders
321
+ messages.value[idx].text = 'hello'; // Vue detects this
322
+ messages.value[idx].streaming = false; // template re-renders
310
323
  ```
311
324
 
312
325
  The `useAgentChat` composable uses the correct pattern internally (via an
@@ -349,7 +362,7 @@ agents (MCP or REST-backed):
349
362
 
350
363
  This applies to ADK agent tools, where the LLM reads tool output directly.
351
364
  MCP server tools follow different conventions (structured dicts/lists) — see
352
- the `mcp-servers` rule.
365
+ [mcp-servers.md](mcp-servers.md).
353
366
 
354
367
  The agent's LLM will try to interpret whatever the tool returns. Raw API
355
368
  responses with nested dicts, numeric IDs, and arrays of unlabeled values
@@ -472,6 +485,7 @@ Passing a raw `McpToolset` as the agent's only tool source and writing a
472
485
  long system prompt does **not** satisfy the spec.
473
486
 
474
487
  `McpToolset` passthrough means:
488
+
475
489
  - The LLM receives raw JSON responses — no Markdown formatting, no
476
490
  human-readable reports
477
491
  - No session-state caching — repeated queries for the same entity make