atris 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/AGENT.md +35 -0
  2. package/AGENTS.md +46 -0
  3. package/GETTING_STARTED.md +2 -2
  4. package/PERSONA.md +5 -1
  5. package/README.md +16 -8
  6. package/atris/AGENTS.md +25 -0
  7. package/atris/GEMINI.md +8 -0
  8. package/atris/GETTING_STARTED.md +2 -2
  9. package/atris/atris.md +4 -3
  10. package/atris/features/README.md +41 -15
  11. package/atris/policies/LESSONS.md +1 -0
  12. package/atris/skills/README.md +45 -14
  13. package/atris/skills/atris/SKILL.md +7 -0
  14. package/atris/skills/autopilot/SKILL.md +9 -4
  15. package/atris/skills/autopilot/atris-autopilot.md +71 -0
  16. package/atris/skills/autopilot/hooks/stop-hook.sh +79 -0
  17. package/atris/skills/backend/SKILL.md +6 -1
  18. package/atris/skills/calendar/SKILL.md +301 -0
  19. package/atris/skills/clawhub/atris/SKILL.md +121 -0
  20. package/atris/skills/copy-editor/SKILL.md +470 -0
  21. package/atris/skills/design/SKILL.md +5 -1
  22. package/atris/skills/drive/SKILL.md +333 -0
  23. package/atris/skills/email-agent/SKILL.md +376 -0
  24. package/atris/skills/memory/SKILL.md +8 -0
  25. package/atris/skills/meta/SKILL.md +4 -0
  26. package/atris/skills/skill-improver/SKILL.md +147 -0
  27. package/atris/skills/writing/SKILL.md +3 -0
  28. package/atris/team/brainstormer.md +1 -0
  29. package/atris/team/executor.md +27 -0
  30. package/atris/team/launcher.md +1 -0
  31. package/atris/team/navigator.md +44 -5
  32. package/atris/team/validator.md +44 -3
  33. package/atris.md +37 -1
  34. package/bin/atris.js +58 -5
  35. package/commands/auth.js +24 -4
  36. package/commands/init.js +140 -17
  37. package/commands/integrations.js +330 -0
  38. package/commands/skill.js +496 -0
  39. package/commands/status.js +9 -1
  40. package/commands/sync.js +64 -19
  41. package/commands/workflow.js +7 -0
  42. package/package.json +4 -2
  43. package/utils/auth.js +33 -0
  44. package/commands/stubs.txt +0 -10
@@ -0,0 +1,301 @@
1
+ ---
2
+ name: calendar
3
+ description: Google Calendar integration via AtrisOS API. View, create, and manage calendar events. Use when user asks about calendar, schedule, meetings, or events.
4
+ version: 1.0.0
5
+ tags:
6
+ - calendar
7
+ - backend
8
+ - google-calendar
9
+ ---
10
+
11
+ # Calendar Agent
12
+
13
+ > Drop this in `~/.claude/skills/calendar/SKILL.md` and Claude Code becomes your calendar assistant.
14
+
15
+ ## Bootstrap (ALWAYS Run First)
16
+
17
+ Before any calendar operation, run this bootstrap to ensure everything is set up:
18
+
19
+ ```bash
20
+ #!/bin/bash
21
+ set -e
22
+
23
+ # 1. Check if atris CLI is installed
24
+ if ! command -v atris &> /dev/null; then
25
+ echo "Installing atris CLI..."
26
+ npm install -g atris
27
+ fi
28
+
29
+ # 2. Check if logged in to AtrisOS
30
+ if [ ! -f ~/.atris/credentials.json ]; then
31
+ echo "Not logged in to AtrisOS."
32
+ echo ""
33
+ echo "Option 1 (interactive): Run 'atris login' and follow prompts"
34
+ echo "Option 2 (non-interactive): Get token from https://atris.ai/auth/cli"
35
+ echo " Then run: atris login --token YOUR_TOKEN"
36
+ echo ""
37
+ exit 1
38
+ fi
39
+
40
+ # 3. Extract token (try node first, then python3, then jq)
41
+ if command -v node &> /dev/null; then
42
+ TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
43
+ elif command -v python3 &> /dev/null; then
44
+ TOKEN=$(python3 -c "import json,os; print(json.load(open(os.path.expanduser('~/.atris/credentials.json')))['token'])")
45
+ elif command -v jq &> /dev/null; then
46
+ TOKEN=$(jq -r '.token' ~/.atris/credentials.json)
47
+ else
48
+ echo "Error: Need node, python3, or jq to read credentials"
49
+ exit 1
50
+ fi
51
+
52
+ # 4. Check Google Calendar connection status (also validates token)
53
+ STATUS=$(curl -s "https://api.atris.ai/api/integrations/google-calendar/status" \
54
+ -H "Authorization: Bearer $TOKEN")
55
+
56
+ # Check for token expiry
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
+ # Parse connected status
64
+ if command -v node &> /dev/null; then
65
+ CONNECTED=$(node -e "try{console.log(JSON.parse('$STATUS').connected||false)}catch(e){console.log(false)}")
66
+ elif command -v python3 &> /dev/null; then
67
+ CONNECTED=$(echo "$STATUS" | python3 -c "import sys,json; print(json.load(sys.stdin).get('connected', False))")
68
+ else
69
+ CONNECTED=$(echo "$STATUS" | jq -r '.connected // false')
70
+ fi
71
+
72
+ if [ "$CONNECTED" != "true" ] && [ "$CONNECTED" != "True" ]; then
73
+ echo "Google Calendar not connected. Getting authorization URL..."
74
+ AUTH=$(curl -s -X POST "https://api.atris.ai/api/integrations/google-calendar/start" \
75
+ -H "Authorization: Bearer $TOKEN" \
76
+ -H "Content-Type: application/json" \
77
+ -d '{"redirect_uri":"https://api.atris.ai/api/integrations/google-calendar/callback"}')
78
+
79
+ if command -v node &> /dev/null; then
80
+ URL=$(node -e "try{console.log(JSON.parse('$AUTH').auth_url||'')}catch(e){console.log('')}")
81
+ elif command -v python3 &> /dev/null; then
82
+ URL=$(echo "$AUTH" | python3 -c "import sys,json; print(json.load(sys.stdin).get('auth_url', ''))")
83
+ else
84
+ URL=$(echo "$AUTH" | jq -r '.auth_url // empty')
85
+ fi
86
+
87
+ echo ""
88
+ echo "Open this URL to connect your Google Calendar:"
89
+ echo "$URL"
90
+ echo ""
91
+ echo "After authorizing, run your calendar command again."
92
+ exit 0
93
+ fi
94
+
95
+ echo "Ready. Google Calendar is connected."
96
+ export ATRIS_TOKEN="$TOKEN"
97
+ ```
98
+
99
+ **Important**: Run this script ONCE before calendar operations. If it exits with instructions, follow them, then run again.
100
+
101
+ ---
102
+
103
+ ## API Reference
104
+
105
+ Base: `https://api.atris.ai/api/integrations`
106
+
107
+ All requests require: `-H "Authorization: Bearer $TOKEN"`
108
+
109
+ ### Get Token (after bootstrap)
110
+ ```bash
111
+ TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
112
+ ```
113
+
114
+ ### List Events
115
+ ```bash
116
+ # Next 7 days (default)
117
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/events" \
118
+ -H "Authorization: Bearer $TOKEN"
119
+
120
+ # Next N days
121
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/events?days=14" \
122
+ -H "Authorization: Bearer $TOKEN"
123
+
124
+ # Custom date range (ISO 8601)
125
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/events?time_min=2026-02-15T00:00:00Z&time_max=2026-02-16T00:00:00Z" \
126
+ -H "Authorization: Bearer $TOKEN"
127
+ ```
128
+
129
+ ### Get Today's Events
130
+ ```bash
131
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/events/today" \
132
+ -H "Authorization: Bearer $TOKEN"
133
+ ```
134
+
135
+ ### Get Single Event
136
+ ```bash
137
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/events/{event_id}" \
138
+ -H "Authorization: Bearer $TOKEN"
139
+ ```
140
+
141
+ ### Create Event
142
+ ```bash
143
+ curl -s -X POST "https://api.atris.ai/api/integrations/google-calendar/events" \
144
+ -H "Authorization: Bearer $TOKEN" \
145
+ -H "Content-Type: application/json" \
146
+ -d '{
147
+ "summary": "Meeting with Sushanth",
148
+ "start": "2026-02-15T14:00:00-08:00",
149
+ "end": "2026-02-15T15:00:00-08:00",
150
+ "description": "Discuss AI transformation roadmap",
151
+ "location": "Zoom",
152
+ "attendees": ["sushanth@pallet.com"],
153
+ "timezone": "America/Los_Angeles"
154
+ }'
155
+ ```
156
+
157
+ **IMPORTANT:** Use `POST` to create events. Do NOT use `PUT` — that is for updating existing events.
158
+
159
+ ### Update Event
160
+ ```bash
161
+ curl -s -X PUT "https://api.atris.ai/api/integrations/google-calendar/events/{event_id}" \
162
+ -H "Authorization: Bearer $TOKEN" \
163
+ -H "Content-Type: application/json" \
164
+ -d '{
165
+ "summary": "Updated meeting title",
166
+ "start": "2026-02-15T15:00:00-08:00",
167
+ "end": "2026-02-15T16:00:00-08:00",
168
+ "timezone": "America/Los_Angeles"
169
+ }'
170
+ ```
171
+
172
+ ### Delete Event
173
+ ```bash
174
+ curl -s -X DELETE "https://api.atris.ai/api/integrations/google-calendar/events/{event_id}" \
175
+ -H "Authorization: Bearer $TOKEN"
176
+ ```
177
+
178
+ ### Check Connection Status
179
+ ```bash
180
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/status" \
181
+ -H "Authorization: Bearer $TOKEN"
182
+ ```
183
+
184
+ ### Disconnect Google Calendar
185
+ ```bash
186
+ curl -s -X DELETE "https://api.atris.ai/api/integrations/google-calendar" \
187
+ -H "Authorization: Bearer $TOKEN"
188
+ ```
189
+
190
+ ---
191
+
192
+ ## Workflows
193
+
194
+ ### "What's on my calendar today?"
195
+ 1. Run bootstrap
196
+ 2. Get events: `GET /google-calendar/events/today`
197
+ 3. Display events sorted by start time: time, title, location
198
+ 4. If no events: "Your calendar is clear today."
199
+
200
+ ### "What's my schedule this week?"
201
+ 1. Run bootstrap
202
+ 2. Get events: `GET /google-calendar/events?days=7`
203
+ 3. Group by day, display each day's events
204
+
205
+ ### "Schedule a meeting with X"
206
+ 1. Run bootstrap
207
+ 2. Create event: `POST /google-calendar/events` with summary, start, end, attendees
208
+ 3. Confirm: "Meeting created! [link]"
209
+
210
+ ### "Do I have any meetings this afternoon?"
211
+ 1. Run bootstrap
212
+ 2. Get events: `GET /google-calendar/events/today`
213
+ 3. Filter events where start time is after 12:00 PM in user's timezone
214
+ 4. Display matching events or "No meetings this afternoon."
215
+
216
+ ### "When is my next meeting?"
217
+ 1. Run bootstrap
218
+ 2. Get events: `GET /google-calendar/events/today`
219
+ 3. Find the next event after current time
220
+ 4. Display: "Your next meeting is [title] at [time]" or "No more meetings today."
221
+
222
+ ### "Cancel my 3pm meeting"
223
+ 1. Run bootstrap
224
+ 2. List events: `GET /google-calendar/events/today`
225
+ 3. Find event at 3pm
226
+ 4. **Confirm with user** before deleting
227
+ 5. Delete: `DELETE /google-calendar/events/{event_id}`
228
+
229
+ ---
230
+
231
+ ## Display Format
232
+
233
+ When showing calendar events, use this format:
234
+
235
+ ```
236
+ Today's Schedule (Feb 15, 2026)
237
+
238
+ 9:00 AM - 9:30 AM Team Standup
239
+ Google Meet
240
+
241
+ 10:00 AM - 11:00 AM Product Review
242
+ Conference Room B
243
+ with alice@example.com, bob@example.com
244
+
245
+ 1:00 PM - 1:30 PM 1:1 with Manager
246
+ Zoom
247
+
248
+ 3 events today
249
+ ```
250
+
251
+ **Rules:**
252
+ - Sort by start time
253
+ - Show location if available
254
+ - Show attendees if available (max 3, then "and N more")
255
+ - Use 12-hour format with AM/PM
256
+ - For all-day events, show "All day" instead of times
257
+
258
+ ---
259
+
260
+ ## Error Handling
261
+
262
+ | Error | Meaning | Solution |
263
+ |-------|---------|----------|
264
+ | `Token expired` | AtrisOS session expired | Run `atris login` |
265
+ | `Calendar not connected` | OAuth not completed | Re-run bootstrap, complete OAuth flow |
266
+ | `401 Unauthorized` | Invalid/expired token | Run `atris login` |
267
+ | `400 Calendar not connected` | No calendar credentials | Complete OAuth via bootstrap |
268
+ | `429 Rate limited` | Too many requests | Wait 60s, retry |
269
+ | `Invalid grant` | Google revoked access | Re-connect calendar via bootstrap |
270
+
271
+ ---
272
+
273
+ ## Security Model
274
+
275
+ 1. **Local token** (`~/.atris/credentials.json`): Your AtrisOS auth token, stored locally with 600 permissions.
276
+
277
+ 2. **Calendar credentials**: Your Google Calendar refresh token is stored **server-side** in AtrisOS encrypted vault. Never stored on your local machine.
278
+
279
+ 3. **Access control**: AtrisOS API enforces that you can only access your own calendar. No cross-user access possible.
280
+
281
+ 4. **OAuth scopes**: Only requests necessary Calendar permissions (read events, manage events).
282
+
283
+ 5. **HTTPS only**: All API communication encrypted in transit.
284
+
285
+ ---
286
+
287
+ ## Quick Reference
288
+
289
+ ```bash
290
+ # Setup (one time)
291
+ npm install -g atris && atris login
292
+
293
+ # Get token
294
+ TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
295
+
296
+ # Check connection
297
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/status" -H "Authorization: Bearer $TOKEN"
298
+
299
+ # Today's events
300
+ curl -s "https://api.atris.ai/api/integrations/google-calendar/events/today" -H "Authorization: Bearer $TOKEN"
301
+ ```
@@ -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