atris 3.74.4 → 3.74.6
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/FOR_AGENTS.md +12 -12
- package/atris/AGENTS.md +7 -7
- package/atris/CLAUDE.md +10 -10
- package/atris/policies/atris-backend.md +1 -1
- package/atris/policies/atris-design.md +71 -71
- package/atris/policies/design-seed.md +28 -28
- package/atris/policies/writing.md +1 -1
- package/atris/skills/apps/SKILL.md +3 -3
- package/atris/skills/atris-feedback/SKILL.md +2 -2
- package/atris/skills/autopilot/SKILL.md +10 -10
- package/atris/skills/blocks/SKILL.md +16 -16
- package/atris/skills/calendar/SKILL.md +1 -1
- package/atris/skills/clawhub/atris/SKILL.md +4 -4
- package/atris/skills/clawhub/philosophy-of-work/SKILL.md +7 -7
- package/atris/skills/create-app/SKILL.md +18 -18
- package/atris/skills/create-member/SKILL.md +11 -11
- package/atris/skills/design/SKILL.md +1 -1
- package/atris/skills/drive/SKILL.md +25 -25
- package/atris/skills/email-agent/SKILL.md +11 -11
- package/atris/skills/endgame/SKILL.md +33 -33
- package/atris/skills/magic-inbox/SKILL.md +15 -15
- package/atris/skills/notion/SKILL.md +1 -1
- package/atris/skills/ramp/SKILL.md +7 -7
- package/atris/skills/research-search/SKILL.md +7 -7
- package/atris/skills/slides/SKILL.md +7 -7
- package/atris/skills/tidy/SKILL.md +11 -11
- package/atris/skills/wake/SKILL.md +11 -11
- package/atris/skills/writing/SKILL.md +5 -5
- package/atris/team/_template/SOUL.md +3 -3
- package/atris/team/brainstormer/MEMBER.md +2 -2
- package/atris/team/launcher/MEMBER.md +2 -2
- package/atris/team/mission-lead/MISSION.md +7 -7
- package/atris/team/opus-overnight/MISSION.md +16 -16
- package/atris/team/opus-overnight/STEERING.md +5 -5
- package/atris.md +9 -0
- package/bin/atris.js +16 -3
- package/commands/campaign.js +17 -2
- package/commands/card.js +19 -12
- package/commands/engine.js +92 -17
- package/commands/gm.js +30 -0
- package/commands/idea.js +263 -0
- package/commands/init.js +11 -2
- package/commands/land.js +39 -18
- package/commands/mission.js +4 -3
- package/commands/ninety-nine.js +288 -0
- package/commands/one-lap.js +46 -27
- package/commands/reel.js +12 -7
- package/commands/sync.js +10 -2
- package/commands/task.js +4 -2
- package/commands/xp.js +68 -15
- package/commands/zen.js +10 -3
- package/lib/campaign-keep.js +23 -8
- package/lib/campaign-loop.js +24 -5
- package/lib/career-xp-lock.js +61 -0
- package/lib/career-xp-root.js +61 -0
- package/lib/claude-boot-block.js +7 -4
- package/lib/engine-registry.js +139 -1
- package/lib/fleet.js +11 -2
- package/lib/gm-bet.js +734 -42
- package/lib/gm-card.js +431 -0
- package/lib/gm-phone-page.js +486 -717
- package/lib/gm-phone.js +33 -34
- package/lib/gm-season.js +14 -0
- package/lib/headless-chrome.js +39 -0
- package/lib/idea-gate.js +33 -0
- package/lib/idea-inbox.js +220 -0
- package/lib/idea-ledger.js +196 -0
- package/lib/idea-tick.js +384 -0
- package/lib/known-commands.js +1 -1
- package/lib/member-engine.js +1 -0
- package/lib/ninety-nine-sync.js +156 -0
- package/lib/ninety-nine.js +247 -0
- package/lib/opening-lines.js +94 -0
- package/lib/roster-markdown.js +39 -1
- package/lib/roster-models.js +1 -1
- package/lib/roster-swap.js +353 -0
- package/lib/spawn-env.js +29 -2
- package/lib/task-db.js +8 -4
- package/lib/wish-audit.js +14 -0
- package/lib/yes-lock.js +365 -256
- package/lib/zen-apply.js +6 -3
- package/lib/zen.js +28 -1
- package/package.json +1 -1
- package/templates/business-starter/CLAUDE.md +7 -7
- package/templates/business-starter/MAP.md +1 -1
- package/templates/business-starter/TODO.md +1 -1
- package/templates/business-starter/atris.md +2 -2
- package/templates/business-starter/context/README.md +6 -6
- package/templates/business-starter/context/live-workspace.md +1 -1
- package/templates/business-starter/goals.md +1 -1
- package/templates/business-starter/instructions.md +1 -1
- package/templates/business-starter/memory.md +4 -4
- package/templates/business-starter/persona.md +3 -3
- package/templates/business-starter/policies/LESSONS.md +1 -1
- package/templates/business-starter/reports/README.md +1 -1
- package/templates/business-starter/skills/README.md +1 -1
- package/templates/business-starter/team/README.md +1 -1
- package/templates/business-starter/team/START_HERE.md +1 -1
- package/templates/business-starter/team/_template/SOUL.md +3 -3
- package/templates/business-starter/team/comms/SOUL.md +2 -2
- package/templates/business-starter/team/ops/SOUL.md +4 -4
- package/templates/business-starter/team/research/SOUL.md +3 -3
- package/templates/business-starter/wiki/index.md +1 -1
- package/templates/research-canonical/CLAUDE.md +7 -7
- package/templates/research-canonical/MAP.md +1 -1
- package/templates/research-canonical/TODO.md +1 -1
- package/templates/research-canonical/atris.md +2 -2
- package/templates/research-canonical/context/README.md +8 -8
- package/templates/research-canonical/context/live-workspace.md +1 -1
- package/templates/research-canonical/goals.md +2 -2
- package/templates/research-canonical/instructions.md +1 -1
- package/templates/research-canonical/memory.md +4 -4
- package/templates/research-canonical/persona.md +1 -1
- package/templates/research-canonical/policies/LESSONS.md +1 -1
- package/templates/research-canonical/reports/README.md +1 -1
- package/templates/research-canonical/skills/README.md +1 -1
- package/templates/research-canonical/team/README.md +1 -1
- package/templates/research-canonical/team/eval/SOUL.md +1 -1
- package/templates/research-canonical/team/experiment/SOUL.md +2 -2
- package/templates/research-canonical/team/hypothesis/SOUL.md +3 -3
- package/templates/research-canonical/team/literature/SOUL.md +2 -2
- package/templates/research-canonical/wiki/briefs/research-program.md +1 -1
- package/templates/research-canonical/wiki/index.md +1 -1
- package/utils/auth.js +1 -0
|
@@ -10,7 +10,7 @@ tags:
|
|
|
10
10
|
- flow
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
> **The two-engine architecture:** /flow chains forward from identity (who you are → next move). /endgame chains backward from horizon (where you're going → next move). They meet at the same intersection
|
|
13
|
+
> **The two-engine architecture:** /flow chains forward from identity (who you are → next move). /endgame chains backward from horizon (where you're going → next move). They meet at the same intersection: the next thing /autopilot should ship. Each tick reads both sides and shows them in the visual status block.
|
|
14
14
|
|
|
15
15
|
## Visual status block
|
|
16
16
|
|
|
@@ -34,7 +34,7 @@ If identity is missing, edit PERSONA.md. If no horizon is active, /endgame seeds
|
|
|
34
34
|
|
|
35
35
|
# /autopilot
|
|
36
36
|
|
|
37
|
-
Runs ONE plan→do→review tick anchored to the current endgame. If no endgame is active, seeds one from the inbox or wiki signals first. Not a recurring loop
|
|
37
|
+
Runs ONE plan→do→review tick anchored to the current endgame. If no endgame is active, seeds one from the inbox or wiki signals first. Not a recurring loop. Call `/loop` for that.
|
|
38
38
|
|
|
39
39
|
## When to use
|
|
40
40
|
|
|
@@ -43,10 +43,10 @@ Runs ONE plan→do→review tick anchored to the current endgame. If no endgame
|
|
|
43
43
|
|
|
44
44
|
## What ONE tick does
|
|
45
45
|
|
|
46
|
-
1. **Read state
|
|
47
|
-
2. **Boundary check
|
|
48
|
-
3. **Execute
|
|
49
|
-
4. **Stop
|
|
46
|
+
1. **Read state**: load `atris/TODO.md`. Look for the `## Endgame` section header and `[endgame]`-tagged tasks in `## Backlog`.
|
|
47
|
+
2. **Boundary check**: if no `## Endgame` section exists, OR every `[endgame]`-tagged task in Backlog is done/missing, invoke `/endgame` first to seed the next horizon. `/endgame` will write a new `## Endgame` section + tagged backlog tasks to TODO.md.
|
|
48
|
+
3. **Execute**: run `atris autopilot --auto --iterations=1` via Bash. The CLI prefers `[endgame]`-tagged backlog tasks (priority 0) over reactive signals (priority 1+). One task per tick.
|
|
49
|
+
4. **Stop**: show the output, do not start a conversation, do not chain. The next tick is the cron's job.
|
|
50
50
|
|
|
51
51
|
## How to invoke
|
|
52
52
|
|
|
@@ -76,9 +76,9 @@ no endgame anywhere, no inbox, clean → loop journals "nothing left", stops
|
|
|
76
76
|
|
|
77
77
|
## Variants
|
|
78
78
|
|
|
79
|
-
- `atris autopilot --dry-run
|
|
80
|
-
- `atris autopilot --auto --iterations=N
|
|
81
|
-
- `atris autopilot "<task description>"
|
|
79
|
+
- `atris autopilot --dry-run`: preview what it would do, do not execute
|
|
80
|
+
- `atris autopilot --auto --iterations=N`: run up to N ticks back-to-back (still one task per tick, boundary checks between)
|
|
81
|
+
- `atris autopilot "<task description>"`: seed a new inbox item, then run
|
|
82
82
|
|
|
83
83
|
## Autonomous mode
|
|
84
84
|
|
|
@@ -95,6 +95,6 @@ If the user wants this to fire on a recurring schedule, invoke `/loop` instead.
|
|
|
95
95
|
- Always show *why* before executing.
|
|
96
96
|
- Stop after the first tick. Do not chain. Chaining is `/loop`'s job.
|
|
97
97
|
- Endgame tasks always preferred over reactive signals.
|
|
98
|
-
- At every boundary (no current endgame OR all done), reassess via `/endgame
|
|
98
|
+
- At every boundary (no current endgame OR all done), reassess via `/endgame`: read inbox/wiki/logs, pick the next horizon, do not just run forever.
|
|
99
99
|
- If a tick fails, halt and journal the failure. Do not pretend it worked.
|
|
100
100
|
- The CLI writes the heartbeat Notes block. Do not hand-write tick summaries to the journal.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: blocks
|
|
3
|
-
description: Author Atris block documents
|
|
3
|
+
description: Author Atris block documents, the live markdown docs the Atris (obelisk) editor renders, with charts, gauges, metrics, tables, and images. One doc is a beautiful one-pager; add slide breaks and it presents as a deck. Use when creating or editing an Atris doc, deck, one-pager, report, or anything opened in the Atris markdown editor.
|
|
4
4
|
version: 1.0.0
|
|
5
5
|
tags:
|
|
6
6
|
- blocks
|
|
@@ -14,7 +14,7 @@ tags:
|
|
|
14
14
|
|
|
15
15
|
Author documents the Atris desktop editor renders as **live blocks**: charts, gauges,
|
|
16
16
|
metric cards, tables, and images inside plain markdown. Same file is a one-pager or a
|
|
17
|
-
deck
|
|
17
|
+
deck. The only difference is slide breaks.
|
|
18
18
|
|
|
19
19
|
The whole thing is one `.md` file. Prose is prose. A fenced code block with a known
|
|
20
20
|
language becomes a live visual. A `---` on its own line starts a new slide.
|
|
@@ -25,7 +25,7 @@ The renderer lives in the Atris desktop app (obelisk repo), at
|
|
|
25
25
|
`project-obelisk/src/lib/markdownEditorIo.cjs` (engine) and `renderEmbedBlockHtml` in
|
|
26
26
|
`project-obelisk/src/components/AppExperience.tsx` (block defs). Present mode:
|
|
27
27
|
`MarkdownPresentView.tsx`. Working templates: `project-obelisk/atris/decks/`
|
|
28
|
-
(`blocks-demo.md`, `generative-blocks.md`). Validate against the engine (below)
|
|
28
|
+
(`blocks-demo.md`, `generative-blocks.md`). Validate against the engine (below):
|
|
29
29
|
it's the source of truth, no app needed.
|
|
30
30
|
|
|
31
31
|
## Doc shape
|
|
@@ -36,27 +36,27 @@ it's the source of truth, no app needed.
|
|
|
36
36
|
|
|
37
37
|
## The blocks
|
|
38
38
|
|
|
39
|
-
Each is a fenced code block. The body must be **valid JSON
|
|
39
|
+
Each is a fenced code block. The body must be **valid JSON**. Invalid JSON silently
|
|
40
40
|
falls back to a plain code block (no error), so validate. Colors/accents are hex strings.
|
|
41
41
|
|
|
42
|
-
### metric
|
|
42
|
+
### metric: a stat card
|
|
43
43
|
```metric
|
|
44
44
|
{"label":"MRR from paying customers","value":"$20K+","accent":"#f0a13a"}
|
|
45
45
|
```
|
|
46
46
|
`label`, `value` (string), optional `accent`. Put several in a row; they stack as cards.
|
|
47
47
|
|
|
48
|
-
### gauge
|
|
48
|
+
### gauge: a ring toward a target
|
|
49
49
|
```gauge
|
|
50
50
|
{"title":"Ledger reconciled","value":100,"max":100,"caption":"ties back to the board, to the penny"}
|
|
51
51
|
```
|
|
52
52
|
`title` (or `label`), `value`, `max`, optional `caption`, `accent`.
|
|
53
53
|
|
|
54
|
-
### chart
|
|
54
|
+
### chart: line / bar / area / donut
|
|
55
55
|
Single series (friendly `data` form):
|
|
56
56
|
```chart
|
|
57
57
|
{"kind":"bar","title":"Weekly active sessions","data":[{"label":"W1","value":12},{"label":"W2","value":19},{"label":"W3","value":27}]}
|
|
58
58
|
```
|
|
59
|
-
Multiple series (line, with colors
|
|
59
|
+
Multiple series (line, with colors, great for "rent rises vs own falls"):
|
|
60
60
|
```chart
|
|
61
61
|
{"kind":"line","title":"Cost per unit of work","series":[{"name":"Rent","color":"#d16a5a","points":[{"label":"Y1","value":40},{"label":"Y2","value":88}]},{"name":"Own","color":"#3f9668","points":[{"label":"Y1","value":38},{"label":"Y2","value":12}]}],"caption":"same work, opposite curves"}
|
|
62
62
|
```
|
|
@@ -66,7 +66,7 @@ Donut (first series' points become slices; center shows the total):
|
|
|
66
66
|
```
|
|
67
67
|
`kind`: `line` | `bar` | `area` | `donut`. Points are `{"label","value"}`. Optional `unit`, `caption`. A chart with no points renders nothing, so always include data.
|
|
68
68
|
|
|
69
|
-
### table
|
|
69
|
+
### table: an editable grid
|
|
70
70
|
Plain GFM. Renders as a clean grid, round-trips verbatim. First column can be a blank header for a comparison.
|
|
71
71
|
```
|
|
72
72
|
| | Rent | Own |
|
|
@@ -75,13 +75,13 @@ Plain GFM. Renders as a clean grid, round-trips verbatim. First column can be a
|
|
|
75
75
|
| Data | Their building | Your walls |
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
### image
|
|
78
|
+
### image: a picture
|
|
79
79
|
```image
|
|
80
80
|
{"url":"https://...","alt":"..."}
|
|
81
81
|
```
|
|
82
|
-
A data: or https: URL renders immediately. Without one, the editor shows a placeholder and generates (non-deterministic
|
|
82
|
+
A data: or https: URL renders immediately. Without one, the editor shows a placeholder and generates (non-deterministic, so don't rely on generation for something you're about to present).
|
|
83
83
|
|
|
84
|
-
### ask
|
|
84
|
+
### ask: an embedded AI answer
|
|
85
85
|
```ask
|
|
86
86
|
{"output":"the answer, as markdown"}
|
|
87
87
|
```
|
|
@@ -92,12 +92,12 @@ Renders `output` as prose. Authored by the editor's in-app AI; rarely hand-writt
|
|
|
92
92
|
- **No side-by-side columns by hand.** `md-cols` only parses as a single unbroken line and breaks the moment you add newlines/bullets. Use a **table** for comparisons. Columns are a UI-only construct.
|
|
93
93
|
- **Invalid JSON = silent fallback** to a code block. No error is thrown. Validate.
|
|
94
94
|
- **A chart needs data points** or it renders empty.
|
|
95
|
-
- **Raw HTML is sanitized
|
|
95
|
+
- **Raw HTML is sanitized**: inline `style=` and `<style>`/`<script>` are stripped. You cannot brand a doc with custom CSS; it wears the editor's theme. Design with the blocks, not CSS.
|
|
96
96
|
- **`---` is a hard slide break.** A stray `---` inside a slide splits it. GFM table delimiters (`| --- |`) are safe.
|
|
97
97
|
|
|
98
98
|
## Validate before you trust it
|
|
99
99
|
|
|
100
|
-
Run the doc through the real engine
|
|
100
|
+
Run the doc through the real engine, no app needed. This auto-finds obelisk's engine
|
|
101
101
|
from any project in the workspace:
|
|
102
102
|
|
|
103
103
|
```bash
|
|
@@ -121,7 +121,7 @@ slides.forEach((s,i)=>{
|
|
|
121
121
|
|
|
122
122
|
## Open / present / export
|
|
123
123
|
|
|
124
|
-
- **Open:** in the app, Cmd+P → type the filename → Enter. (Quick Open searches the open project only
|
|
124
|
+
- **Open:** in the app, Cmd+P → type the filename → Enter. (Quick Open searches the open project only, so the file must live under it.)
|
|
125
125
|
- **Edit a block:** click the chart/number; a form opens to change values. No JSON editing needed.
|
|
126
126
|
- **Insert a block:** type `/` for the block menu.
|
|
127
127
|
- **Present:** the Present button (splits on `---`); arrows/space to move, Esc to exit.
|
|
@@ -131,4 +131,4 @@ slides.forEach((s,i)=>{
|
|
|
131
131
|
|
|
132
132
|
Lead with the blocks that carry meaning, one hero visual per slide. A number that
|
|
133
133
|
matters is a `metric`. A trend or a crossing is a `chart`. A comparison is a `table`.
|
|
134
|
-
Everything else is tight prose. Don't decorate
|
|
134
|
+
Everything else is tight prose. Don't decorate. The doc should read clean at a squint.
|
|
@@ -154,7 +154,7 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-calendar/events" \
|
|
|
154
154
|
}'
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
-
**IMPORTANT:** Use `POST` to create events. Do NOT use `PUT
|
|
157
|
+
**IMPORTANT:** Use `POST` to create events. Do NOT use `PUT`. That is for updating existing events.
|
|
158
158
|
|
|
159
159
|
### Update Event
|
|
160
160
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: atris
|
|
3
|
-
description: "Codebase intelligence
|
|
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
4
|
version: 1.1.0
|
|
5
5
|
requires:
|
|
6
6
|
bins:
|
|
@@ -13,7 +13,7 @@ tags:
|
|
|
13
13
|
- context-management
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
# Atris
|
|
16
|
+
# Atris: Codebase Intelligence
|
|
17
17
|
|
|
18
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
19
|
|
|
@@ -63,7 +63,7 @@ rg "listen|createServer|app\.start|if __name__" --line-number
|
|
|
63
63
|
## MAP.md structure
|
|
64
64
|
|
|
65
65
|
```markdown
|
|
66
|
-
# MAP.md
|
|
66
|
+
# MAP.md: [Project Name] Navigation Guide
|
|
67
67
|
|
|
68
68
|
> Generated by Atris | Last updated: YYYY-MM-DD
|
|
69
69
|
|
|
@@ -98,7 +98,7 @@ Flag high-impact files with why they matter and key functions with line numbers.
|
|
|
98
98
|
|
|
99
99
|
### Entry Points
|
|
100
100
|
|
|
101
|
-
How execution flows
|
|
101
|
+
How execution flows: dev server startup, request lifecycle, build pipeline.
|
|
102
102
|
|
|
103
103
|
## Keeping it fresh
|
|
104
104
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: philosophy-of-work
|
|
3
|
-
description: "Install Atris
|
|
3
|
+
description: "Install Atris: the open-source operating system for AI work. Gives agents MAP-first navigation, durable tasks, proof on disk, and a plan→do→review loop. Use when starting in a repo, onboarding, or when chat context keeps dying."
|
|
4
4
|
version: 1.0.0
|
|
5
5
|
requires:
|
|
6
6
|
bins:
|
|
@@ -15,7 +15,7 @@ tags:
|
|
|
15
15
|
|
|
16
16
|
# Philosophy of Work (Atris)
|
|
17
17
|
|
|
18
|
-
Humans are building a **philosophy of work
|
|
18
|
+
Humans are building a **philosophy of work**: how companies and agents should run together.
|
|
19
19
|
|
|
20
20
|
The **bible is open source** (CLI + `atris.md`). The **school** is optional cloud + humans who help design the system.
|
|
21
21
|
|
|
@@ -33,10 +33,10 @@ Read `atris/atris.md` first. Follow it exactly.
|
|
|
33
33
|
|
|
34
34
|
## Why switch
|
|
35
35
|
|
|
36
|
-
- **MAP.md
|
|
37
|
-
- **atris task
|
|
38
|
-
- **Missions
|
|
39
|
-
- **Honest handoffs
|
|
36
|
+
- **MAP.md**: stop re-scanning; file:line navigation
|
|
37
|
+
- **atris task**: work survives sessions; claim → ship → proof
|
|
38
|
+
- **Missions**: overnight loops with verifiers
|
|
39
|
+
- **Honest handoffs**: next agent reads disk, not your chat
|
|
40
40
|
|
|
41
41
|
## Agent contract (4 artifacts)
|
|
42
42
|
|
|
@@ -47,7 +47,7 @@ Read `atris/atris.md` first. Follow it exactly.
|
|
|
47
47
|
| Change | small git diff |
|
|
48
48
|
| Proof | `atris task ready <id> --proof "..."` |
|
|
49
49
|
|
|
50
|
-
Do not `atris task accept
|
|
50
|
+
Do not `atris task accept`. Humans only.
|
|
51
51
|
|
|
52
52
|
## Full letter
|
|
53
53
|
|
|
@@ -104,7 +104,7 @@ unset secret_val
|
|
|
104
104
|
echo "Saved locally."
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
Register the key in the web UI (manifest only
|
|
107
|
+
Register the key in the web UI (manifest only, no value sent):
|
|
108
108
|
```bash
|
|
109
109
|
curl -s -X POST "https://api.atris.ai/api/apps/SLUG/secrets/KEY_NAME/register-local" \
|
|
110
110
|
-H "Authorization: Bearer $TOKEN"
|
|
@@ -222,9 +222,9 @@ curl -s -X POST "https://api.atris.ai/api/scheduled-tasks" \
|
|
|
222
222
|
```
|
|
223
223
|
|
|
224
224
|
Common schedules:
|
|
225
|
-
- `"0 8 * * *"
|
|
226
|
-
- `"0 */6 * * *"
|
|
227
|
-
- `"0 9 * * 1"
|
|
225
|
+
- `"0 8 * * *"`: daily at 8am UTC
|
|
226
|
+
- `"0 */6 * * *"`: every 6 hours
|
|
227
|
+
- `"0 9 * * 1"`: weekly Monday 9am UTC
|
|
228
228
|
|
|
229
229
|
**Skip this step** for on-demand apps (manual trigger only) or chat apps.
|
|
230
230
|
|
|
@@ -270,20 +270,20 @@ Tell the user:
|
|
|
270
270
|
All endpoints use the app's `share_token` as `{slug}`.
|
|
271
271
|
|
|
272
272
|
```
|
|
273
|
-
POST /api/apps/{slug}/trigger
|
|
274
|
-
POST /api/apps/{slug}/ingest
|
|
275
|
-
POST /api/apps/{slug}/ingest/batch
|
|
276
|
-
GET /api/apps/{slug}/data
|
|
277
|
-
GET /api/apps/{slug}/data/{collection}
|
|
278
|
-
GET /api/apps/{slug}/status
|
|
279
|
-
GET /api/apps/{slug}/runs
|
|
280
|
-
GET /api/apps/{slug}/runs/{run_id}
|
|
281
|
-
PUT /api/apps/{slug}/secrets/{key}
|
|
282
|
-
GET /api/apps/{slug}/secrets
|
|
283
|
-
DELETE /api/apps/{slug}/secrets/{key}
|
|
284
|
-
POST /api/apps/{slug}/members
|
|
285
|
-
GET /api/apps/{slug}/members
|
|
286
|
-
DELETE /api/apps/{slug}/members/{agent_id}
|
|
273
|
+
POST /api/apps/{slug}/trigger : run the app now
|
|
274
|
+
POST /api/apps/{slug}/ingest : push data in
|
|
275
|
+
POST /api/apps/{slug}/ingest/batch : push multiple items
|
|
276
|
+
GET /api/apps/{slug}/data : read stored data
|
|
277
|
+
GET /api/apps/{slug}/data/{collection} : read specific collection
|
|
278
|
+
GET /api/apps/{slug}/status : health, last run, next run
|
|
279
|
+
GET /api/apps/{slug}/runs : execution history
|
|
280
|
+
GET /api/apps/{slug}/runs/{run_id} : single run details
|
|
281
|
+
PUT /api/apps/{slug}/secrets/{key} : store an API key (owner only)
|
|
282
|
+
GET /api/apps/{slug}/secrets : list key names (owner only)
|
|
283
|
+
DELETE /api/apps/{slug}/secrets/{key} : remove a key (owner only)
|
|
284
|
+
POST /api/apps/{slug}/members : add agent operator
|
|
285
|
+
GET /api/apps/{slug}/members : list members
|
|
286
|
+
DELETE /api/apps/{slug}/members/{agent_id} : remove member
|
|
287
287
|
```
|
|
288
288
|
|
|
289
289
|
## Examples
|
|
@@ -18,7 +18,7 @@ Spec: https://github.com/atrislabs/member
|
|
|
18
18
|
```
|
|
19
19
|
team/<name>/
|
|
20
20
|
├── MEMBER.md REQUIRED Persona + role + permissions
|
|
21
|
-
├── SOUL.md REQUIRED Identity, values, lessons
|
|
21
|
+
├── SOUL.md REQUIRED Identity, values, lessons: who the agent is
|
|
22
22
|
├── MISSION.md REQUIRED Durable purpose and goal-selection rule
|
|
23
23
|
├── goals.json REQUIRED Machine-readable goal state
|
|
24
24
|
├── goals.md REQUIRED Human-readable goal state
|
|
@@ -64,19 +64,19 @@ Use kebab-case for the name. Create the full bundle in one operation, even when
|
|
|
64
64
|
|
|
65
65
|
### Step 3: Write SOUL.md
|
|
66
66
|
|
|
67
|
-
SOUL.md defines who the agent *is
|
|
67
|
+
SOUL.md defines who the agent *is*, not what it does (MEMBER.md) or how it communicates (PERSONA.md). Use the template at `atris/team/_template/SOUL.md`.
|
|
68
68
|
|
|
69
69
|
Write five sections:
|
|
70
70
|
|
|
71
|
-
**Beliefs
|
|
71
|
+
**Beliefs**: 3-5 convictions that guide judgment when rules don't apply. Not rules, things the agent holds true.
|
|
72
72
|
|
|
73
|
-
**Values
|
|
73
|
+
**Values**: 2-3 values ordered by priority. What the agent optimizes for in ambiguous situations.
|
|
74
74
|
|
|
75
|
-
**Lessons
|
|
75
|
+
**Lessons**: Start empty. These get synthesized from the agent's journal entries over time. Not copied from elsewhere, earned from experience.
|
|
76
76
|
|
|
77
|
-
**Edges
|
|
77
|
+
**Edges**: Honest self-assessment. What this agent is strong at and what it tends to get wrong. This helps the agent (and other agents) calibrate trust.
|
|
78
78
|
|
|
79
|
-
**Voice
|
|
79
|
+
**Voice**: One sentence that captures how this agent thinks. The inner monologue, not the output style.
|
|
80
80
|
|
|
81
81
|
The soul should be *specific to this agent*. Two agents with the same role but different souls should make different judgment calls in ambiguous moments.
|
|
82
82
|
|
|
@@ -88,7 +88,7 @@ Use this structure:
|
|
|
88
88
|
---
|
|
89
89
|
name: <kebab-case-name>
|
|
90
90
|
role: <Human Readable Title>
|
|
91
|
-
description: <one line
|
|
91
|
+
description: <one line, what this member does>
|
|
92
92
|
version: 1.0.0
|
|
93
93
|
|
|
94
94
|
skills: []
|
|
@@ -100,11 +100,11 @@ permissions:
|
|
|
100
100
|
|
|
101
101
|
Below the frontmatter, write three sections:
|
|
102
102
|
|
|
103
|
-
**Persona
|
|
103
|
+
**Persona**: How the member communicates. Tone, style, decision-making approach. Be specific: "direct and research-driven" is better than "professional and helpful."
|
|
104
104
|
|
|
105
|
-
**Workflow
|
|
105
|
+
**Workflow**: Numbered steps the member follows. This is the core operating procedure. Each step should be a concrete action.
|
|
106
106
|
|
|
107
|
-
**Rules
|
|
107
|
+
**Rules**: Hard constraints. What the member must always or never do. Keep it to 3-5 rules.
|
|
108
108
|
|
|
109
109
|
### Step 5: Add permissions
|
|
110
110
|
|
|
@@ -57,7 +57,7 @@ Font alternatives: instead of Inter: Instrument Sans, Plus Jakarta Sans, Outfit.
|
|
|
57
57
|
|
|
58
58
|
**Hierarchy:** 2-3 text levels max. don't mix 5 competing styles.
|
|
59
59
|
|
|
60
|
-
**No all-caps. ever.** never use the `uppercase` tailwind class,
|
|
60
|
+
**No all-caps. ever.** never use the `uppercase` tailwind class, the css uppercase text transform, or shout-cased copy on labels, section headers, buttons, badges, or anywhere else. random capitalized text mid-page reads as average ai-generated slop. write labels in sentence case ("Active tasks", not "ACTIVE TASKS") and let copy render as authored.
|
|
61
61
|
|
|
62
62
|
**No eyebrow metadata.** Do not place tiny index, category, status, or implementation-type strips above real content. If the name changes the next action, make it a readable heading. If it does not, remove it. Generator metadata belongs in machine contracts and inspectors, never on the product canvas.
|
|
63
63
|
|
|
@@ -143,10 +143,10 @@ curl -s "https://api.atris.ai/api/integrations/google-drive/search?q=quarterly+r
|
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
Simple queries search by file name. For advanced queries, use Drive query syntax:
|
|
146
|
-
- `name contains 'budget'
|
|
147
|
-
- `mimeType = 'application/vnd.google-apps.spreadsheet'
|
|
148
|
-
- `mimeType = 'application/vnd.google-apps.document'
|
|
149
|
-
- `modifiedTime > '2026-01-01'
|
|
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
150
|
|
|
151
151
|
### Get File Metadata
|
|
152
152
|
```bash
|
|
@@ -169,10 +169,10 @@ curl -s "https://api.atris.ai/api/integrations/google-drive/files/{file_id}/expo
|
|
|
169
169
|
```
|
|
170
170
|
|
|
171
171
|
**Export formats:**
|
|
172
|
-
- `text/plain
|
|
173
|
-
- `text/html
|
|
174
|
-
- `application/pdf
|
|
175
|
-
- `text/csv
|
|
172
|
+
- `text/plain`: plain text (default, good for Docs)
|
|
173
|
+
- `text/html`: HTML
|
|
174
|
+
- `application/pdf`: PDF
|
|
175
|
+
- `text/csv`: CSV (for Sheets)
|
|
176
176
|
|
|
177
177
|
### Upload File
|
|
178
178
|
```bash
|
|
@@ -241,7 +241,7 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/files/{file_
|
|
|
241
241
|
-d '{"name": "Copy of Document", "folder_id": "OPTIONAL_FOLDER_ID"}'
|
|
242
242
|
```
|
|
243
243
|
|
|
244
|
-
Works with Docs, Sheets, Slides
|
|
244
|
+
Works with Docs, Sheets, Slides. It creates a full copy.
|
|
245
245
|
|
|
246
246
|
### Share File
|
|
247
247
|
```bash
|
|
@@ -440,10 +440,10 @@ curl -s "https://api.atris.ai/api/integrations/google-drive/sheets/{spreadsheet_
|
|
|
440
440
|
```
|
|
441
441
|
|
|
442
442
|
**Range uses A1 notation:**
|
|
443
|
-
- `Sheet1
|
|
444
|
-
- `Sheet1!A1:D10
|
|
445
|
-
- `Sheet1!A:A
|
|
446
|
-
- `Sheet1!1:1
|
|
443
|
+
- `Sheet1`: entire sheet
|
|
444
|
+
- `Sheet1!A1:D10`: specific range
|
|
445
|
+
- `Sheet1!A:A`: entire column A
|
|
446
|
+
- `Sheet1!1:1`: entire row 1
|
|
447
447
|
|
|
448
448
|
### Update Cells
|
|
449
449
|
```bash
|
|
@@ -500,20 +500,20 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/sheets/{spre
|
|
|
500
500
|
```
|
|
501
501
|
|
|
502
502
|
**Common request types:**
|
|
503
|
-
- `repeatCell
|
|
504
|
-
- `mergeCells
|
|
505
|
-
- `updateBorders
|
|
506
|
-
- `autoResizeDimensions
|
|
507
|
-
- `addConditionalFormatRule
|
|
508
|
-
- `addChart
|
|
509
|
-
- `addSheet` / `deleteSheet
|
|
510
|
-
- `sortRange
|
|
503
|
+
- `repeatCell`: format a range (bold, colors, font size, alignment)
|
|
504
|
+
- `mergeCells`: merge a range into one cell
|
|
505
|
+
- `updateBorders`: add borders to cells
|
|
506
|
+
- `autoResizeDimensions`: auto-fit column widths
|
|
507
|
+
- `addConditionalFormatRule`: highlight cells based on rules
|
|
508
|
+
- `addChart`: embed a chart
|
|
509
|
+
- `addSheet` / `deleteSheet`: manage sheets/tabs
|
|
510
|
+
- `sortRange`: sort rows by a column
|
|
511
511
|
|
|
512
|
-
**Range format:** `{"sheetId": 0, "startRowIndex": 0, "endRowIndex": 1, "startColumnIndex": 0, "endColumnIndex": 3}
|
|
512
|
+
**Range format:** `{"sheetId": 0, "startRowIndex": 0, "endRowIndex": 1, "startColumnIndex": 0, "endColumnIndex": 3}`. Here, sheetId 0 is the first tab, and indices are 0-based.
|
|
513
513
|
|
|
514
514
|
**Color format:** RGB floats 0-1, e.g. `{"red": 0.2, "green": 0.6, "blue": 1.0}`
|
|
515
515
|
|
|
516
|
-
You can send multiple requests in one call
|
|
516
|
+
You can send multiple requests in one call. They execute in order.
|
|
517
517
|
|
|
518
518
|
---
|
|
519
519
|
|
|
@@ -571,7 +571,7 @@ You can send multiple requests in one call — they execute in order.
|
|
|
571
571
|
### "Format a spreadsheet"
|
|
572
572
|
1. Run bootstrap
|
|
573
573
|
2. Find the sheet, get its `spreadsheetId`
|
|
574
|
-
3. Build requests array
|
|
574
|
+
3. Build requests array: bold headers, colors, borders, auto-resize, etc.
|
|
575
575
|
4. **Show user what formatting will be applied, get approval**
|
|
576
576
|
5. Apply: `POST /google-drive/sheets/{id}/batchUpdate` with `{"requests": [...]}`
|
|
577
577
|
|
|
@@ -603,7 +603,7 @@ You can send multiple requests in one call — they execute in order.
|
|
|
603
603
|
### "Delete files"
|
|
604
604
|
1. Run bootstrap
|
|
605
605
|
2. Find the files
|
|
606
|
-
3. **Confirm with user
|
|
606
|
+
3. **Confirm with user**: show file names
|
|
607
607
|
4. Trash (recoverable): `DELETE /google-drive/files/{id}?trash=true`
|
|
608
608
|
5. Or permanent delete: `DELETE /google-drive/files/{id}`
|
|
609
609
|
|
|
@@ -119,12 +119,12 @@ curl -s "https://api.atris.ai/api/integrations/gmail/messages?query=in:inbox&max
|
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
**Query syntax** (Gmail search):
|
|
122
|
-
- `in:inbox
|
|
123
|
-
- `in:inbox newer_than:1d
|
|
124
|
-
- `is:unread
|
|
125
|
-
- `from:someone@example.com
|
|
126
|
-
- `subject:invoice
|
|
127
|
-
- `has:attachment
|
|
122
|
+
- `in:inbox`: inbox only
|
|
123
|
+
- `in:inbox newer_than:1d`: today's emails
|
|
124
|
+
- `is:unread`: unread only
|
|
125
|
+
- `from:someone@example.com`: from specific sender
|
|
126
|
+
- `subject:invoice`: subject contains word
|
|
127
|
+
- `has:attachment`: emails with attachments
|
|
128
128
|
|
|
129
129
|
### Read Single Email
|
|
130
130
|
```bash
|
|
@@ -158,7 +158,7 @@ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/send" \
|
|
|
158
158
|
}'
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
**Reply in thread (IMPORTANT
|
|
161
|
+
**Reply in thread (IMPORTANT: use this for all replies):**
|
|
162
162
|
|
|
163
163
|
To reply within an existing email thread, you MUST pass `thread_id` and `reply_to_message_id`. Without these, Gmail creates a new thread.
|
|
164
164
|
|
|
@@ -181,9 +181,9 @@ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/send" \
|
|
|
181
181
|
}'
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
- `thread_id
|
|
185
|
-
- `reply_to_message_id
|
|
186
|
-
- `subject
|
|
184
|
+
- `thread_id`: The thread ID from the original message. Tells Gmail which thread to add this to.
|
|
185
|
+
- `reply_to_message_id`: The message ID you're replying to. The backend uses this to set `In-Reply-To` and `References` headers so Gmail threads it correctly.
|
|
186
|
+
- `subject`: Must match the original subject with "Re: " prefix.
|
|
187
187
|
|
|
188
188
|
**With attachments:**
|
|
189
189
|
```bash
|
|
@@ -317,7 +317,7 @@ curl -s -X DELETE "https://api.atris.ai/api/integrations/gmail" \
|
|
|
317
317
|
|
|
318
318
|
### "Reply to this email"
|
|
319
319
|
1. Run bootstrap
|
|
320
|
-
2. Read the message: `GET /messages/{message_id}
|
|
320
|
+
2. Read the message: `GET /messages/{message_id}`, extract `id`, `thread_id`, `from`, `subject`
|
|
321
321
|
3. Draft reply content
|
|
322
322
|
4. **Show user the reply for approval**
|
|
323
323
|
5. On approval: `POST /send` with `{to, subject: "Re: ...", body, thread_id, reply_to_message_id}`
|