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.
@@ -39,9 +39,9 @@ The agent will:
39
39
  0. (Optional) Explore with you conversationally (`atris brainstorm`)
40
40
  1. Show you an **atris visualization** (diagram of the plan)
41
41
  2. Wait for your approval
42
- 3. Create `atris/features/[name]/idea.md` + `build.md`
42
+ 3. Create `atris/features/[name]/idea.md` + `build.md` + `validate.md`
43
43
  4. Execute step by step
44
- 5. Review and update docs (2-pass validation)
44
+ 5. Validate (fill in validate.md, harvest lessons if anything surprised you)
45
45
 
46
46
  💡 Tip: Use `atris brainstorm` if you're exploring options. Use `atris plan` when ready to build.
47
47
 
package/README.md CHANGED
@@ -33,9 +33,9 @@ Then describe what you want to build. The agent will:
33
33
  0. (Optional) Explore with `atris brainstorm` if uncertain
34
34
  1. Show you a visualization
35
35
  2. Wait for approval
36
- 3. Create `atris/features/[name]/idea.md` + `build.md`
36
+ 3. Create `atris/features/[name]/idea.md` + `build.md` + `validate.md`
37
37
  4. Execute step by step
38
- 5. Review and update docs (2-pass)
38
+ 5. Validate (fill in validate.md, harvest lessons if anything surprised you)
39
39
 
40
40
  Commands: `brainstorm` (optional) → `plan` → `do` → `review`
41
41
 
@@ -39,9 +39,9 @@ The agent will:
39
39
  0. (Optional) Explore with you conversationally (`atris brainstorm`)
40
40
  1. Show you an **atris visualization** (diagram of the plan)
41
41
  2. Wait for your approval
42
- 3. Create `atris/features/[name]/idea.md` + `build.md`
42
+ 3. Create `atris/features/[name]/idea.md` + `build.md` + `validate.md`
43
43
  4. Execute step by step
44
- 5. Review and update docs (2-pass validation)
44
+ 5. Validate (fill in validate.md, harvest lessons if anything surprised you)
45
45
 
46
46
  💡 Tip: Use `atris brainstorm` if you're exploring options. Use `atris plan` when ready to build.
47
47
 
package/atris/atris.md CHANGED
@@ -91,9 +91,9 @@ Stage: PLAN → do → review (capitalize current stage)
91
91
  plan → do → review
92
92
  ```
93
93
 
94
- - **PLAN** — ASCII visualization, get approval, NO code yet
95
- - **DO** — Execute step-by-step, update journal
96
- - **REVIEW** — Test, validate, clean up, delete completed tasks
94
+ - **PLAN** — ASCII visualization, get approval, NO code yet. Create `atris/features/[name]/idea.md` + `build.md` + `validate.md` for substantial work.
95
+ - **DO** — Execute build.md step-by-step, update journal
96
+ - **REVIEW** — Fill in validate.md, test, clean up. If anything surprised you, append to `atris/lessons.md`.
97
97
 
98
98
  ---
99
99
 
@@ -141,6 +141,7 @@ Specs loaded at activate from `team/*.md`
141
141
  |------|---------|
142
142
  | `MAP.md` | Where is X? (navigation) |
143
143
  | `TODO.md` | Task queue (target: 0) |
144
+ | `lessons.md` | What we learned (append-only, read by navigator, written by validator) |
144
145
  | `logs/YYYY/MM-DD.md` | Journal (daily) |
145
146
  | `PERSONA.md` | Communication style |
146
147
  | `team/` | Agent behaviors |
@@ -10,15 +10,18 @@ Each feature gets its own folder:
10
10
 
11
11
  ```
12
12
  atris/features/
13
- ├── _templates/ # Templates for new features
14
- │ ├── idea.md.template # Problem, solution, visualization
15
- └── build.md.template # Step-by-step build instructions
13
+ ├── _templates/ # Templates for new features
14
+ │ ├── idea.md.template # Problem, solution, visualization
15
+ ├── build.md.template # Step-by-step build instructions
16
+ │ └── validate.md.template # Proof it works (or didn't)
16
17
  ├── feature-name-1/
17
- │ ├── idea.md # Why we're building this
18
- └── build.md # How to build it
18
+ │ ├── idea.md # Why we're building this
19
+ ├── build.md # How to build it
20
+ │ └── validate.md # Proof it works
19
21
  └── feature-name-2/
20
22
  ├── idea.md
21
- └── build.md
23
+ ├── build.md
24
+ └── validate.md
22
25
  ```
23
26
 
24
27
  ---
@@ -30,7 +33,7 @@ atris/features/
30
33
  Run `atris` or `atris plan` and describe what you want. The agent will:
31
34
  1. Show visualization
32
35
  2. Wait for approval
33
- 3. Create the feature folder with idea.md + build.md
36
+ 3. Create the feature folder with idea.md + build.md + validate.md
34
37
 
35
38
  ### Manual
36
39
 
@@ -41,31 +44,33 @@ If you want to create a feature manually:
41
44
  mkdir atris/features/your-feature-name
42
45
  cp atris/features/_templates/idea.md.template atris/features/your-feature-name/idea.md
43
46
  cp atris/features/_templates/build.md.template atris/features/your-feature-name/build.md
47
+ cp atris/features/_templates/validate.md.template atris/features/your-feature-name/validate.md
44
48
 
45
49
  # Fill in the templates
46
50
  # Edit idea.md (problem, solution, visualization)
47
51
  # Edit build.md (step-by-step implementation)
52
+ # Edit validate.md (proof it works — filled by validator)
48
53
  ```
49
54
 
50
55
  ---
51
56
 
52
57
  ## Workflow
53
58
 
54
- **Navigator Agent:**
59
+ **Navigator Agent (idea.md):**
55
60
  1. Shows visualization
56
61
  2. Gets approval
57
- 3. Creates `idea.md` + `build.md`
62
+ 3. Creates `idea.md` + `build.md` + `validate.md` (from templates)
58
63
  4. Adds entry to this README
59
64
 
60
- **Executor Agent:**
65
+ **Executor Agent (build.md):**
61
66
  1. Reads `build.md`
62
67
  2. Executes step by step
63
68
  3. Updates status as work progresses
64
69
 
65
- **Validator Agent:**
66
- 1. Verifies build matches spec
67
- 2. Runs tests
68
- 3. Updates status to "complete"
70
+ **Validator Agent (validate.md):**
71
+ 1. Fills in `validate.md` — runs every check, records pass/fail
72
+ 2. If all pass → status "complete", lessons learned to journal
73
+ 3. If any fail → status stays "in-progress", lessons learned to journal
69
74
  4. Updates MAP.md if needed
70
75
 
71
76
  ---
@@ -74,12 +79,33 @@ cp atris/features/_templates/build.md.template atris/features/your-feature-name/
74
79
 
75
80
  ### Active Features
76
81
 
77
- (No active features in development)
82
+ #### audit-gaps
83
+ Close remaining audit gaps from self-audit
84
+ - **Files:** atris/team/*.md, atris/features/README.md
85
+ - **Status:** complete
86
+ - **Keywords:** audit, persona, cleanup
87
+ - **What:** Add PERSONA.md reference to all 5 agent specs, clean up stale feature statuses
78
88
 
79
89
  ---
80
90
 
81
91
  ### Completed Features
82
92
 
93
+ #### self-improving-loop
94
+ Make Atris recursive — validate.md lessons feed back into the next idea.md
95
+ - **Files:** atris/lessons.md (new), atris.md, atris/team/navigator.md, atris/team/validator.md, atris/MAP.md
96
+ - **Status:** complete
97
+ - **Keywords:** recursion, lessons, feedback-loop, self-improving, lessons.md
98
+ - **What:** lessons.md accumulates validated learnings; navigator reads them before planning; validator harvests them after validating
99
+ - **Completed:** 2026-02-09
100
+
101
+ #### wire-the-loop
102
+ Connect lessons.md and validate.md to every CLI command and doc that references them
103
+ - **Files:** commands/init.js, commands/workflow.js, commands/status.js, bin/atris.js, GETTING_STARTED.md, README.md, atris/atris.md
104
+ - **Status:** complete
105
+ - **Keywords:** wiring, cli, docs, lessons, validate, init, plan, review, status
106
+ - **What:** 8 surgical edits to wire lessons.md and validate.md into init, plan, review, status, docs, and spec
107
+ - **Completed:** 2026-02-09
108
+
83
109
  #### brainstorm — v2.0.0
84
110
  Conversational exploration mode for uncertain ideas
85
111
  - **Files:** bin/atris.js, atris/atris.md, atris/PERSONA.md, GETTING_STARTED.md, README.md, atris/MAP.md
@@ -29,14 +29,40 @@ cp -r atris/skills/[name] ~/.codex/skills/
29
29
  | autopilot | PRD-driven autonomous execution | — |
30
30
  | backend | Backend architecture anti-patterns | `policies/atris-backend.md` |
31
31
  | design | Frontend aesthetics policy | `policies/atris-design.md` |
32
+ | calendar | Google Calendar integration via AtrisOS | — |
33
+ | drive | Google Drive + Sheets integration via AtrisOS | — |
32
34
  | email-agent | Gmail integration via AtrisOS | — |
33
35
  | memory | Context and memory management | — |
34
36
  | meta | Metacognition for agents | `policies/LESSONS.md` |
35
37
  | writing | Essay process with gates | `policies/writing.md` |
36
38
  | copy-editor | Detects and fixes AI writing patterns | - |
39
+ | skill-improver | Audit and improve skills against Anthropic guide | — |
40
+
41
+ ## ClawHub (External Distribution)
42
+
43
+ Skills we publish to OpenClaw's ClawHub marketplace. These have YAML frontmatter and are formatted for external agents.
44
+
45
+ | Skill | Description | Status |
46
+ |-------|-------------|--------|
47
+ | clawhub/atris | Codebase intelligence — MAP.md navigation for any agent | Ready to publish |
48
+
49
+ ```bash
50
+ # Publish to ClawHub
51
+ clawhub publish atris/skills/clawhub/atris --slug atris --name "Atris" --version 1.0.0
52
+ ```
53
+
54
+ ## Managing Skills
55
+
56
+ ```bash
57
+ atris skill list # Show all skills with compliance status
58
+ atris skill audit [name|--all] # Validate against Anthropic skill guide
59
+ atris skill fix [name|--all] # Auto-fix common issues
60
+ ```
37
61
 
38
62
  ## Creating Skills
39
63
 
40
64
  1. Create `atris/skills/[name]/SKILL.md`
41
- 2. Create `atris/policies/[name].md` (optional)
42
- 3. Install to your agent (see Integration above)
65
+ 2. Run `atris skill audit [name]` to validate
66
+ 3. Create `atris/policies/[name].md` (optional)
67
+ 4. Install to your agent (see Integration above)
68
+ 5. For external distribution, put in `atris/skills/clawhub/[name]/`
@@ -1,6 +1,13 @@
1
1
  ---
2
2
  name: atris
3
3
  description: Atris workflow enforcement for repos using atris/ (MAP, TODO, journal, features, plan-do-review, anti-slop). Use when the user asks to follow the Atris system or mentions atris, MAP.md, TODO.md, journal/logs, features, plan/do/review, or anti-slop policies.
4
+ version: 1.0.0
5
+ tags:
6
+ - atris
7
+ - workflow
8
+ - memory
9
+ - navigation
10
+ - anti-slop
4
11
  ---
5
12
 
6
13
  # Atris Skill
@@ -1,7 +1,11 @@
1
1
  ---
2
2
  name: autopilot
3
- description: PRD-driven autonomous execution - give it a task, it loops until done
4
- triggers: [autopilot, autonomous, "get it done", "finish this", "ship it"]
3
+ description: PRD-driven autonomous execution - give it a task, it loops until done Triggers on "autopilot", "autonomous", "get it done", "finish this", "ship it".
4
+ version: 1.0.0
5
+ tags:
6
+ - autopilot
7
+ - workflow
8
+ - automation
5
9
  ---
6
10
 
7
11
  # Autopilot Skill
@@ -42,7 +46,7 @@ Autonomous task execution. Plan → Do → Review loop until acceptance criteria
42
46
  │ │ REVIEW: Validator checks │ │
43
47
  │ │ - Check acceptance criteria │ │
44
48
  │ │ - If fail: [REVIEW_FAILED] reason │ │
45
- │ │ - If pass: <promise>COMPLETE</promise>
49
+ │ │ - If pass: [COMPLETE]
46
50
  │ └──────────────────────────────────────┘ │
47
51
  │ │
48
52
  │ 3. OUTPUT │
@@ -84,7 +88,7 @@ atris autopilot "Add feature" --iterations=3 --verbose
84
88
 
85
89
  ## Stop Conditions
86
90
 
87
- 1. `<promise>COMPLETE</promise>` — All acceptance criteria met
91
+ 1. `[COMPLETE]` — All acceptance criteria met
88
92
  2. Max iterations reached (default: 5)
89
93
  3. Error that can't be recovered
90
94
 
@@ -1,7 +1,12 @@
1
1
  ---
2
- name: atris-backend
2
+ name: backend
3
3
  description: Backend architecture policy. Use when building APIs, services, data access, or any backend work. Prevents over-engineering.
4
+ version: 1.0.0
4
5
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep
6
+ tags:
7
+ - backend
8
+ - architecture
9
+ - anti-patterns
5
10
  ---
6
11
 
7
12
  # atris-backend
@@ -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
+ ```