atris 2.5.5 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/GETTING_STARTED.md +2 -2
  2. package/atris/GETTING_STARTED.md +2 -2
  3. package/atris/policies/atris-design.md +200 -15
  4. package/atris/skills/design/SKILL.md +32 -7
  5. package/bin/atris.js +34 -10
  6. package/commands/auth.js +317 -67
  7. package/commands/context-sync.js +226 -0
  8. package/commands/pull.js +118 -40
  9. package/commands/push.js +150 -61
  10. package/lib/manifest.js +222 -0
  11. package/package.json +9 -4
  12. package/utils/auth.js +127 -0
  13. package/AGENT.md +0 -35
  14. package/atris/experiments/README.md +0 -118
  15. package/atris/experiments/_examples/smoke-keep-revert/README.md +0 -45
  16. package/atris/experiments/_examples/smoke-keep-revert/candidate.py +0 -8
  17. package/atris/experiments/_examples/smoke-keep-revert/loop.py +0 -129
  18. package/atris/experiments/_examples/smoke-keep-revert/measure.py +0 -47
  19. package/atris/experiments/_examples/smoke-keep-revert/program.md +0 -3
  20. package/atris/experiments/_examples/smoke-keep-revert/proposals/bad_patch.py +0 -19
  21. package/atris/experiments/_examples/smoke-keep-revert/proposals/fix_patch.py +0 -22
  22. package/atris/experiments/_examples/smoke-keep-revert/reset.py +0 -21
  23. package/atris/experiments/_examples/smoke-keep-revert/results.tsv +0 -5
  24. package/atris/experiments/_examples/smoke-keep-revert/visual.svg +0 -52
  25. package/atris/experiments/_fixtures/invalid/BadName/loop.py +0 -1
  26. package/atris/experiments/_fixtures/invalid/BadName/program.md +0 -3
  27. package/atris/experiments/_fixtures/invalid/BadName/results.tsv +0 -1
  28. package/atris/experiments/_fixtures/invalid/bloated-context/loop.py +0 -1
  29. package/atris/experiments/_fixtures/invalid/bloated-context/measure.py +0 -1
  30. package/atris/experiments/_fixtures/invalid/bloated-context/program.md +0 -6
  31. package/atris/experiments/_fixtures/invalid/bloated-context/results.tsv +0 -1
  32. package/atris/experiments/_fixtures/valid/good-experiment/loop.py +0 -1
  33. package/atris/experiments/_fixtures/valid/good-experiment/measure.py +0 -1
  34. package/atris/experiments/_fixtures/valid/good-experiment/program.md +0 -3
  35. package/atris/experiments/_fixtures/valid/good-experiment/results.tsv +0 -1
  36. package/atris/experiments/_template/pack/loop.py +0 -3
  37. package/atris/experiments/_template/pack/measure.py +0 -13
  38. package/atris/experiments/_template/pack/program.md +0 -3
  39. package/atris/experiments/_template/pack/reset.py +0 -3
  40. package/atris/experiments/_template/pack/results.tsv +0 -1
  41. package/atris/experiments/benchmark_runtime.py +0 -81
  42. package/atris/experiments/benchmark_validate.py +0 -70
  43. package/atris/experiments/validate.py +0 -92
  44. package/atris/team/navigator/journal/2026-02-23.md +0 -6
@@ -164,8 +164,8 @@ This syncs your local `atris.md` and agent templates to the latest version. Re-r
164
164
  ## Need Help?
165
165
 
166
166
  - **Full spec:** Read `atris.md` for technical details
167
- - **Issues:** https://github.com/atrislabs/atris.md/issues
168
- - **Docs:** https://github.com/atrislabs/atris.md
167
+ - **Issues:** https://github.com/atrislabs/atris/issues
168
+ - **Docs:** https://github.com/atrislabs/atris
169
169
 
170
170
  ---
171
171
 
@@ -164,8 +164,8 @@ This syncs your local `atris.md` and agent templates to the latest version. Re-r
164
164
  ## Need Help?
165
165
 
166
166
  - **Full spec:** Read `atris.md` for technical details
167
- - **Issues:** https://github.com/atrislabs/atris.md/issues
168
- - **Docs:** https://github.com/atrislabs/atris.md
167
+ - **Issues:** https://github.com/atrislabs/atris/issues
168
+ - **Docs:** https://github.com/atrislabs/atris
169
169
 
170
170
  ---
171
171
 
@@ -19,33 +19,93 @@ this is the "distribution center" — statistically average, aesthetically dead.
19
19
 
20
20
  ## typography
21
21
 
22
- **avoid:** inter, roboto, open sans, lato, system defaults
22
+ **avoid:** inter, roboto, open sans, lato, arial, montserrat, system defaults. also avoid monospace as lazy shorthand for "technical/developer" vibes.
23
23
 
24
24
  **try instead:**
25
- - monospace for dev tools: jetbrains mono, fira code
26
- - editorial vibes: playfair display, crimson pro
27
- - clean technical: ibm plex, source sans
25
+ - instead of inter instrument sans, plus jakarta sans, outfit
26
+ - instead of roboto → onest, figtree, urbanist
27
+ - instead of open sans source sans 3, nunito sans, dm sans
28
+ - editorial/premium → fraunces, newsreader, lora, playfair display, crimson pro
29
+ - dev tools → jetbrains mono, fira code
30
+ - clean technical → ibm plex, source sans
28
31
 
29
32
  **the move:** pick ONE distinctive font. use weight extremes (200 vs 800, not 400 vs 500). size jumps should be dramatic (3x), not timid (1.2x).
30
33
 
34
+ **type scale:** use a modular scale with fluid sizing. 5 sizes covers most needs:
35
+
36
+ | role | size | use |
37
+ |------|------|-----|
38
+ | xs | 0.75rem | captions, legal |
39
+ | sm | 0.875rem | secondary UI, metadata |
40
+ | base | 1rem | body text |
41
+ | lg | 1.25-1.5rem | subheadings, lead |
42
+ | xl+ | 2-4rem | headlines, hero |
43
+
44
+ use `clamp()` for fluid sizing: `clamp(1rem, 0.5rem + 2vw, 2rem)`. use `ch` units for measure: `max-width: 65ch` for readable body text.
45
+
46
+ **vertical rhythm:** your `line-height` should be the base unit for all vertical spacing. if body is `line-height: 1.5` on `16px` (= 24px), spacing values should be multiples of 24px.
47
+
48
+ **font loading:** prevent layout shift with proper loading:
49
+ ```css
50
+ @font-face {
51
+ font-family: 'CustomFont';
52
+ src: url('font.woff2') format('woff2');
53
+ font-display: swap;
54
+ }
55
+ ```
56
+ match fallback metrics with `size-adjust`, `ascent-override`, `descent-override` to minimize FOUT reflow.
57
+
31
58
  ---
32
59
 
33
60
  ## color
34
61
 
35
- **avoid:** purple/violet on white, generic startup palettes, safe grays
62
+ **avoid:** purple/violet on white, generic startup palettes, safe grays, pure black (#000), pure white (#fff), the AI color palette (cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds), gradient text for "impact"
36
63
 
37
64
  **the move:** commit to a palette and stick to it. use css variables. one dominant color with a sharp accent beats five evenly-distributed colors.
38
65
 
39
- dark backgrounds are easier to make look good. steal from places you like linear.app, vercel.com, raycast.com, arc browser.
66
+ **use OKLCH:** modern, perceptually uniform color space. equal steps in lightness actually look equal.
67
+ ```css
68
+ :root {
69
+ --brand: oklch(65% 0.2 250);
70
+ --brand-light: oklch(90% 0.05 250);
71
+ --brand-dark: oklch(30% 0.15 250);
72
+ }
73
+ ```
74
+
75
+ use `color-mix()` for variants: `color-mix(in oklch, var(--brand) 80%, white)`. use `light-dark()` for theme-aware values.
76
+
77
+ **tint your neutrals:** never use pure gray. always tint toward your brand hue — even 0.01 chroma in OKLCH creates subconscious cohesion:
78
+ ```css
79
+ --gray-100: oklch(95% 0.01 250); /* not #f5f5f5 */
80
+ --gray-900: oklch(15% 0.01 250); /* not #1a1a1a */
81
+ ```
82
+
83
+ **gray on color:** never put gray text on colored backgrounds. it looks washed out. use a darker shade of the background color or transparency instead.
84
+
85
+ dark backgrounds are easier to make look good. steal from places you like — linear.app, vercel.com, raycast.com, arc browser. but don't default to dark mode with glowing accents — it looks "cool" without requiring actual design decisions.
40
86
 
41
87
  ---
42
88
 
43
89
  ## layout
44
90
 
45
- **avoid:** the template look — hero section, 3 feature cards, testimonial carousel, big footer. every ai does this.
91
+ **avoid:** the template look — hero section, 3 feature cards, testimonial carousel, big footer. every ai does this. also avoid:
92
+ - wrapping everything in cards — not everything needs a container
93
+ - nesting cards inside cards — visual noise, flatten the hierarchy
94
+ - identical card grids — same-sized cards with icon + heading + text, repeated endlessly
95
+ - the hero metric layout — big number, small label, supporting stats, gradient accent
96
+ - centering everything — left-aligned text with asymmetric layouts feels more designed
97
+ - same spacing everywhere — without rhythm, layouts feel monotonous
46
98
 
47
99
  **the move:** break the grid sometimes. asymmetry is interesting. whitespace is a feature, not wasted space. don't cram everything into 16px/24px spacing — use dramatic gaps.
48
100
 
101
+ **fluid spacing:** use `clamp()` for spacing that breathes on larger screens:
102
+ ```css
103
+ padding: clamp(1rem, 3vw, 4rem);
104
+ gap: clamp(1.5rem, 4vw, 6rem);
105
+ ```
106
+
107
+ **container queries:** use `@container` for component-level responsiveness instead of only viewport breakpoints. components should adapt to their container, not just the screen.
108
+
49
109
  ---
50
110
 
51
111
  ## motion
@@ -58,10 +118,52 @@ dark backgrounds are easier to make look good. steal from places you like — li
58
118
  - buttons that follow the cursor (harder to click, not clever)
59
119
  - FAQ/content that breaks if you scroll past before the fade-in finishes
60
120
  - animations that swap styles endlessly without purpose (rotating shapes, morphing buttons)
121
+ - bounce or elastic easing — they feel dated and tacky. real objects decelerate smoothly.
122
+
123
+ **the move:** one well-timed animation beats ten scattered ones. page load with staggered reveals (50-100ms delays) creates more impact than hover effects on every button.
124
+
125
+ **easing:** use exponential easing for natural deceleration:
126
+ ```css
127
+ --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1);
128
+ --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
129
+ ```
130
+ never linear, never bounce, never elastic. 150-300ms duration for most transitions.
131
+
132
+ **only animate transform and opacity.** never animate width, height, padding, margin — they trigger layout recalculation and cause jank. for height animations, use `grid-template-rows` transitions.
133
+
134
+ **reduced motion:** always respect `prefers-reduced-motion`. provide a beautiful static alternative:
135
+ ```css
136
+ @media (prefers-reduced-motion: reduce) {
137
+ *, *::before, *::after {
138
+ animation-duration: 0.01ms !important;
139
+ transition-duration: 0.01ms !important;
140
+ }
141
+ }
142
+ ```
61
143
 
62
- **the move:** one well-timed animation beats ten scattered ones. page load with staggered reveals (animation-delay) creates more impact than hover effects on every button.
144
+ ---
145
+
146
+ ## interaction
147
+
148
+ **progressive disclosure:** start simple, reveal sophistication through interaction. basic options first, advanced behind expandable sections. hover states that reveal secondary actions.
149
+
150
+ **optimistic UI:** update immediately, sync later. makes everything feel fast.
63
151
 
64
- css transitions: 200-300ms, ease-out. that's it.
152
+ **empty states:** design empty states that teach the interface, not just say "nothing here." show users what to do next.
153
+
154
+ **button hierarchy:** don't make every button primary. use ghost buttons, text links, secondary styles. hierarchy matters.
155
+
156
+ **every interactive element needs ALL states:**
157
+ - default — resting
158
+ - hover — subtle feedback (brighten, scale 1.02-1.05)
159
+ - focus — visible keyboard indicator (never remove without replacement)
160
+ - active — click/tap feedback
161
+ - disabled — clearly non-interactive
162
+ - loading — async action feedback
163
+ - error — validation state
164
+ - success — confirmation
165
+
166
+ missing states create confusion and broken experiences.
65
167
 
66
168
  ---
67
169
 
@@ -79,6 +181,25 @@ test every hover on mobile. if something only works on hover, it's broken for ha
79
181
 
80
182
  ---
81
183
 
184
+ ## responsive
185
+
186
+ **avoid:** hiding critical functionality on mobile — adapt the interface, don't amputate it. also avoid:
187
+ - fixed widths that break on small screens
188
+ - touch targets smaller than 44x44px
189
+ - text smaller than 14px on mobile
190
+ - horizontal scroll from content overflow
191
+
192
+ **the move:** mobile-first, then enhance for larger screens. use fluid layouts with `clamp()` and container queries. adapt the interface for different contexts — don't just shrink it.
193
+
194
+ ```css
195
+ /* container queries > media queries for components */
196
+ @container (min-width: 400px) {
197
+ .card { flex-direction: row; }
198
+ }
199
+ ```
200
+
201
+ ---
202
+
82
203
  ## scroll behavior
83
204
 
84
205
  **avoid:** scrolljacking — never override native browser scroll with custom scroll logic. it feels like "moving through molasses" and users hate it.
@@ -95,21 +216,43 @@ use the "peeking" technique: let a few pixels of the next section peek above the
95
216
 
96
217
  **the move:** add depth. layered gradients, subtle patterns, mesh effects. backgrounds set mood — flat backgrounds say "I didn't think about this."
97
218
 
219
+ but don't use glassmorphism everywhere — blur effects, glass cards, glow borders used decoratively rather than purposefully. it's AI slop.
220
+
98
221
  ---
99
222
 
100
- ## context matters
223
+ ## accessibility
101
224
 
102
- don't impose an aesthetic match the project. a fintech dashboard shouldn't look like a gaming site. read the room.
225
+ this isn't optionalit's part of good design.
103
226
 
104
- if the project already has a design system, use it. don't fight it to show off.
227
+ - **contrast:** 4.5:1 minimum for text, 3:1 for UI components (WCAG AA)
228
+ - **focus indicators:** visible, high-contrast focus rings on all interactive elements. never `outline: none` without a replacement.
229
+ - **semantic HTML:** use proper heading hierarchy, landmarks, buttons (not divs), labels on inputs
230
+ - **color independence:** never use color as the only indicator. add icons, labels, or patterns alongside.
231
+ - **keyboard nav:** logical tab order, no keyboard traps, all functionality accessible without a mouse
105
232
 
106
233
  ---
107
234
 
108
- ## the convergence trap
235
+ ## visual details
109
236
 
110
- even with this guidance you'll find new defaults. space grotesk becomes the new inter. dark mode with amber accents becomes the new purple gradient.
237
+ **avoid:**
238
+ - glassmorphism everywhere (blur effects, glass cards, glow borders)
239
+ - rounded elements with thick colored border on one side — lazy accent
240
+ - sparklines as decoration — tiny charts that convey nothing meaningful
241
+ - rounded rectangles with generic drop shadows — safe, forgettable
242
+ - large icons with rounded corners above every heading — templated look
243
+ - modals unless there's truly no better alternative — modals are lazy
244
+ - non-system emojis used as decoration (lazy AI tell)
111
245
 
112
- vary your choices. alternate themes. try different directions between projects.
246
+ ---
247
+
248
+ ## ux writing
249
+
250
+ **make every word earn its place.**
251
+ - don't repeat information users can already see
252
+ - don't repeat the same information — redundant headers, intros that restate the heading
253
+ - labels and buttons should be unambiguous
254
+ - error copy should help users fix the problem, not blame them
255
+ - empty states should guide toward action
113
256
 
114
257
  ---
115
258
 
@@ -144,6 +287,22 @@ if a stranger can't answer all four in 5 seconds of looking at your hero, rewrit
144
287
 
145
288
  ---
146
289
 
290
+ ## context matters
291
+
292
+ don't impose an aesthetic — match the project. a fintech dashboard shouldn't look like a gaming site. read the room.
293
+
294
+ if the project already has a design system, use it. don't fight it to show off.
295
+
296
+ ---
297
+
298
+ ## the convergence trap
299
+
300
+ even with this guidance you'll find new defaults. space grotesk becomes the new inter. dark mode with amber accents becomes the new purple gradient.
301
+
302
+ vary your choices. alternate themes. try different directions between projects.
303
+
304
+ ---
305
+
147
306
  ## before shipping
148
307
 
149
308
  - can you name the aesthetic in 2-3 words?
@@ -154,12 +313,38 @@ if a stranger can't answer all four in 5 seconds of looking at your hero, rewrit
154
313
  - does scrolling feel native?
155
314
  - does the hero pass the H1 test (what/who/why/CTA)?
156
315
  - are all screenshots/assets crisp?
316
+ - do all interactive elements have all states (hover/focus/active/disabled/loading/error)?
317
+ - does it meet WCAG AA contrast (4.5:1 text, 3:1 UI)?
318
+ - does it work on mobile (touch targets, no horizontal scroll, readable text)?
319
+ - does it respect `prefers-reduced-motion`?
157
320
  - would a designer immediately clock this as ai-generated?
158
321
 
159
322
  if the last answer is yes, you're not done.
160
323
 
161
324
  ---
162
325
 
326
+ ## the ai slop test
327
+
328
+ > "if you showed this interface to someone and said 'AI made this,' would they believe you immediately? if yes, that's the problem."
329
+
330
+ the fingerprints of AI-generated work:
331
+ - inter/roboto/system fonts
332
+ - purple-to-blue gradients
333
+ - cyan-on-dark color schemes
334
+ - glassmorphism everywhere
335
+ - gradient text on headings/metrics
336
+ - hero metric layout (big number + small label)
337
+ - identical card grids
338
+ - bounce/elastic easing
339
+ - dark mode with neon accents
340
+ - sparklines as decoration
341
+ - rounded rectangles with drop shadows
342
+ - large icons with rounded corners above headings
343
+
344
+ a distinctive interface should make someone ask "how was this made?" not "which AI made this?"
345
+
346
+ ---
347
+
163
348
  ## references
164
349
 
165
350
  look at these for inspiration, not to copy:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: design
3
3
  description: Frontend aesthetics policy. Use when building UI, components, landing pages, dashboards, or any frontend work. Prevents generic ai-generated look.
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  allowed-tools: Read, Write, Edit, Bash, Glob
6
6
  tags:
7
7
  - design
@@ -21,26 +21,47 @@ This skill uses the Atris workflow:
21
21
 
22
22
  ## Quick Reference
23
23
 
24
- **Typography:** avoid inter/roboto/system fonts. pick one distinctive font, use weight extremes (200 vs 800).
24
+ **Typography:** avoid inter/roboto/arial/system fonts. pick one distinctive font, use weight extremes (200 vs 800). size jumps should be dramatic (3x). use `clamp()` for fluid sizing. use `ch` units for measure (`max-width: 65ch`).
25
25
 
26
- **Color:** commit to a palette. dark backgrounds easier to make good. steal from linear.app, vercel.com, raycast.com.
26
+ Font alternatives: instead of Inter Instrument Sans, Plus Jakarta Sans, Outfit. Instead of Roboto → Onest, Figtree, Urbanist. Editorial → Fraunces, Newsreader, Lora.
27
27
 
28
- **Layout:** break the hero + 3 cards + footer template. asymmetry is interesting. dramatic whitespace.
28
+ **Color:** commit to a palette. use OKLCH for perceptually uniform colors. tint your neutrals toward your brand hue (never pure gray). never put gray text on colored backgrounds. never use pure black (#000) or pure white (#fff). avoid the AI palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark.
29
29
 
30
- **Motion:** one well-timed animation beats ten scattered ones. 200-300ms ease-out. no cursor-following lines, no meteor effects, no buttons that chase the cursor.
30
+ ```css
31
+ --brand: oklch(65% 0.2 250);
32
+ --gray-100: oklch(95% 0.01 250); /* tinted, not pure gray */
33
+ ```
34
+
35
+ **Layout:** break the hero + 3 cards + footer template. no card-in-card nesting. no identical card grids. asymmetry is interesting. dramatic whitespace. use container queries for component-level responsiveness. fluid spacing with `clamp()`.
36
+
37
+ **Motion:** one well-timed animation beats ten scattered ones. use exponential easing (`cubic-bezier(0.25, 1, 0.5, 1)`), never bounce/elastic. 150-300ms duration. only animate transform and opacity. always respect `prefers-reduced-motion`. no cursor-following lines, no meteor effects, no buttons that chase the cursor.
31
38
 
32
- **Hover:** make elements feel inviting on hover (brighten, subtle scale). never fade out, shift, or hide content behind hover. hover doesn't exist on mobile.
39
+ **Interaction:** progressive disclosure start simple, reveal complexity. optimistic UI — update immediately, sync later. every interactive element needs ALL states: default, hover, focus, active, disabled, loading, error, success. don't make every button primary.
40
+
41
+ **Hover:** make elements feel inviting on hover (brighten, subtle scale 1.02-1.05). never fade out, shift, or hide content behind hover. hover doesn't exist on mobile.
33
42
 
34
43
  **Scroll:** never override native scroll. use "peeking" (show a few px of next section) instead of full-screen hero + scroll arrow.
35
44
 
45
+ **Responsive:** mobile-first. touch targets 44x44px minimum. no text under 14px on mobile. no horizontal scroll. container queries > media queries for components. adapt, don't amputate.
46
+
47
+ **Accessibility:** 4.5:1 contrast for text, 3:1 for UI (WCAG AA). visible focus indicators always. semantic HTML. never use color alone as an indicator. keyboard nav with logical tab order.
48
+
36
49
  **Hero (H1 test):** must answer in 5 seconds — what is it, who is it for, why care, what's the CTA.
37
50
 
38
51
  **Assets:** high-res screenshots only. no fake dashboards with primary colors. no decorative non-system emojis.
39
52
 
40
- **Backgrounds:** add depth. gradients, patterns, mesh effects. flat = boring.
53
+ **Backgrounds:** add depth. gradients, patterns, mesh effects. flat = boring. but no glassmorphism everywhere — that's AI slop.
41
54
 
42
55
  **Hierarchy:** 2-3 text levels max. don't mix 5 competing styles.
43
56
 
57
+ **Visual anti-patterns:** no glassmorphism, no gradient text, no sparklines as decoration, no rounded-rect-with-colored-border, no large icons with rounded corners above headings, no hero metric layout (big number + small label), no modals unless truly necessary.
58
+
59
+ ## The AI Slop Test
60
+
61
+ > "if you showed this to someone and said 'AI made this,' would they believe you immediately? if yes, that's the problem."
62
+
63
+ Fingerprints: inter/roboto, purple-to-blue gradients, cyan-on-dark, glassmorphism, gradient text, hero metrics, identical card grids, bounce easing, dark mode with neon, sparklines as decoration, rounded rectangles with drop shadows.
64
+
44
65
  ## Before Shipping Checklist
45
66
 
46
67
  Run through `atris/policies/atris-design.md` "before shipping" section:
@@ -52,6 +73,10 @@ Run through `atris/policies/atris-design.md` "before shipping" section:
52
73
  - scrolling feels native?
53
74
  - hero passes H1 test (what/who/why/CTA)?
54
75
  - all assets crisp?
76
+ - all interactive elements have all states (hover/focus/active/disabled/loading/error)?
77
+ - WCAG AA contrast (4.5:1 text, 3:1 UI)?
78
+ - works on mobile (44px touch targets, no horizontal scroll, readable text)?
79
+ - respects `prefers-reduced-motion`?
55
80
  - would a designer clock this as ai-generated?
56
81
 
57
82
  ## Atris Commands
package/bin/atris.js CHANGED
@@ -251,11 +251,12 @@ function showHelp() {
251
251
  console.log(' console - Start/attach always-on coding console (tmux daemon)');
252
252
  console.log(' agent - Select which Atris agent to use');
253
253
  console.log(' chat - Chat with the selected Atris agent');
254
- console.log(' login - Authenticate (use --token <t> for non-interactive)');
255
- console.log(' logout - Remove credentials');
256
- console.log(' whoami - Show auth status');
257
- console.log(' switch - Switch account (atris switch <name>)');
258
- console.log(' accounts - List saved accounts');
254
+ console.log(' login - Sign in or add another account');
255
+ console.log(' logout - Sign out of current account');
256
+ console.log(' whoami - Show active account');
257
+ console.log(' switch - Switch account globally (atris switch <name>)');
258
+ console.log(' use - Set account for this terminal only (atris use <name>)');
259
+ console.log(' accounts - Manage accounts (list, add, remove)');
259
260
  console.log('');
260
261
  console.log('Integrations:');
261
262
  console.log(' gmail - Email commands (inbox, read)');
@@ -384,7 +385,7 @@ const { planAtris: planCmd, doAtris: doCmd, reviewAtris: reviewCmd } = require('
384
385
 
385
386
  // Check if this is a known command or natural language input
386
387
  const knownCommands = ['init', 'log', 'status', 'analytics', 'visualize', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review',
387
- 'activate', 'agent', 'chat', 'console', 'login', 'logout', 'whoami', 'switch', 'accounts', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
388
+ 'activate', 'agent', 'chat', 'console', 'login', 'logout', 'whoami', 'switch', 'use', 'accounts', '_resolve', '_profile-email', 'shell-init', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
388
389
  'clean', 'verify', 'search', 'skill', 'member', 'plugin', 'experiments', 'pull', 'push', 'business', 'sync',
389
390
  'gmail', 'calendar', 'twitter', 'slack', 'integrations'];
390
391
 
@@ -697,6 +698,11 @@ if (command === 'init') {
697
698
  console.error(`✗ Log sync failed: ${error.message || error}`);
698
699
  process.exit(1);
699
700
  });
701
+ } else if (subcommand && subcommand !== '--help' && !subcommand.startsWith('-')) {
702
+ // Business log: atris log <business-slug>
703
+ require('../commands/context-sync').businessLog(subcommand)
704
+ .then(() => process.exit(0))
705
+ .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
700
706
  } else {
701
707
  logCmd();
702
708
  }
@@ -725,8 +731,18 @@ if (command === 'init') {
725
731
  require('../commands/auth').whoamiAtris();
726
732
  } else if (command === 'switch') {
727
733
  require('../commands/auth').switchAccount();
734
+ } else if (command === 'use') {
735
+ require('../commands/auth').useAccount();
728
736
  } else if (command === 'accounts') {
729
- require('../commands/auth').listAccountsCmd();
737
+ require('../commands/auth').accountsCmd();
738
+ } else if (command === '_resolve') {
739
+ // Hidden: resolve a profile name query → print exact profile name
740
+ require('../commands/auth').resolveProfile();
741
+ } else if (command === '_profile-email') {
742
+ // Hidden: print email for a profile name
743
+ require('../commands/auth').profileEmail();
744
+ } else if (command === 'shell-init') {
745
+ require('../commands/auth').shellInit();
730
746
  } else if (command === 'visualize') {
731
747
  console.log('ℹ️ "atris visualize" is a legacy helper. Visualization is now built into "atris plan".');
732
748
  console.log(' Prefer: atris plan');
@@ -865,9 +881,17 @@ if (command === 'init') {
865
881
  process.exit(1);
866
882
  });
867
883
  } else if (command === 'status') {
868
- const isQuick = process.argv.includes('--quick') || process.argv.includes('-q');
869
- const isJson = process.argv.includes('--json');
870
- statusCmd(isQuick, isJson);
884
+ const subcommand = process.argv[3];
885
+ if (subcommand && !subcommand.startsWith('-')) {
886
+ // Business status: atris status <business-slug>
887
+ require('../commands/context-sync').businessStatus(subcommand)
888
+ .then(() => process.exit(0))
889
+ .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
890
+ } else {
891
+ const isQuick = process.argv.includes('--quick') || process.argv.includes('-q');
892
+ const isJson = process.argv.includes('--json');
893
+ statusCmd(isQuick, isJson);
894
+ }
871
895
  } else if (command === 'analytics') {
872
896
  require('../commands/analytics').analyticsAtris();
873
897
  } else if (command === 'clean') {