@yottagraph-app/aether-instructions 1.1.0 → 1.1.2

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/README.md CHANGED
@@ -16,6 +16,7 @@ To update to the latest version:
16
16
  ```
17
17
 
18
18
  This Cursor command will:
19
+
19
20
  1. Download the latest version of this package
20
21
  2. Replace files in `.cursor/` that are listed in `.cursor/.aether-instructions-manifest`
21
22
  3. Extract fresh files from the package
@@ -32,6 +33,7 @@ by the updater.
32
33
  ### Customizing Rules/Commands
33
34
 
34
35
  To customize something that ships with the package:
36
+
35
37
  1. Copy it to a new filename (a path not listed in the manifest)
36
38
  2. Make your changes to the copy
37
39
  3. Your copy won't be replaced when you run `/update_instructions`
@@ -44,6 +46,7 @@ This package is built from `aether-dev` sources. To publish:
44
46
  2. Run `/publish_instructions --bump patch --publish`
45
47
 
46
48
  The publish command:
49
+
47
50
  - Copies source files to `packages/aether-instructions/` with their original names
48
51
  - Bumps the version
49
52
  - Publishes to npmjs
@@ -59,7 +59,7 @@ Replace the `query_server.url` value in `broadchurch.yaml` with the new URL. The
59
59
 
60
60
  ```yaml
61
61
  query_server:
62
- url: "<NEW_URL>"
62
+ url: '<NEW_URL>'
63
63
  ```
64
64
 
65
65
  Preserve all other content in the file.
@@ -7,6 +7,7 @@ Update Cursor rules, commands, and skills from the `@yottagraph-app/aether-instr
7
7
  This command downloads the latest instructions package and extracts it to your `.cursor/` directory. A manifest file (`.cursor/.aether-instructions-manifest`) tracks which files came from the package so updates only replace package-provided files.
8
8
 
9
9
  **What happens:**
10
+
10
11
  1. Downloads the latest `@yottagraph-app/aether-instructions` package
11
12
  2. Deletes files listed in the existing manifest
12
13
  3. Cleans up any legacy `aether_*` prefixed files from older versions
@@ -27,6 +28,7 @@ cat .cursor/.aether-instructions-version 2>/dev/null || echo "Not installed"
27
28
  ```
28
29
 
29
30
  Report to user:
31
+
30
32
  > Current version: X.Y.Z (or "Not installed")
31
33
 
32
34
  ---
@@ -40,6 +42,7 @@ npm view @yottagraph-app/aether-instructions version
40
42
  ```
41
43
 
42
44
  Compare with current:
45
+
43
46
  - If same version: Ask user if they want to reinstall anyway
44
47
  - If newer version: Proceed with update
45
48
  - If current is newer: Warn user (they may have a pre-release)
@@ -147,7 +150,9 @@ ls -d .cursor/skills/*/ 2>/dev/null | wc -l
147
150
  ```
148
151
 
149
152
  Report to user:
153
+
150
154
  > Updated to @yottagraph-app/aether-instructions@X.Y.Z
155
+ >
151
156
  > - Rules: N files
152
157
  > - Commands: N files
153
158
  > - Skills: N directories
@@ -172,16 +177,19 @@ git commit -m "Update instructions to vX.Y.Z"
172
177
  ### npm pack fails
173
178
 
174
179
  If `npm pack` fails with a registry error:
180
+
175
181
  > Make sure you have network access to npmjs.com. If you're behind a proxy, configure npm: `npm config set proxy <url>`
176
182
 
177
183
  ### Permission denied
178
184
 
179
185
  If you get permission errors:
186
+
180
187
  > Try running with appropriate permissions, or check that `.cursor/` is writable.
181
188
 
182
189
  ### Want to customize a rule or command?
183
190
 
184
191
  If you need to modify a package-provided file:
192
+
185
193
  1. Edit it directly — your changes will persist until the next update
186
194
  2. To preserve changes across updates, copy it to a new name first
187
195
  3. Remove the original's entry from `.cursor/.aether-instructions-manifest` so it won't be deleted on update
@@ -307,10 +307,10 @@ Read the local `.env` file and parse all non-commented, non-empty lines into KEY
307
307
 
308
308
  - Commented-out lines (starting with `#`)
309
309
  - Variables with empty values (e.g., `NUXT_PUBLIC_USER_NAME=`, `NUXT_PUBLIC_QUERY_SERVER_ADDRESS=`)
310
- > **Why skip empty values?** Nuxt's runtime config defaults them to empty strings already.
311
- > The Vercel CLI cannot store truly empty values — it either prompts interactively or
312
- > requires a non-empty string. Using a space or placeholder causes bugs. For example,
313
- > a space in `NUXT_PUBLIC_USER_NAME` bypasses Auth0 login entirely.
310
+ > **Why skip empty values?** Nuxt's runtime config defaults them to empty strings already.
311
+ > The Vercel CLI cannot store truly empty values — it either prompts interactively or
312
+ > requires a non-empty string. Using a space or placeholder causes bugs. For example,
313
+ > a space in `NUXT_PUBLIC_USER_NAME` bypasses Auth0 login entirely.
314
314
 
315
315
  ### Sync Process
316
316
 
package/package.json CHANGED
@@ -1,26 +1,26 @@
1
1
  {
2
- "name": "@yottagraph-app/aether-instructions",
3
- "version": "1.1.0",
4
- "description": "Cursor rules, commands, and skills for Aether development",
5
- "files": [
6
- "rules",
7
- "commands",
8
- "skills"
9
- ],
10
- "repository": {
11
- "type": "git",
12
- "url": "https://github.com/Lovelace-AI/aether-dev.git",
13
- "directory": "packages/aether-instructions"
14
- },
15
- "keywords": [
16
- "cursor",
17
- "aether",
18
- "rules",
19
- "commands",
20
- "skills"
21
- ],
22
- "license": "UNLICENSED",
23
- "publishConfig": {
24
- "access": "public"
25
- }
2
+ "name": "@yottagraph-app/aether-instructions",
3
+ "version": "1.1.2",
4
+ "description": "Cursor rules, commands, and skills for Aether development",
5
+ "files": [
6
+ "rules",
7
+ "commands",
8
+ "skills"
9
+ ],
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/Lovelace-AI/aether-dev.git",
13
+ "directory": "packages/aether-instructions"
14
+ },
15
+ "keywords": [
16
+ "cursor",
17
+ "aether",
18
+ "rules",
19
+ "commands",
20
+ "skills"
21
+ ],
22
+ "license": "UNLICENSED",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ }
26
26
  }
package/rules/agents.mdc CHANGED
@@ -53,12 +53,18 @@ Use `broadchurch_auth` for all Elemental API calls. It lives at
53
53
  `agents/broadchurch_auth.py` and is automatically bundled into each agent
54
54
  directory at deploy time. It handles:
55
55
 
56
- - Reading the API URL from `broadchurch.yaml` (or `ELEMENTAL_API_URL` env var)
57
- - Minting and caching GCP ID tokens in production
58
- - Falling back to `ELEMENTAL_API_TOKEN` for local dev
56
+ - Routing through the Broadchurch Portal gateway proxy in production
57
+ (no direct QS credentials needed the portal handles Auth0 M2M auth)
58
+ - Authenticating to the proxy with a per-tenant API key from
59
+ `broadchurch.yaml` (`gateway.qs_api_key`)
60
+ - Falling back to `ELEMENTAL_API_URL` + `ELEMENTAL_API_TOKEN` env vars
61
+ for local dev
59
62
 
60
63
  ```python
61
- from broadchurch_auth import elemental_client
64
+ try:
65
+ from broadchurch_auth import elemental_client
66
+ except ImportError:
67
+ from .broadchurch_auth import elemental_client
62
68
 
63
69
  def get_schema() -> dict:
64
70
  """Get the yottagraph schema."""
@@ -73,6 +79,10 @@ def find_entities(expression: str, limit: int = 10) -> dict:
73
79
  return resp.json()
74
80
  ```
75
81
 
82
+ The try/except is required because the import path differs between local
83
+ dev (`agents/` on sys.path → absolute import) and Agent Engine runtime
84
+ (code packaged inside an ADK module → relative import).
85
+
76
86
  **Do NOT** hardcode URLs or manually handle auth tokens. Do NOT read
77
87
  `broadchurch.yaml` directly — `broadchurch_auth` handles all of this.
78
88
 
@@ -116,6 +126,16 @@ Select your agent from the dropdown in the web UI. You can also run a single age
116
126
  during local dev (agents/ is the CWD → on sys.path). At deploy time, the
117
127
  workflow copies it into the agent directory alongside `broadchurch.yaml`.
118
128
 
129
+ In production, all Elemental API calls go through the Portal Gateway at
130
+ `{gateway_url}/api/qs/{org_id}/...`. The agent sends `X-Api-Key` (from
131
+ `broadchurch.yaml`) and the portal injects its own Auth0 M2M token
132
+ upstream. This keeps QS credentials out of agents entirely and gives the
133
+ platform a per-tenant kill switch.
134
+
135
+ **Important:** Always use the try/except import pattern shown above. ADK
136
+ wraps agent code in a package at deploy time, so absolute imports fail at
137
+ runtime in Agent Engine — the relative import fallback is required.
138
+
119
139
  ## Deployment
120
140
 
121
141
  Two ways to deploy:
package/rules/api.mdc CHANGED
@@ -135,8 +135,8 @@ See the **cookbook** rule for a full "Get filings for a company" recipe.
135
135
 
136
136
  - **`client.getNEID()`** -- simple single-entity lookup by name
137
137
  (`GET /entities/lookup`). Best for resolving one company/person name.
138
- - **`client.findEntities()`** -- expression-based batch search
139
- (`POST /entities/search`). Best for filtered searches (by type, property,
138
+ - **`client.findEntities()`** -- expression-based search
139
+ (`POST /elemental/find`). Best for filtered searches (by type, property,
140
140
  relationship). See `find.md` for the expression language.
141
141
 
142
142
  ## Error Handling
@@ -1,7 +1,5 @@
1
1
  ---
2
- description: Warns users not to modify aether_ prefixed files in .cursor/
3
- globs:
4
- - .cursor/**/aether_*
2
+ description: Warns users not to modify package-managed instruction files in .cursor/
5
3
  alwaysApply: false
6
4
  ---
7
5
 
@@ -9,40 +7,35 @@ alwaysApply: false
9
7
 
10
8
  **You are editing a file managed by the `@yottagraph-app/aether-instructions` package.**
11
9
 
12
- Files prefixed with `aether_` are automatically installed and updated by the
13
- Aether instructions system. They will be **overwritten** when you run
14
- `/aether_update_instructions`.
10
+ Package-managed files are tracked by `.cursor/.aether-instructions-manifest`.
11
+ They will be **overwritten** when you run `/update_instructions`.
15
12
 
16
13
  ## Do Not
17
14
 
18
- - Modify existing `aether_*` files directly (changes will be lost on update)
19
- - Create new files with the `aether_` prefix (they will be deleted on update)
15
+ - Modify files listed in the manifest directly (changes will be lost on update)
20
16
 
21
17
  ## To Customize
22
18
 
23
- If you need to modify the behavior of an `aether_*` rule or command:
19
+ If you need to modify a package-provided rule or command:
24
20
 
25
- 1. **Copy** the file to a new name **without** the `aether_` prefix
21
+ 1. **Copy** the file to a new name
26
22
  2. Make your changes to the copy
27
- 3. Your copy will not be affected by instruction updates
23
+ 3. Remove the original's entry from `.cursor/.aether-instructions-manifest`
24
+ so it won't be replaced on update
28
25
 
29
26
  Example:
30
27
 
31
28
  ```bash
32
29
  # Copy the rule you want to customize
33
- cp .cursor/rules/aether_api.mdc .cursor/rules/api_custom.mdc
30
+ cp .cursor/rules/api.mdc .cursor/rules/api_custom.mdc
34
31
 
35
- # Edit your copy
36
- # Your customizations in api_custom.mdc are preserved across updates
32
+ # Edit your copy — it won't be affected by instruction updates
37
33
  ```
38
34
 
39
- ## Why This Matters
35
+ ## How It Works
40
36
 
41
- The `aether_` prefix creates a clear namespace:
42
- - **`aether_*` files** = Package-managed, updated automatically
43
- - **Other files** = Your custom rules/commands, never touched
44
-
45
- This allows you to:
46
- - Receive rule updates without losing your customizations
47
- - Know at a glance which files are yours vs. package-provided
48
- - Safely extend the system without conflicts
37
+ - `.cursor/.aether-instructions-manifest` lists every file installed by the
38
+ package (one relative path per line, e.g. `rules/api.mdc`)
39
+ - `/update_instructions` deletes manifest entries, extracts fresh files from
40
+ the latest package, and writes a new manifest
41
+ - Files not in the manifest are never touched