atris 3.74.4 → 3.74.5

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 (117) hide show
  1. package/FOR_AGENTS.md +12 -12
  2. package/atris/AGENTS.md +7 -7
  3. package/atris/CLAUDE.md +10 -10
  4. package/atris/policies/atris-backend.md +1 -1
  5. package/atris/policies/atris-design.md +71 -71
  6. package/atris/policies/design-seed.md +28 -28
  7. package/atris/policies/writing.md +1 -1
  8. package/atris/skills/apps/SKILL.md +3 -3
  9. package/atris/skills/atris-feedback/SKILL.md +2 -2
  10. package/atris/skills/autopilot/SKILL.md +10 -10
  11. package/atris/skills/blocks/SKILL.md +16 -16
  12. package/atris/skills/calendar/SKILL.md +1 -1
  13. package/atris/skills/clawhub/atris/SKILL.md +4 -4
  14. package/atris/skills/clawhub/philosophy-of-work/SKILL.md +7 -7
  15. package/atris/skills/create-app/SKILL.md +18 -18
  16. package/atris/skills/create-member/SKILL.md +11 -11
  17. package/atris/skills/design/SKILL.md +1 -1
  18. package/atris/skills/drive/SKILL.md +25 -25
  19. package/atris/skills/email-agent/SKILL.md +11 -11
  20. package/atris/skills/endgame/SKILL.md +33 -33
  21. package/atris/skills/magic-inbox/SKILL.md +15 -15
  22. package/atris/skills/notion/SKILL.md +1 -1
  23. package/atris/skills/ramp/SKILL.md +7 -7
  24. package/atris/skills/research-search/SKILL.md +7 -7
  25. package/atris/skills/slides/SKILL.md +7 -7
  26. package/atris/skills/tidy/SKILL.md +11 -11
  27. package/atris/skills/wake/SKILL.md +11 -11
  28. package/atris/skills/writing/SKILL.md +5 -5
  29. package/atris/team/_template/SOUL.md +3 -3
  30. package/atris/team/brainstormer/MEMBER.md +2 -2
  31. package/atris/team/launcher/MEMBER.md +2 -2
  32. package/atris/team/mission-lead/MISSION.md +7 -7
  33. package/atris/team/opus-overnight/MISSION.md +16 -16
  34. package/atris/team/opus-overnight/STEERING.md +5 -5
  35. package/atris.md +9 -0
  36. package/bin/atris.js +16 -3
  37. package/commands/campaign.js +17 -2
  38. package/commands/card.js +19 -12
  39. package/commands/engine.js +92 -17
  40. package/commands/gm.js +30 -0
  41. package/commands/idea.js +263 -0
  42. package/commands/init.js +11 -2
  43. package/commands/land.js +39 -18
  44. package/commands/mission.js +4 -3
  45. package/commands/ninety-nine.js +288 -0
  46. package/commands/one-lap.js +46 -27
  47. package/commands/reel.js +12 -7
  48. package/commands/sync.js +10 -2
  49. package/lib/campaign-keep.js +23 -8
  50. package/lib/campaign-loop.js +24 -5
  51. package/lib/claude-boot-block.js +7 -4
  52. package/lib/engine-registry.js +139 -1
  53. package/lib/fleet.js +11 -2
  54. package/lib/gm-bet.js +338 -34
  55. package/lib/gm-phone-page.js +325 -33
  56. package/lib/gm-phone.js +5 -1
  57. package/lib/gm-season.js +14 -0
  58. package/lib/headless-chrome.js +39 -0
  59. package/lib/idea-gate.js +33 -0
  60. package/lib/idea-inbox.js +220 -0
  61. package/lib/idea-ledger.js +196 -0
  62. package/lib/idea-tick.js +384 -0
  63. package/lib/known-commands.js +1 -1
  64. package/lib/member-engine.js +1 -0
  65. package/lib/ninety-nine-sync.js +156 -0
  66. package/lib/ninety-nine.js +247 -0
  67. package/lib/opening-lines.js +94 -0
  68. package/lib/roster-markdown.js +39 -1
  69. package/lib/roster-models.js +1 -1
  70. package/lib/roster-swap.js +353 -0
  71. package/lib/spawn-env.js +29 -2
  72. package/lib/wish-audit.js +14 -0
  73. package/lib/yes-lock.js +343 -253
  74. package/lib/zen-apply.js +5 -3
  75. package/lib/zen.js +13 -1
  76. package/package.json +1 -1
  77. package/templates/business-starter/CLAUDE.md +7 -7
  78. package/templates/business-starter/MAP.md +1 -1
  79. package/templates/business-starter/TODO.md +1 -1
  80. package/templates/business-starter/atris.md +2 -2
  81. package/templates/business-starter/context/README.md +6 -6
  82. package/templates/business-starter/context/live-workspace.md +1 -1
  83. package/templates/business-starter/goals.md +1 -1
  84. package/templates/business-starter/instructions.md +1 -1
  85. package/templates/business-starter/memory.md +4 -4
  86. package/templates/business-starter/persona.md +3 -3
  87. package/templates/business-starter/policies/LESSONS.md +1 -1
  88. package/templates/business-starter/reports/README.md +1 -1
  89. package/templates/business-starter/skills/README.md +1 -1
  90. package/templates/business-starter/team/README.md +1 -1
  91. package/templates/business-starter/team/START_HERE.md +1 -1
  92. package/templates/business-starter/team/_template/SOUL.md +3 -3
  93. package/templates/business-starter/team/comms/SOUL.md +2 -2
  94. package/templates/business-starter/team/ops/SOUL.md +4 -4
  95. package/templates/business-starter/team/research/SOUL.md +3 -3
  96. package/templates/business-starter/wiki/index.md +1 -1
  97. package/templates/research-canonical/CLAUDE.md +7 -7
  98. package/templates/research-canonical/MAP.md +1 -1
  99. package/templates/research-canonical/TODO.md +1 -1
  100. package/templates/research-canonical/atris.md +2 -2
  101. package/templates/research-canonical/context/README.md +8 -8
  102. package/templates/research-canonical/context/live-workspace.md +1 -1
  103. package/templates/research-canonical/goals.md +2 -2
  104. package/templates/research-canonical/instructions.md +1 -1
  105. package/templates/research-canonical/memory.md +4 -4
  106. package/templates/research-canonical/persona.md +1 -1
  107. package/templates/research-canonical/policies/LESSONS.md +1 -1
  108. package/templates/research-canonical/reports/README.md +1 -1
  109. package/templates/research-canonical/skills/README.md +1 -1
  110. package/templates/research-canonical/team/README.md +1 -1
  111. package/templates/research-canonical/team/eval/SOUL.md +1 -1
  112. package/templates/research-canonical/team/experiment/SOUL.md +2 -2
  113. package/templates/research-canonical/team/hypothesis/SOUL.md +3 -3
  114. package/templates/research-canonical/team/literature/SOUL.md +2 -2
  115. package/templates/research-canonical/wiki/briefs/research-program.md +1 -1
  116. package/templates/research-canonical/wiki/index.md +1 -1
  117. 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 — the next thing /autopilot should ship. Each tick reads both sides and shows them in the visual status block.
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 — call `/loop` for that.
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** — 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.
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` — 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
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` — read inbox/wiki/logs, pick the next horizon, do not just run forever.
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 — 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.
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 — the only difference is slide breaks.
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** — invalid JSON silently
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 — a stat card
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 — a ring toward a target
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 — line / bar / area / donut
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 — great for "rent rises vs own falls"):
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 — an editable grid
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 — a picture
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 — don't rely on generation for something you're about to present).
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 — an embedded AI answer
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** — 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.
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 — no app needed. This auto-finds obelisk's 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 — the file must live under it.)
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 — the doc should read clean at a squint.
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` — that is for updating existing events.
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 — 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."
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 — Codebase Intelligence
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 — [Project Name] Navigation Guide
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 — dev server startup, request lifecycle, build pipeline.
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 — 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."
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** — how companies and agents should run together.
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** — 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
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` — humans only.
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 — no value sent):
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 * * *"` — daily at 8am UTC
226
- - `"0 */6 * * *"` — every 6 hours
227
- - `"0 9 * * 1"` — weekly Monday 9am UTC
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 — 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
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 — who the agent is
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* — not what it does (MEMBER.md) or how it communicates (PERSONA.md). Use the template at `atris/team/_template/SOUL.md`.
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** — 3-5 convictions that guide judgment when rules don't apply. Not rules — things the agent holds true.
71
+ **Beliefs**: 3-5 convictions that guide judgment when rules don't apply. Not rules, things the agent holds true.
72
72
 
73
- **Values** — 2-3 values ordered by priority. What the agent optimizes for in ambiguous situations.
73
+ **Values**: 2-3 values ordered by priority. What the agent optimizes for in ambiguous situations.
74
74
 
75
- **Lessons** — Start empty. These get synthesized from the agent's journal entries over time. Not copied from elsewhere — earned from experience.
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** — 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.
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** — One sentence that captures how this agent thinks. The inner monologue, not the output style.
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 — what this member does>
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** — How the member communicates. Tone, style, decision-making approach. Be specific — "direct and research-driven" is better than "professional and helpful."
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** — Numbered steps the member follows. This is the core operating procedure. Each step should be a concrete action.
105
+ **Workflow**: Numbered steps the member follows. This is the core operating procedure. Each step should be a concrete action.
106
106
 
107
- **Rules** — Hard constraints. What the member must always or never do. Keep it to 3-5 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, `text-transform: uppercase`, 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.
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'` — 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
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` — plain text (default, good for Docs)
173
- - `text/html` — HTML
174
- - `application/pdf` — PDF
175
- - `text/csv` — CSV (for Sheets)
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 — creates a full copy.
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` — entire sheet
444
- - `Sheet1!A1:D10` — specific range
445
- - `Sheet1!A:A` — entire column A
446
- - `Sheet1!1:1` — entire row 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` — 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
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}` — sheetId 0 = first tab, indices are 0-based.
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 — they execute in order.
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 — bold headers, colors, borders, auto-resize, etc.
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** — show file names
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` — 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
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 — use this for all replies):**
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` — 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.
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}` — extract `id`, `thread_id`, `from`, `subject`
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}`