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.
- package/GETTING_STARTED.md +2 -2
- package/README.md +2 -2
- package/atris/GETTING_STARTED.md +2 -2
- package/atris/atris.md +4 -3
- package/atris/features/README.md +41 -15
- package/atris/skills/README.md +28 -2
- package/atris/skills/atris/SKILL.md +7 -0
- package/atris/skills/autopilot/SKILL.md +8 -4
- package/atris/skills/backend/SKILL.md +6 -1
- package/atris/skills/calendar/SKILL.md +301 -0
- package/atris/skills/clawhub/atris/SKILL.md +121 -0
- package/atris/skills/copy-editor/SKILL.md +7 -8
- package/atris/skills/design/SKILL.md +5 -1
- package/atris/skills/drive/SKILL.md +363 -0
- package/atris/skills/email-agent/SKILL.md +88 -0
- package/atris/skills/memory/SKILL.md +3 -0
- package/atris/skills/meta/SKILL.md +4 -0
- package/atris/skills/skill-improver/SKILL.md +147 -0
- package/atris/skills/slack/SKILL.md +320 -0
- package/atris/skills/writing/SKILL.md +3 -0
- package/atris/team/brainstormer.md +1 -0
- package/atris/team/executor.md +1 -0
- package/atris/team/launcher.md +1 -0
- package/atris/team/navigator.md +2 -0
- package/atris/team/validator.md +15 -0
- package/atris.md +17 -0
- package/bin/atris.js +14 -2
- package/commands/init.js +13 -0
- package/commands/skill.js +496 -0
- package/commands/status.js +9 -1
- package/commands/workflow.js +7 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
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:
|
|
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,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
|