atris 2.2.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.
- 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 +333 -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/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
package/GETTING_STARTED.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
package/atris/GETTING_STARTED.md
CHANGED
|
@@ -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.
|
|
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** —
|
|
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 |
|
package/atris/features/README.md
CHANGED
|
@@ -10,15 +10,18 @@ Each feature gets its own folder:
|
|
|
10
10
|
|
|
11
11
|
```
|
|
12
12
|
atris/features/
|
|
13
|
-
├── _templates/
|
|
14
|
-
│ ├── idea.md.template
|
|
15
|
-
│
|
|
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
|
|
18
|
-
│
|
|
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
|
-
|
|
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.
|
|
67
|
-
2.
|
|
68
|
-
3.
|
|
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
|
-
|
|
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
|
package/atris/skills/README.md
CHANGED
|
@@ -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.
|
|
42
|
-
3.
|
|
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
|
-
|
|
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:
|
|
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.
|
|
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:
|
|
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
|
+
```
|