@yottagraph-app/aether-instructions 1.1.42 → 1.1.43
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/AGENTS.md +12 -30
- package/README.md +13 -9
- package/commands/build_my_app.md +7 -8
- package/commands/deploy_agent.md +7 -7
- package/commands/update_branding.md +1 -1
- package/commands/update_instructions.md +25 -17
- package/package.json +2 -4
- package/skills/aether/SKILL.md +57 -0
- package/{rules/agents-data.mdc → skills/aether/agents-data.md} +3 -6
- package/{rules/agents.mdc → skills/aether/agents.md} +42 -28
- package/{rules/architecture.mdc → skills/aether/architecture.md} +14 -20
- package/{rules/branding.mdc → skills/aether/branding.md} +7 -12
- package/{rules/cookbook-data.mdc → skills/aether/cookbook-data.md} +13 -28
- package/{rules/cookbook.mdc → skills/aether/cookbook.md} +2 -9
- package/{rules/cursor-cloud.mdc → skills/aether/cursor-cloud.md} +1 -6
- package/{rules/data.mdc → skills/aether/data.md} +80 -70
- package/{rules/deployment.mdc → skills/aether/deployment.md} +1 -6
- package/{rules/design.mdc → skills/aether/design.md} +1 -6
- package/{rules/env.mdc → skills/aether/env.md} +0 -5
- package/{rules/git-support.mdc → skills/aether/git-support.md} +4 -9
- package/{rules/instructions_warning.mdc → skills/aether/instructions_warning.md} +6 -12
- package/{rules/local-setup.mdc → skills/aether/local-setup.md} +1 -6
- package/{rules/mcp-servers.mdc → skills/aether/mcp-servers.md} +3 -7
- package/{rules/pref.mdc → skills/aether/pref.md} +9 -14
- package/skills/aether/server-data.md +48 -0
- package/skills/aether/server.md +60 -0
- package/{rules/something-broke.mdc → skills/aether/something-broke.md} +3 -7
- package/{rules/server.mdc → skills/aether/storage.md} +78 -108
- package/{rules/ui.mdc → skills/aether/ui.md} +2 -6
- package/skills/elemental-mcp-patterns/SKILL.md +57 -51
- package/variants/mcp-only/commands/build_my_app.md +6 -6
- package/variants/mcp-only/{rules/agents-data.mdc → skills/aether/agents-data.md} +0 -6
- package/variants/mcp-only/{rules/cookbook-data.mdc → skills/aether/cookbook-data.md} +3 -6
- package/variants/mcp-only/{rules/data.mdc → skills/aether/data.md} +1 -6
- package/variants/mcp-only/{rules/server-data.mdc → skills/aether/server-data.md} +9 -15
- package/rules/server-data.mdc +0 -54
- 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 `
|
|
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 `
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# @yottagraph-app/aether-instructions
|
|
2
2
|
|
|
3
|
-
Cursor
|
|
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.
|
|
23
|
-
4.
|
|
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/
|
|
28
|
-
`.cursor/
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
37
|
+
### Customizing Commands or Skill Topics
|
|
34
38
|
|
|
35
39
|
To customize something that ships with the package:
|
|
36
40
|
|
package/commands/build_my_app.md
CHANGED
|
@@ -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
|
|
106
|
-
4. **`.cursor/skills/`** — Each subdirectory is one skill.
|
|
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 `
|
|
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 `
|
|
114
|
-
- **KV storage** -- always available for preferences and lightweight data (see `pref`
|
|
115
|
-
- **Neon Postgres** --
|
|
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.
|
|
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
|
|
package/commands/deploy_agent.md
CHANGED
|
@@ -52,7 +52,7 @@ ls -d agents/*/
|
|
|
52
52
|
> └── requirements.txt
|
|
53
53
|
> ```
|
|
54
54
|
>
|
|
55
|
-
> See
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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.
|
|
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
|
|
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.
|
|
14
|
-
4.
|
|
15
|
-
5.
|
|
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
|
|
|
@@ -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,13 +105,12 @@ fi
|
|
|
98
105
|
Create directories if needed:
|
|
99
106
|
|
|
100
107
|
```bash
|
|
101
|
-
mkdir -p .cursor/
|
|
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
|
```
|
|
@@ -122,14 +128,17 @@ If this project uses **mcp-only** (or another non-default mode), re-apply the sa
|
|
|
122
128
|
```bash
|
|
123
129
|
MODE=$(tr -d '\n' < .cursor/.aether-data-mode 2>/dev/null || echo "api-mcp")
|
|
124
130
|
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
131
|
if [ "$MODE" != "api-mcp" ] && [ -d "$PKG/variants/$MODE/commands" ]; then
|
|
129
132
|
cp "$PKG/variants/$MODE/commands/"* .cursor/commands/ 2>/dev/null || true
|
|
130
133
|
fi
|
|
131
134
|
if [ "$MODE" != "api-mcp" ] && [ -d "$PKG/variants/$MODE/skills" ]; then
|
|
132
|
-
|
|
135
|
+
# Overlay per-file so default skill topics survive
|
|
136
|
+
for src_dir in "$PKG/variants/$MODE/skills/"*/; do
|
|
137
|
+
[ -d "$src_dir" ] || continue
|
|
138
|
+
dir_name=$(basename "$src_dir")
|
|
139
|
+
mkdir -p ".cursor/skills/$dir_name"
|
|
140
|
+
cp "$src_dir"* ".cursor/skills/$dir_name/" 2>/dev/null || true
|
|
141
|
+
done
|
|
133
142
|
fi
|
|
134
143
|
if [ "$MODE" = "mcp-only" ]; then
|
|
135
144
|
rm -rf .cursor/skills/elemental-api
|
|
@@ -146,14 +155,13 @@ Build a manifest of all installed files (one relative path per line). **Do not**
|
|
|
146
155
|
|
|
147
156
|
```bash
|
|
148
157
|
{
|
|
149
|
-
for f in .cursor/rules/*.mdc; do [ -f "$f" ] && echo "rules/$(basename "$f")"; done
|
|
150
158
|
for f in .cursor/commands/*.md; do [ -f "$f" ] && echo "commands/$(basename "$f")"; done
|
|
151
159
|
for d in .cursor/skills/*/; do [ -d "$d" ] && echo "skills/$(basename "$d")"; done
|
|
152
160
|
[ -f "$TEMP_DIR/package/AGENTS.md" ] && [ -f ./AGENTS.md ] && echo "root/AGENTS.md"
|
|
153
161
|
} > .cursor/.aether-instructions-manifest
|
|
154
162
|
```
|
|
155
163
|
|
|
156
|
-
If the repo uses **bash** for this loop and a glob might match nothing, run `shopt -s nullglob` first so the loops don
|
|
164
|
+
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
165
|
|
|
158
166
|
Write the version marker:
|
|
159
167
|
|
|
@@ -179,7 +187,6 @@ Count what was installed:
|
|
|
179
187
|
|
|
180
188
|
```bash
|
|
181
189
|
wc -l < .cursor/.aether-instructions-manifest
|
|
182
|
-
ls .cursor/rules/*.mdc 2>/dev/null | wc -l
|
|
183
190
|
ls .cursor/commands/*.md 2>/dev/null | wc -l
|
|
184
191
|
ls -d .cursor/skills/*/ 2>/dev/null | wc -l
|
|
185
192
|
```
|
|
@@ -188,7 +195,6 @@ Report to user:
|
|
|
188
195
|
|
|
189
196
|
> Updated to @yottagraph-app/aether-instructions@X.Y.Z
|
|
190
197
|
>
|
|
191
|
-
> - Rules: N files
|
|
192
198
|
> - Commands: N files
|
|
193
199
|
> - Skills: N directories
|
|
194
200
|
|
|
@@ -199,13 +205,15 @@ Report to user:
|
|
|
199
205
|
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
206
|
|
|
201
207
|
```bash
|
|
202
|
-
git add .cursor/
|
|
208
|
+
git add .cursor/commands/ .cursor/.aether-instructions-version .cursor/.aether-instructions-manifest
|
|
203
209
|
git add -f .cursor/skills/
|
|
204
210
|
[ -f AGENTS.md ] && git add AGENTS.md
|
|
211
|
+
# Remove the legacy rules dir from tracking if it was committed in an earlier install
|
|
212
|
+
git rm -rf --cached --ignore-unmatch .cursor/rules 2>/dev/null || true
|
|
205
213
|
git commit -m "Update instructions to vX.Y.Z"
|
|
206
214
|
```
|
|
207
215
|
|
|
208
|
-
Use the repo
|
|
216
|
+
Use the repo's commit convention if applicable (e.g. `[Agent commit] Update instructions to vX.Y.Z`).
|
|
209
217
|
|
|
210
218
|
> Changes committed. Your instructions are now up to date.
|
|
211
219
|
|
|
@@ -225,7 +233,7 @@ If you get permission errors:
|
|
|
225
233
|
|
|
226
234
|
> Try running with appropriate permissions, or check that `.cursor/` is writable.
|
|
227
235
|
|
|
228
|
-
### Want to customize a
|
|
236
|
+
### Want to customize a command, skill topic, or AGENTS.md?
|
|
229
237
|
|
|
230
238
|
If you need to modify a package-provided file (including the root `AGENTS.md`):
|
|
231
239
|
|
package/package.json
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yottagraph-app/aether-instructions",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "Cursor
|
|
3
|
+
"version": "1.1.43",
|
|
4
|
+
"description": "Cursor commands and skills for Aether development",
|
|
5
5
|
"files": [
|
|
6
|
-
"rules",
|
|
7
6
|
"commands",
|
|
8
7
|
"skills",
|
|
9
8
|
"variants",
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
"keywords": [
|
|
18
17
|
"cursor",
|
|
19
18
|
"aether",
|
|
20
|
-
"rules",
|
|
21
19
|
"commands",
|
|
22
20
|
"skills"
|
|
23
21
|
],
|
|
@@ -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
|
|
59
|
-
using **Elemental MCP tools**,
|
|
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
|
|
164
|
-
|
|
165
|
-
| `name`
|
|
166
|
-
| `display_name` | `string` | Human-readable name for the UI
|
|
167
|
-
| `engine_id`
|
|
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
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
|
263
|
-
|
|
264
|
-
| `text`
|
|
265
|
-
| `function_call`
|
|
266
|
-
| `function_response` | `{ "name": "...", "response": {...} }`
|
|
267
|
-
| `error`
|
|
268
|
-
| `done`
|
|
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';
|
|
303
|
-
msg.streaming = false;
|
|
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';
|
|
309
|
-
messages.value[idx].streaming = false;
|
|
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
|
-
|
|
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
|