atris 2.2.0 → 2.2.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.
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: atris
3
+ description: Codebase intelligence — generates structured navigation maps with file:line references so agents stop re-scanning the same files every session. Use when exploring code, answering "where is X?", or onboarding to a new codebase.
4
+ version: 1.1.0
5
+ requires:
6
+ bins:
7
+ - rg
8
+ tags:
9
+ - developer-tools
10
+ - codebase-navigation
11
+ - token-optimization
12
+ - code-map
13
+ - context-management
14
+ ---
15
+
16
+ # Atris — Codebase Intelligence
17
+
18
+ Maintain a structured map of the codebase with exact file:line references. One scan, permanent knowledge. Saves 80-95% of tokens on code exploration.
19
+
20
+ ## Scope
21
+
22
+ - Use in any repo where you need to navigate code.
23
+ - Creates `atris/MAP.md` as the single navigation index.
24
+
25
+ ## MAP-first rule
26
+
27
+ Before searching for anything in the codebase:
28
+
29
+ 1. Read `atris/MAP.md`
30
+ 2. Found your keyword → go directly to file:line. Done.
31
+ 3. Not found → search once with `rg`, then **add the result to MAP.md**
32
+
33
+ The map gets smarter every time you use it. Never let a discovery go unrecorded.
34
+
35
+ ## First time setup
36
+
37
+ If `atris/MAP.md` doesn't exist, generate it:
38
+
39
+ 1. Create `atris/` folder in the project root
40
+ 2. Scan the codebase (rules below)
41
+ 3. Write the result to `atris/MAP.md`
42
+ 4. Tell the user: "Built your codebase map at atris/MAP.md."
43
+
44
+ If `atris/MAP.md` already exists, use it. Regenerate only if the user requests it or the map is clearly stale (references missing files, line numbers way off).
45
+
46
+ ## How to scan
47
+
48
+ Skip: `node_modules`, `.git`, `dist`, `build`, `vendor`, `__pycache__`, `.venv`, `.env*`, `*.key`, `*.pem`, `credentials*`, `secrets*`
49
+
50
+ Use ripgrep to extract structure:
51
+
52
+ ```bash
53
+ # Key definitions
54
+ rg "^(export|function|class|const|def |async def |router\.|app\.|@app\.)" --line-number -g "!node_modules" -g "!.git" -g "!dist" -g "!.env*"
55
+
56
+ # Route definitions
57
+ rg "(get|post|put|delete|patch)\s*\(" --line-number -g "*.ts" -g "*.js" -g "*.py"
58
+
59
+ # Entry points
60
+ rg "listen|createServer|app\.start|if __name__" --line-number
61
+ ```
62
+
63
+ ## MAP.md structure
64
+
65
+ ```markdown
66
+ # MAP.md — [Project Name] Navigation Guide
67
+
68
+ > Generated by Atris | Last updated: YYYY-MM-DD
69
+
70
+ ## Quick Reference
71
+
72
+ rg "functionName" path/to/file.ext # Description (line N)
73
+ rg "className" path/to/file.ext # Description (line N)
74
+ ```
75
+
76
+ Extract the top 15-25 most important symbols: entry points, exports, route handlers, main classes, config loaders.
77
+
78
+ ### By-Feature Map
79
+
80
+ Group code by what it does. Every reference includes exact file path and line numbers.
81
+
82
+ ```markdown
83
+ ### Feature: User Authentication
84
+ **Purpose:** Login, registration, token management
85
+ - **Entry:** `src/auth/login.ts:45-89` (handleLogin)
86
+ - **Validation:** `src/auth/validate.ts:12-67` (validateToken)
87
+ - **Model:** `src/models/user.ts:8-34` (User schema)
88
+ - **Routes:** `src/routes/auth.ts:5-28` (POST /login, POST /register)
89
+ ```
90
+
91
+ ### By-Concern Map
92
+
93
+ Group by cross-cutting patterns (error handling, logging, auth middleware, etc).
94
+
95
+ ### Critical Files
96
+
97
+ Flag high-impact files with why they matter and key functions with line numbers.
98
+
99
+ ### Entry Points
100
+
101
+ How execution flows — dev server startup, request lifecycle, build pipeline.
102
+
103
+ ## Keeping it fresh
104
+
105
+ Update MAP.md surgically when the codebase changes:
106
+
107
+ - **New file** → add to relevant section
108
+ - **Moved/renamed** → update all references
109
+ - **New important function** → add to Quick Reference
110
+ - **Deleted file** → remove from map
111
+ - **Major refactor** → regenerate affected sections
112
+
113
+ Small updates, not full regeneration. The map evolves with the code.
114
+
115
+ ## Anti-patterns
116
+
117
+ - Searching without checking MAP first
118
+ - Letting discoveries go unrecorded
119
+ - Regenerating the full map when a surgical update would do
120
+ - Including secrets, credentials, or .env files in the map
121
+ - Guessing file locations instead of using the index
@@ -1,13 +1,12 @@
1
1
  ---
2
2
  name: copy-editor
3
- description: Detects AI writing patterns and fixes them. Use when reviewing any written output, including docs, READMEs, messages, PRDs. Based on Wikipedia's AI Cleanup patterns.
4
- triggers:
5
- - copy edit
6
- - review writing
7
- - humanize
8
- - deslopper
9
- - ai patterns
10
- - make it sound human
3
+ description: Detects AI writing patterns and fixes them. Use when reviewing any written output, including docs, READMEs, messages, PRDs. Based on Wikipedia's AI Cleanup patterns. Triggers on "copy edit", "review writing", "humanize", "deslopper", "ai patterns", "make it sound human".
4
+ version: 1.0.0
5
+ tags:
6
+ - copy-editor
7
+ - writing
8
+ - anti-slop
9
+ - quality
11
10
  ---
12
11
 
13
12
  # Copy Editor: Remove AI Writing Patterns
@@ -1,7 +1,11 @@
1
1
  ---
2
- name: atris-design
2
+ name: design
3
3
  description: Frontend aesthetics policy. Use when building UI, components, landing pages, dashboards, or any frontend work. Prevents generic ai-generated look.
4
+ version: 1.0.0
4
5
  allowed-tools: Read, Write, Edit, Bash, Glob
6
+ tags:
7
+ - design
8
+ - frontend
5
9
  ---
6
10
 
7
11
  # atris-design
@@ -0,0 +1,363 @@
1
+ ---
2
+ name: drive
3
+ description: Google Drive integration via AtrisOS API. Browse, search, read, upload files and work with Google Sheets. Use when user asks about Drive, files, docs, sheets, or spreadsheets.
4
+ version: 1.1.0
5
+ tags:
6
+ - drive
7
+ - backend
8
+ - google-drive
9
+ - sheets
10
+ ---
11
+
12
+ # Drive Agent
13
+
14
+ > Drop this in `~/.claude/skills/drive/SKILL.md` and Claude Code becomes your Google Drive assistant.
15
+
16
+ ## Bootstrap (ALWAYS Run First)
17
+
18
+ Before any Drive operation, run this bootstrap to ensure everything is set up:
19
+
20
+ ```bash
21
+ #!/bin/bash
22
+ set -e
23
+
24
+ # 1. Check if atris CLI is installed
25
+ if ! command -v atris &> /dev/null; then
26
+ echo "Installing atris CLI..."
27
+ npm install -g atris
28
+ fi
29
+
30
+ # 2. Check if logged in to AtrisOS
31
+ if [ ! -f ~/.atris/credentials.json ]; then
32
+ echo "Not logged in to AtrisOS."
33
+ echo ""
34
+ echo "Option 1 (interactive): Run 'atris login' and follow prompts"
35
+ echo "Option 2 (non-interactive): Get token from https://atris.ai/auth/cli"
36
+ echo " Then run: atris login --token YOUR_TOKEN"
37
+ echo ""
38
+ exit 1
39
+ fi
40
+
41
+ # 3. Extract token
42
+ if command -v node &> /dev/null; then
43
+ TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
44
+ elif command -v python3 &> /dev/null; then
45
+ TOKEN=$(python3 -c "import json,os; print(json.load(open(os.path.expanduser('~/.atris/credentials.json')))['token'])")
46
+ elif command -v jq &> /dev/null; then
47
+ TOKEN=$(jq -r '.token' ~/.atris/credentials.json)
48
+ else
49
+ echo "Error: Need node, python3, or jq to read credentials"
50
+ exit 1
51
+ fi
52
+
53
+ # 4. Check Google Drive connection status
54
+ STATUS=$(curl -s "https://api.atris.ai/api/integrations/google-drive/status" \
55
+ -H "Authorization: Bearer $TOKEN")
56
+
57
+ if echo "$STATUS" | grep -q "Token expired\|Not authenticated"; then
58
+ echo "Token expired. Please re-authenticate:"
59
+ echo " Run: atris login --force"
60
+ exit 1
61
+ fi
62
+
63
+ if command -v node &> /dev/null; then
64
+ CONNECTED=$(node -e "try{console.log(JSON.parse('$STATUS').connected||false)}catch(e){console.log(false)}")
65
+ elif command -v python3 &> /dev/null; then
66
+ CONNECTED=$(echo "$STATUS" | python3 -c "import sys,json; print(json.load(sys.stdin).get('connected', False))")
67
+ else
68
+ CONNECTED=$(echo "$STATUS" | jq -r '.connected // false')
69
+ fi
70
+
71
+ if [ "$CONNECTED" != "true" ] && [ "$CONNECTED" != "True" ]; then
72
+ echo "Google Drive not connected. Getting authorization URL..."
73
+ AUTH=$(curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/start" \
74
+ -H "Authorization: Bearer $TOKEN" \
75
+ -H "Content-Type: application/json" \
76
+ -d '{}')
77
+
78
+ if command -v node &> /dev/null; then
79
+ URL=$(node -e "try{console.log(JSON.parse('$AUTH').auth_url||'')}catch(e){console.log('')}")
80
+ elif command -v python3 &> /dev/null; then
81
+ URL=$(echo "$AUTH" | python3 -c "import sys,json; print(json.load(sys.stdin).get('auth_url', ''))")
82
+ else
83
+ URL=$(echo "$AUTH" | jq -r '.auth_url // empty')
84
+ fi
85
+
86
+ echo ""
87
+ echo "Open this URL to connect your Google Drive:"
88
+ echo "$URL"
89
+ echo ""
90
+ echo "After authorizing, run your command again."
91
+ exit 0
92
+ fi
93
+
94
+ echo "Ready. Google Drive is connected."
95
+ export ATRIS_TOKEN="$TOKEN"
96
+ ```
97
+
98
+ ---
99
+
100
+ ## API Reference
101
+
102
+ Base: `https://api.atris.ai/api/integrations`
103
+
104
+ All requests require: `-H "Authorization: Bearer $TOKEN"`
105
+
106
+ ### Get Token (after bootstrap)
107
+ ```bash
108
+ TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
109
+ ```
110
+
111
+ ### List Shared Drives
112
+ ```bash
113
+ curl -s "https://api.atris.ai/api/integrations/google-drive/shared-drives" \
114
+ -H "Authorization: Bearer $TOKEN"
115
+ ```
116
+
117
+ Returns all shared/team drives the user has access to with `id` and `name`.
118
+
119
+ ### List Files
120
+ ```bash
121
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files?page_size=20" \
122
+ -H "Authorization: Bearer $TOKEN"
123
+ ```
124
+
125
+ **List files in a folder:**
126
+ ```bash
127
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files?folder_id=FOLDER_ID&page_size=20" \
128
+ -H "Authorization: Bearer $TOKEN"
129
+ ```
130
+
131
+ **List files in a shared drive:**
132
+ ```bash
133
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files?shared_drive_id=DRIVE_ID&page_size=20" \
134
+ -H "Authorization: Bearer $TOKEN"
135
+ ```
136
+
137
+ **NOTE:** All file operations (list, search, get, download, export) automatically include shared drive files. Use `shared_drive_id` only to scope results to a specific shared drive.
138
+
139
+ ### Search Files
140
+ ```bash
141
+ curl -s "https://api.atris.ai/api/integrations/google-drive/search?q=quarterly+report&page_size=20" \
142
+ -H "Authorization: Bearer $TOKEN"
143
+ ```
144
+
145
+ Simple queries search by file name. For advanced queries, use Drive query syntax:
146
+ - `name contains 'budget'` — name search
147
+ - `mimeType = 'application/vnd.google-apps.spreadsheet'` — only sheets
148
+ - `mimeType = 'application/vnd.google-apps.document'` — only docs
149
+ - `modifiedTime > '2026-01-01'` — recently modified
150
+
151
+ ### Get File Metadata
152
+ ```bash
153
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files/{file_id}" \
154
+ -H "Authorization: Bearer $TOKEN"
155
+ ```
156
+
157
+ ### Download File
158
+ ```bash
159
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files/{file_id}/download" \
160
+ -H "Authorization: Bearer $TOKEN"
161
+ ```
162
+
163
+ Returns base64-encoded content. For Google Docs/Sheets/Slides, use export instead.
164
+
165
+ ### Export Google Docs/Sheets/Slides
166
+ ```bash
167
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files/{file_id}/export?mime_type=text/plain" \
168
+ -H "Authorization: Bearer $TOKEN"
169
+ ```
170
+
171
+ **Export formats:**
172
+ - `text/plain` — plain text (default, good for Docs)
173
+ - `text/html` — HTML
174
+ - `application/pdf` — PDF
175
+ - `text/csv` — CSV (for Sheets)
176
+
177
+ ### Upload File
178
+ ```bash
179
+ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/files" \
180
+ -H "Authorization: Bearer $TOKEN" \
181
+ -H "Content-Type: application/json" \
182
+ -d '{
183
+ "name": "notes.txt",
184
+ "content": "File content here",
185
+ "mime_type": "text/plain"
186
+ }'
187
+ ```
188
+
189
+ **Upload to a specific folder:**
190
+ ```bash
191
+ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/files" \
192
+ -H "Authorization: Bearer $TOKEN" \
193
+ -H "Content-Type: application/json" \
194
+ -d '{
195
+ "name": "report.txt",
196
+ "content": "File content here",
197
+ "mime_type": "text/plain",
198
+ "folder_id": "FOLDER_ID"
199
+ }'
200
+ ```
201
+
202
+ ---
203
+
204
+ ## Google Sheets
205
+
206
+ Full read/write access to Google Sheets.
207
+
208
+ ### Get Spreadsheet Info
209
+ ```bash
210
+ curl -s "https://api.atris.ai/api/integrations/google-drive/sheets/{spreadsheet_id}" \
211
+ -H "Authorization: Bearer $TOKEN"
212
+ ```
213
+
214
+ Returns sheet names, title, and metadata.
215
+
216
+ ### Read Cells
217
+ ```bash
218
+ curl -s "https://api.atris.ai/api/integrations/google-drive/sheets/{spreadsheet_id}/values?range=Sheet1" \
219
+ -H "Authorization: Bearer $TOKEN"
220
+ ```
221
+
222
+ **Range uses A1 notation:**
223
+ - `Sheet1` — entire sheet
224
+ - `Sheet1!A1:D10` — specific range
225
+ - `Sheet1!A:A` — entire column A
226
+ - `Sheet1!1:1` — entire row 1
227
+
228
+ ### Update Cells
229
+ ```bash
230
+ curl -s -X PUT "https://api.atris.ai/api/integrations/google-drive/sheets/{spreadsheet_id}/values" \
231
+ -H "Authorization: Bearer $TOKEN" \
232
+ -H "Content-Type: application/json" \
233
+ -d '{
234
+ "range": "Sheet1!A1:B2",
235
+ "values": [
236
+ ["Name", "Score"],
237
+ ["Alice", 95]
238
+ ]
239
+ }'
240
+ ```
241
+
242
+ ### Append Rows
243
+ ```bash
244
+ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/sheets/{spreadsheet_id}/append" \
245
+ -H "Authorization: Bearer $TOKEN" \
246
+ -H "Content-Type: application/json" \
247
+ -d '{
248
+ "range": "Sheet1",
249
+ "values": [
250
+ ["Bob", 88],
251
+ ["Carol", 92]
252
+ ]
253
+ }'
254
+ ```
255
+
256
+ ---
257
+
258
+ ## Workflows
259
+
260
+ ### "Find a file in my Drive"
261
+ 1. Run bootstrap
262
+ 2. Search: `GET /google-drive/search?q=QUERY`
263
+ 3. Display: name, type, modified date for each result
264
+
265
+ ### "Read a Google Doc"
266
+ 1. Run bootstrap
267
+ 2. Search for the doc: `GET /google-drive/search?q=DOC_NAME`
268
+ 3. Export as text: `GET /google-drive/files/{id}/export?mime_type=text/plain`
269
+ 4. Display content
270
+
271
+ ### "Read a spreadsheet"
272
+ 1. Run bootstrap
273
+ 2. Search for the sheet: `GET /google-drive/search?q=SHEET_NAME`
274
+ 3. Get sheet info: `GET /google-drive/sheets/{id}` (to see sheet names)
275
+ 4. Read values: `GET /google-drive/sheets/{id}/values?range=Sheet1`
276
+ 5. Display as a table
277
+
278
+ ### "Add rows to a spreadsheet"
279
+ 1. Run bootstrap
280
+ 2. Find the sheet
281
+ 3. Read current data to understand the columns: `GET /google-drive/sheets/{id}/values?range=Sheet1!1:1`
282
+ 4. **Show user what will be appended, get approval**
283
+ 5. Append: `POST /google-drive/sheets/{id}/append`
284
+
285
+ ### "Browse a shared drive"
286
+ 1. Run bootstrap
287
+ 2. List shared drives: `GET /google-drive/shared-drives`
288
+ 3. Display drive names and IDs
289
+ 4. List files in chosen drive: `GET /google-drive/files?shared_drive_id=DRIVE_ID`
290
+
291
+ ### "Find a file across all drives"
292
+ 1. Run bootstrap
293
+ 2. Search: `GET /google-drive/search?q=QUERY` (automatically searches My Drive + all shared drives)
294
+ 3. Display results
295
+
296
+ ### "Upload a file to Drive"
297
+ 1. Run bootstrap
298
+ 2. Read the local file content
299
+ 3. **Confirm with user**: "Upload {filename} to Drive?"
300
+ 4. Upload: `POST /google-drive/files` with `{name, content, mime_type}`
301
+
302
+ ---
303
+
304
+ ## Error Handling
305
+
306
+ | Error | Meaning | Solution |
307
+ |-------|---------|----------|
308
+ | `Token expired` | AtrisOS session expired | Run `atris login` |
309
+ | `Google Drive not connected` | OAuth not completed | Re-run bootstrap |
310
+ | `401 Unauthorized` | Invalid/expired token | Run `atris login` |
311
+ | `400 Drive not connected` | No Drive credentials | Complete OAuth via bootstrap |
312
+ | `429 Rate limited` | Too many requests | Wait 60s, retry |
313
+ | `Invalid grant` | Google revoked access | Re-connect via bootstrap |
314
+
315
+ ---
316
+
317
+ ## Security Model
318
+
319
+ 1. **Local token** (`~/.atris/credentials.json`): Your AtrisOS auth token, stored locally with 600 permissions.
320
+ 2. **Drive credentials**: Google Drive refresh token is stored **server-side** in AtrisOS encrypted vault.
321
+ 3. **Access control**: AtrisOS API enforces that you can only access your own Drive.
322
+ 4. **OAuth scopes**: Only requests necessary Drive permissions (read, write files).
323
+ 5. **HTTPS only**: All API communication encrypted in transit.
324
+
325
+ ---
326
+
327
+ ## Quick Reference
328
+
329
+ ```bash
330
+ # Setup (one time)
331
+ npm install -g atris && atris login
332
+
333
+ # Get token
334
+ TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
335
+
336
+ # Check connection
337
+ curl -s "https://api.atris.ai/api/integrations/google-drive/status" -H "Authorization: Bearer $TOKEN"
338
+
339
+ # List shared drives
340
+ curl -s "https://api.atris.ai/api/integrations/google-drive/shared-drives" -H "Authorization: Bearer $TOKEN"
341
+
342
+ # List files (includes shared drive files)
343
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files" -H "Authorization: Bearer $TOKEN"
344
+
345
+ # Search files
346
+ curl -s "https://api.atris.ai/api/integrations/google-drive/search?q=budget" -H "Authorization: Bearer $TOKEN"
347
+
348
+ # Read a Google Doc as text
349
+ curl -s "https://api.atris.ai/api/integrations/google-drive/files/{file_id}/export?mime_type=text/plain" -H "Authorization: Bearer $TOKEN"
350
+
351
+ # Read a spreadsheet
352
+ curl -s "https://api.atris.ai/api/integrations/google-drive/sheets/{id}/values?range=Sheet1" -H "Authorization: Bearer $TOKEN"
353
+
354
+ # Append rows to a sheet
355
+ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/sheets/{id}/append" \
356
+ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
357
+ -d '{"range":"Sheet1","values":[["Alice",95]]}'
358
+
359
+ # Upload a file
360
+ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/files" \
361
+ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
362
+ -d '{"name":"notes.txt","content":"Hello world","mime_type":"text/plain"}'
363
+ ```
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  name: email-agent
3
3
  description: Gmail integration via AtrisOS API. Read, send, archive emails. Use when user asks about email, inbox, or wants to send/check messages.
4
+ version: 1.1.0
5
+ tags:
6
+ - email-agent
7
+ - backend
8
+ - email
4
9
  ---
5
10
 
6
11
  # Email Agent
@@ -166,6 +171,58 @@ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/send" \
166
171
  }'
167
172
  ```
168
173
 
174
+ ### Drafts
175
+
176
+ **List drafts:**
177
+ ```bash
178
+ curl -s "https://api.atris.ai/api/integrations/gmail/drafts?max_results=20" \
179
+ -H "Authorization: Bearer $TOKEN"
180
+ ```
181
+
182
+ **Read a draft:**
183
+ ```bash
184
+ curl -s "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}" \
185
+ -H "Authorization: Bearer $TOKEN"
186
+ ```
187
+
188
+ **Create a draft:**
189
+ ```bash
190
+ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/drafts" \
191
+ -H "Authorization: Bearer $TOKEN" \
192
+ -H "Content-Type: application/json" \
193
+ -d '{
194
+ "to": "recipient@example.com",
195
+ "subject": "Subject line",
196
+ "body": "Draft body text"
197
+ }'
198
+ ```
199
+
200
+ Supports same fields as send: `cc`, `bcc`, `attachments`, plus `thread_id` to attach to an existing thread.
201
+
202
+ **Update a draft:**
203
+ ```bash
204
+ curl -s -X PUT "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}" \
205
+ -H "Authorization: Bearer $TOKEN" \
206
+ -H "Content-Type: application/json" \
207
+ -d '{
208
+ "to": "recipient@example.com",
209
+ "subject": "Updated subject",
210
+ "body": "Updated body"
211
+ }'
212
+ ```
213
+
214
+ **Send a draft:**
215
+ ```bash
216
+ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}/send" \
217
+ -H "Authorization: Bearer $TOKEN"
218
+ ```
219
+
220
+ **Delete a draft:**
221
+ ```bash
222
+ curl -s -X DELETE "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}" \
223
+ -H "Authorization: Bearer $TOKEN"
224
+ ```
225
+
169
226
  ### Archive Email
170
227
  ```bash
171
228
  # Single message
@@ -214,6 +271,25 @@ curl -s -X DELETE "https://api.atris.ai/api/integrations/gmail" \
214
271
  4. **Show user what will be archived, get approval**
215
272
  5. Batch archive: `POST /batch-archive`
216
273
 
274
+ ### "Show my drafts"
275
+ 1. Run bootstrap
276
+ 2. List drafts: `GET /gmail/drafts?max_results=20`
277
+ 3. Display: to, subject, snippet for each
278
+
279
+ ### "Draft an email to X about Y"
280
+ 1. Run bootstrap
281
+ 2. Compose email content
282
+ 3. **Show user the draft for review**
283
+ 4. On approval: `POST /gmail/drafts` with `{to, subject, body}`
284
+ 5. Confirm: "Draft saved! You can find it in Gmail."
285
+
286
+ ### "Send draft about X"
287
+ 1. Run bootstrap
288
+ 2. List drafts: `GET /gmail/drafts`
289
+ 3. Find matching draft by subject/recipient
290
+ 4. **Show user the draft content, confirm they want to send it**
291
+ 5. Send: `POST /gmail/drafts/{draft_id}/send`
292
+
217
293
  ### "Archive all from [sender]"
218
294
  1. Run bootstrap
219
295
  2. Search: `GET /messages?query=from:{sender}`
@@ -285,4 +361,16 @@ curl -s "https://api.atris.ai/api/integrations/gmail/messages?query=in:inbox&max
285
361
  curl -s -X POST "https://api.atris.ai/api/integrations/gmail/send" \
286
362
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
287
363
  -d '{"to":"email@example.com","subject":"Hi","body":"Hello!"}'
364
+
365
+ # List drafts
366
+ curl -s "https://api.atris.ai/api/integrations/gmail/drafts" -H "Authorization: Bearer $TOKEN"
367
+
368
+ # Create draft
369
+ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/drafts" \
370
+ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
371
+ -d '{"to":"email@example.com","subject":"Hi","body":"Draft text"}'
372
+
373
+ # Send a draft
374
+ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}/send" \
375
+ -H "Authorization: Bearer $TOKEN"
288
376
  ```
@@ -1,6 +1,9 @@
1
1
  ---
2
2
  name: memory
3
3
  description: Search and reason over Atris journal history. Use when user asks about past work, decisions, history, or patterns. Uses RLM pattern (grep first, reason second).
4
+ version: 1.0.0
5
+ tags:
6
+ - memory
4
7
  ---
5
8
 
6
9
  # Atris Memory Skill
@@ -1,6 +1,10 @@
1
1
  ---
2
2
  name: meta
3
3
  description: Metacognition skill for AI agents. Use when starting work, feeling stuck, output feels off, or before complex tasks. Teaches how to think about thinking.
4
+ version: 1.0.0
5
+ tags:
6
+ - meta
7
+ - metacognition
4
8
  ---
5
9
 
6
10
  # Meta Skill