atris 3.2.0 → 3.11.0

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 (55) hide show
  1. package/GETTING_STARTED.md +65 -131
  2. package/README.md +18 -2
  3. package/atris/GETTING_STARTED.md +65 -131
  4. package/atris/PERSONA.md +5 -1
  5. package/atris/atris.md +122 -153
  6. package/atris/skills/aeo/SKILL.md +117 -0
  7. package/atris/skills/atris/SKILL.md +49 -25
  8. package/atris/skills/create-member/SKILL.md +29 -9
  9. package/atris/skills/endgame/SKILL.md +9 -0
  10. package/atris/skills/research-search/SKILL.md +167 -0
  11. package/atris/skills/research-search/arxiv_search.py +157 -0
  12. package/atris/skills/research-search/program.md +48 -0
  13. package/atris/skills/research-search/results.tsv +6 -0
  14. package/atris/skills/research-search/scholar_search.py +154 -0
  15. package/atris/skills/tidy/SKILL.md +36 -21
  16. package/atris/team/_template/MEMBER.md +2 -0
  17. package/atris/team/validator/MEMBER.md +35 -1
  18. package/atris.md +118 -178
  19. package/bin/atris.js +46 -12
  20. package/cli/__pycache__/atris_code.cpython-314.pyc +0 -0
  21. package/cli/__pycache__/runtime_guard.cpython-312.pyc +0 -0
  22. package/cli/__pycache__/runtime_guard.cpython-314.pyc +0 -0
  23. package/cli/atris_code.py +889 -0
  24. package/cli/runtime_guard.py +693 -0
  25. package/commands/align.js +16 -0
  26. package/commands/app.js +316 -0
  27. package/commands/autopilot.js +863 -23
  28. package/commands/brainstorm.js +7 -5
  29. package/commands/business.js +677 -2
  30. package/commands/clean.js +19 -3
  31. package/commands/computer.js +2022 -43
  32. package/commands/context-sync.js +5 -0
  33. package/commands/integrations.js +14 -9
  34. package/commands/lifecycle.js +12 -0
  35. package/commands/plugin.js +24 -0
  36. package/commands/pull.js +86 -11
  37. package/commands/push.js +153 -9
  38. package/commands/serve.js +1 -0
  39. package/commands/sync.js +272 -76
  40. package/commands/verify.js +50 -1
  41. package/commands/wiki.js +27 -2
  42. package/commands/workflow.js +24 -9
  43. package/lib/file-ops.js +13 -1
  44. package/lib/journal.js +23 -0
  45. package/lib/manifest.js +3 -0
  46. package/lib/scorecard.js +42 -4
  47. package/lib/sync-telemetry.js +59 -0
  48. package/lib/todo.js +6 -0
  49. package/lib/wiki.js +150 -6
  50. package/lib/workspace-safety.js +87 -0
  51. package/package.json +2 -1
  52. package/utils/api.js +19 -0
  53. package/utils/auth.js +25 -1
  54. package/utils/config.js +24 -0
  55. package/utils/update-check.js +16 -0
@@ -47,7 +47,41 @@ tools: []
47
47
 
48
48
  ## Your Job
49
49
 
50
- After executor finishes:
50
+ You gate the work at **two** points: before it runs (plan-review) and after it runs (review).
51
+
52
+ ### Plan-review — before executor starts
53
+
54
+ Read the navigator's plan fresh, with no memory of the planning context. Check:
55
+
56
+ 1. **Verify is falsifiable** — points at a rubric or test that can fail at t=0, not `true`, `echo ok`, or similar. Prefer `atris verify <slug> --section <name>`.
57
+ 2. **Files declared** — explicit paths, not empty, not vague ("various files").
58
+ 3. **Rollback named** — a commit, checkpoint, or `git revert` is enough.
59
+ 4. **Plan matches declared fields** — the plan's ASCII/narrative aligns with Files/Exit/Verify.
60
+ 5. **No contradictions in lessons.md** — recent failures don't warn against this approach.
61
+
62
+ Output EXACTLY one of these two formats as the last thing in your response:
63
+
64
+ ```
65
+ SIGNOFF: <one sentence on why the plan is safe>
66
+ ```
67
+
68
+ or
69
+
70
+ ```
71
+ REJECT: <one sentence on what is wrong>
72
+ FIX: <one sentence on what must change>
73
+ PROPOSED:
74
+ Files: <concrete path list>
75
+ Exit: <sharp, observable done condition>
76
+ Verify: <falsifiable shell command, prefer atris verify <slug> --section preflight>
77
+ Rollback: <git revert <sha> or concrete checkpoint>
78
+ ```
79
+
80
+ Be a drafting partner, not just a critic. When you REJECT, write the PROPOSED block as a concrete draft the human can accept as-is, edit, or reject. Skip any PROPOSED field that is already correct in the original task. Omit the whole PROPOSED block only if the rejection is about scope or intent rather than a field that can be drafted.
81
+
82
+ No preamble, no explanation before the verdict. The autopilot parses this literally.
83
+
84
+ ### Review — after executor finishes
51
85
 
52
86
  1. **Ultrathink** — Think 3x: Does this match build.md? Edge cases? Breaking changes?
53
87
  2. **Run tests** — All tests must pass
package/atris.md CHANGED
@@ -1,250 +1,190 @@
1
- # atris.md
1
+ # atris
2
2
 
3
- > Drop this file anywhere. AI agent team activates.
3
+ Atris exists because agents make work fast but unsafe without memory, ownership,
4
+ and rollback. This file is the workspace protocol: read reality from disk, choose
5
+ the right scope, claim work before changing it, verify before calling it done, and
6
+ leave a trail another agent or human can trust.
4
7
 
5
- ---
6
-
7
- ## ACTIVATE
8
+ ## activate
8
9
 
9
- **STOP. When you read this or hear "atris activate", do this immediately:**
10
+ On session start, before responding:
10
11
 
11
- 1. Load context (ONE time, remember for session):
12
- - `atris/logs/YYYY/YYYY-MM-DD.md` (today's journal)
13
- - `atris/MAP.md` (navigation overview)
14
- - `atris/team/*.md` (all agent specs)
12
+ 1. Read:
13
+ - `atris/logs/YYYY/YYYY-MM-DD.md` today's journal
14
+ - `atris/MAP.md` navigation
15
+ - `atris/wiki/STATUS.md` if present — current memory snapshot
15
16
 
16
- 2. Output this EXACT box:
17
+ 2. Show this box, then ask what to work on if no task was already given.
17
18
 
18
19
  ```
19
20
  ┌─────────────────────────────────────────────────────────────┐
20
- ATRIS [STAGE]
21
+ atris [stage]
21
22
  ├─────────────────────────────────────────────────────────────┤
22
- RECENT
23
- │ • [2-3 items from Completed]
23
+ recent
24
+ │ • [2-3 items from Completed]
24
25
  ├─────────────────────────────────────────────────────────────┤
25
- NOW
26
- │ ► [from In Progress 🔄] ····················· [in progress]
26
+ now
27
+ │ ► [from In Progress] ····················· [in progress]
27
28
  │ [from Backlog] ····························── [next] │
28
29
  ├─────────────────────────────────────────────────────────────┤
29
- INBOX ([count]) │
30
- │ • [from Inbox section]
30
+ inbox ([count]) │
31
+ │ • [from Inbox]
31
32
  └─────────────────────────────────────────────────────────────┘
32
-
33
- Stage: PLAN → do → review (capitalize current stage)
34
33
  ```
35
34
 
36
- 3. Then ask: "What would you like to work on?"
35
+ If a task was already given, show the box and proceed with that task.
37
36
 
38
- **DO NOT explain. DO NOT summarize. Output the box, then ask.**
37
+ ## operating rules
39
38
 
40
- ---
39
+ You can move fast. You do not get to move blindly.
41
40
 
42
- ## NEXT
41
+ Before changing anything, state:
42
+ - the goal
43
+ - the files or systems in scope
44
+ - what "done" means
45
+ - how it will be checked
46
+ - what happens if it fails
43
47
 
44
- **STOP. When you hear "atris next", do this immediately:**
48
+ Then:
49
+ - do not execute if another agent owns the same task or files
50
+ - do not call something complete without verification
51
+ - do not take irreversible actions without approval from the human
52
+ - do not hide state outside markdown, logs, diffs, or the journal
53
+ - do not edit the rules that judge you — the reward config, the authority policy, or this file
45
54
 
46
- 1. Read today's journal
55
+ If you cannot honor these rules, stop, write why in the journal, and ask the human before continuing.
47
56
 
48
- 2. Check state and progress through stages:
57
+ Labels used below:
58
+ - `guarded` — checked by code or a pre-commit hook; bypassing is a bug
59
+ - `expected` — convention; honor it or stop
49
60
 
50
- **No task in progress?**
51
- - If Backlog has task → move to In Progress, stage = PLAN
52
- - Else if Inbox has items → ask "Convert [item] to task?"
53
- - Else → go to BRAINSTORM
61
+ ## task shape
54
62
 
55
- **Task in progress?** Progress to next stage:
56
- - **PLAN** → Show ASCII plan, wait for approval → next stage = DO
57
- - **DO** → Execute the work → next stage = REVIEW
58
- - **REVIEW** → Run validator checks (test, verify, quality check)
59
- - If passes → move to Completed, show DONE
60
- - If fails → show issues, stay in DO
61
-
62
- 3. Output this EXACT box:
63
+ Every task in `TODO.md`:
63
64
 
64
65
  ```
65
- ┌─────────────────────────────────────────────────────────────┐
66
- NEXT: [task name] [PLAN|DO|REVIEW]
67
- │ │
68
- [1-2 sentences: what you'll do in this stage] │
69
- └─────────────────────────────────────────────────────────────┘
66
+ - **T#:** <title> [tier] [kind]
67
+ **Owner:** <slug>
68
+ **Files:** <paths touched>
69
+ **Exit:** <observable done condition>
70
+ **Verify:** <shell command, exits 0 on success>
71
+ **After:** <T# deps or none>
72
+ **Rollback:** <commit/checkpoint or "none (gray)">
70
73
  ```
71
74
 
72
- 4. Wait for input. User says anything → execute current stage → update journal.
75
+ | Field | Meaning | Enforcement |
76
+ |---|---|---|
77
+ | tier | `agent` proceeds, `gray` queues for approval, `human` never attempted by you | guarded |
78
+ | kind | `explore` for ambiguous, `execute` for precise | expected |
79
+ | Files | declared upfront; becomes the file lock | guarded (Swarlo claim) |
80
+ | Verify | must exit 0 for the task to be complete | guarded (tick halts if missing) |
81
+ | Rollback | how to undo; `git revert <sha>` for most tasks | expected |
73
82
 
74
- 5. After REVIEW passes, show:
83
+ Deeper project work uses `atris/features/<slug>/` with `idea.md` (plan), `build.md` (steps), `validate.md` (checks). The task points at the triptych; the triptych holds the long form.
75
84
 
76
- ```
77
- ┌─────────────────────────────────────────────────────────────┐
78
- │ DONE: [task name] [✓ REVIEWED] │
79
- │ │
80
- │ [1-2 sentences: what was done + review result] │
81
- └─────────────────────────────────────────────────────────────┘
82
- ```
85
+ Verify cannot be a raw shell shortcut; it must call a rubric or test that can fail before the work is done. Prefer `atris verify <slug> --section <name>`, which extracts the fenced bash under `## <name>` in `validate.md` and runs it. The rubric is read-only, deterministic, and references only the working tree.
83
86
 
84
- **Every task goes through PLAN → DO → REVIEW. No shortcuts.**
87
+ ## routing
85
88
 
86
- ---
89
+ Before picking up work, decide scope:
90
+ - single project → route to that project's `atris/team/` and `TODO.md`
91
+ - crosses projects → route to `atris/team/cross-project-architect/` and plan the dependency order first
87
92
 
88
- ## WORKFLOW
93
+ The human is the constructor. You multiply. Handoff fidelity lives in the files, not in context.
89
94
 
90
- ```
91
- scout → plan → do → review
92
- ```
93
-
94
- - **SCOUT** — Read relevant files first. Understand before you act. Report what you found.
95
- - **PLAN** — ASCII visualization, get approval, NO code yet
96
- - **DO** — Execute step-by-step, update journal
97
- - **REVIEW** — Test, validate, clean up, delete completed tasks
98
-
99
- ---
100
-
101
- ## TASK RULES
102
-
103
- Every task must follow these rules. No exceptions.
95
+ ## next
104
96
 
105
- **One job per task.** If a task touches more than 2-3 files, break it down. If you can't describe "done" in one sentence, it's too big.
106
-
107
- **Clear exit condition.** Every task states what "done" looks like. Not "improve auth" — instead: "Add session check to upload handler. Done when: unauthenticated requests return 401 and test passes."
108
-
109
- **Tag every task:**
110
- - `[explore]` — Ambiguous. Needs reading, research, judgment. Output is understanding.
111
- - `[execute]` — Precise. Route is clear. Just do it. Output is code or artifact.
112
-
113
- **Explore before execute.** When starting a new area of work, the first tasks should be `[explore]`. Read the files. Map the space. Report what you found. Then plan `[execute]` tasks based on what you learned.
114
-
115
- **Sequence matters.** Order tasks so each one builds context for the next. Early tasks should teach you about the problem. Later tasks use that knowledge.
116
-
117
- ---
97
+ Move one task at a time through plan do review.
118
98
 
119
- ## AGENTS
99
+ - **plan** — read relevant files, produce an ASCII visualization, wait for approval. No code.
100
+ - **plan-review** — the validator reads the plan fresh and signs off with `SIGNOFF:` or halts with `REJECT:` + `FIX:` + an optional `PROPOSED:` block (concrete draft of Files / Exit / Verify / Rollback to replace). Plan does not move to do without signoff. The validator is a drafting partner, not just a critic — on REJECT it proposes the sharper rubric rather than leaving the human to guess. Codex is optional escalation when `ATRIS_USE_CODEX=1` or the task carries `[codex]`.
101
+ - **do** — claim the task (move it to In Progress with `Claimed by:` and a timestamp), execute step by step, update `MAP.md` and the journal as reality changes.
102
+ - **review** — run the task's `Verify:` command, read the diff, run the relevant tests, append a one-line lesson to `lessons.md`, move the task to Completed.
120
103
 
121
- | Command | Agent | Guardrail |
122
- |---------|-------|-----------|
123
- | `atris plan` | navigator | Plans only, NO code |
124
- | `atris do` | executor | Builds only, NO unplanned work |
125
- | `atris review` | validator | Checks only, NO new features |
126
- | `atris brainstorm` | brainstormer | Ideas only, NO code |
127
-
128
- `atris next` = auto-selects agent based on journal state
129
-
130
- Specs loaded at activate from `team/*.md`
131
-
132
- ---
133
-
134
- ## BRAINSTORM
135
-
136
- **When queue empty (no backlog, no inbox):**
104
+ State the next stage:
137
105
 
138
106
  ```
139
107
  ┌─────────────────────────────────────────────────────────────┐
140
- BRAINSTORM [PLAN]
141
- ├─────────────────────────────────────────────────────────────┤
142
- │ [1 sentence: what this project is] │
143
- │ │
144
- │ Ideas: │
145
- │ 1. [suggestion based on MAP.md] │
146
- │ 2. [suggestion based on journal patterns] │
147
- │ 3. [suggestion based on product gaps] │
148
- ├─────────────────────────────────────────────────────────────┤
149
- │ Pick one, remix, or "something else" │
108
+ next: [task] [plan|do|review]
109
+ │ [1-2 sentences on this stage] │
150
110
  └─────────────────────────────────────────────────────────────┘
151
111
  ```
152
112
 
153
- **NO extra reads. Use loaded context. 3 ideas max.**
154
-
155
- ---
113
+ If the queue is empty, suggest three ideas from `MAP.md`, the journal, or product gaps. No extra reads. Three max.
156
114
 
157
- ## INDEX
115
+ ## sweep
158
116
 
159
- | File | Purpose |
160
- |------|---------|
161
- | `MAP.md` | Where is X? (navigation) |
162
- | `TODO.md` | Task queue (target: 0) |
163
- | `logs/YYYY/MM-DD.md` | Journal (daily) |
164
- | `PERSONA.md` | Communication style |
165
- | `team/` | Agent behaviors |
166
- | `atrisDev.md` | Full spec (reference) |
117
+ Periodically, and before closing an endgame, clean:
118
+ - stale tasks (claimed >3 days, never finished)
119
+ - broken `MAP.md` refs (auto-heal where possible, flag the rest)
120
+ - stale wiki pages (source newer than `last_compiled`)
121
+ - orphan pages (unlinked from anywhere)
122
+ - empty placeholder sections
167
123
 
168
- ---
124
+ `atris clean` runs this. `atris clean --dry-run` previews.
169
125
 
170
- ## JOURNAL FORMAT
126
+ ## journal
171
127
 
172
128
  ```
173
- ## Completed
174
- - **C1:** Description [✓ REVIEWED]
129
+ ## Completed
130
+ - **C1:** Description [reviewed]
175
131
 
176
- ## In Progress 🔄
132
+ ## In Progress
177
133
  - **T1:** Description
178
- **Stage:** PLAN | DO | REVIEW
179
- **Claimed by:** [Name] at [Time]
134
+ **Stage:** plan | do | review
135
+ **Claimed by:** <agent> at <ISO timestamp>
180
136
 
181
137
  ## Backlog
182
138
  - **T2:** Description
183
139
 
184
140
  ## Inbox
185
141
  - **I1:** Description
186
- ```
187
142
 
188
- ---
189
-
190
- ## PERSISTENCE
191
-
192
- Context window = cache. Disk = truth. Route discoveries as they happen.
193
-
194
- | You discover... | Write to... | Format |
195
- |---------------------|----------------------|----------------------|
196
- | Code location | MAP.md | file:line reference |
197
- | New task | TODO.md | Task + exit condition |
198
- | Decision / tradeoff | Journal → Notes | Timestamped line |
199
- | Something learned | lessons.md | One-line lesson |
200
- | Work finished | Journal → Completed | C#: description |
201
- | Source changed | Re-check referencing pages | Frontmatter: last_compiled |
202
-
203
- Don't batch. Don't wait for session end. Nothing important should live only in-context.
204
-
205
- ---
143
+ ## Notes
144
+ [timestamped lines — one per discovery, decision, or tick]
145
+ ```
206
146
 
207
- ## KNOWLEDGE COMPILATION
147
+ Context is a cache. Disk is truth. Route discoveries as they happen:
208
148
 
209
- The workspace is a knowledge compiler. Raw sources in, structured understanding out.
149
+ | You discover... | Write to... |
150
+ |---|---|
151
+ | a code location | `MAP.md` (file:line) |
152
+ | a new task | `TODO.md` |
153
+ | a decision or tradeoff | journal `## Notes` |
154
+ | something learned | `lessons.md` (one line) |
155
+ | work finished | journal `## Completed` (C#) |
156
+ | a source changed | re-check pages that reference it |
210
157
 
211
- **Every markdown page that summarizes or references other files MUST have frontmatter:**
158
+ Do not batch. Nothing important should live only in memory.
212
159
 
213
- ```yaml
214
- ---
215
- last_compiled: YYYY-MM-DD
216
- sources:
217
- - path/to/source1
218
- - path/to/source2
219
- ---
220
- ```
160
+ ## failure smells
221
161
 
222
- **Staleness rule:** If any source file was modified after `last_compiled`, the page is stale. On review, re-read the source and update the page. Update `last_compiled` when done.
162
+ If you notice these, stop and flag do not continue:
163
+ - **loop** — the same suggestion fires tick after tick, nothing changes on disk
164
+ - **drift** — `MAP.md` file:line refs no longer match the code
165
+ - **stale task** — a backlog task references a file or symbol that no longer exists
166
+ - **hidden side effect** — an action changed external state (email sent, money moved, deploy) without a queued approval
167
+ - **unverifiable completion** — a task marked complete without a `Verify:` command that actually ran
223
168
 
224
- **What counts as a source:** Any file a page summarizes, references, or draws conclusions from. Code files for MAP.md. Documents for wiki pages. Meeting notes for decision pages.
169
+ Each has real examples in `lessons.md`. Before nontrivial execution, read the relevant recent lessons.
225
170
 
226
- **Compounding:** When you answer a question that required synthesis across multiple pages, file the answer back as a new page (or update an existing one). Explorations accumulate — they don't disappear.
171
+ ## upkeep
227
172
 
228
- **Activation:** On session start, if `atris/wiki/STATUS.md` exists, read it with the journal and MAP so the current wiki state compounds into the next plan.
173
+ Pages that summarize or reference other files declare their sources in YAML frontmatter:
229
174
 
230
- **Linting:** During `atris review`, check for:
231
- - Stale pages (source newer than last_compiled)
232
- - Orphan pages (no inbound references)
233
- - Contradictions between pages
234
- - Concepts mentioned but lacking their own page
175
+ ---
176
+ last_compiled: YYYY-MM-DD
177
+ sources:
178
+ - path/to/source1
179
+ - path/to/source2
180
+ ---
235
181
 
236
- ---
182
+ If any source was modified after `last_compiled`, the page is stale. Re-read the sources, update the page, bump `last_compiled`.
237
183
 
238
- ## RULES
184
+ Compounding: when you answer a question that required synthesis across pages, file the answer back — as a new page or into an existing one. Explorations accumulate.
239
185
 
240
- - 3-4 sentences max
241
- - ASCII visualization before any plan
242
- - Check MAP.md before touching code
243
- - Update journal after completing work
244
- - Delete tasks when done (target: 0)
245
- - Persist as you go (see PERSISTENCE)
246
- - After any file change, flag wiki pages that reference it as stale
186
+ Linting during review catches stale pages, orphans, contradictions, and concepts mentioned but missing their own page.
247
187
 
248
188
  ---
249
189
 
250
- *Full spec and setup instructions: atrisDev.md*
190
+ *Canonical copy: workspace root `atris.md`. Project copies are distributed; `atris update` syncs them. Full spec: `atrisDev.md`.*
package/bin/atris.js CHANGED
@@ -199,7 +199,7 @@ function consoleCmd() {
199
199
  function showHelp() {
200
200
  console.log('');
201
201
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
202
- console.log('atrisDevThe new way to build with AI');
202
+ console.log('atrisan operating system for intelligence');
203
203
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
204
204
  console.log('');
205
205
  console.log('Quick Start:');
@@ -273,6 +273,7 @@ function showHelp() {
273
273
  console.log('');
274
274
  console.log('Business:');
275
275
  console.log(' business init <name> - Create canonical business workspace (cloud + local)');
276
+ console.log(' business onboard - Onboard from sparse input (--name, --website, --contact)');
276
277
  console.log(' business add <slug> - Connect a business');
277
278
  console.log(' business list - Show connected businesses');
278
279
  console.log(' business remove <slug> - Disconnect a business');
@@ -289,6 +290,7 @@ function showHelp() {
289
290
  console.log(' cr --all - Audit all backend services');
290
291
  console.log('');
291
292
  console.log('Cloud & agents:');
293
+ console.log(' computer - Talk directly to the AI computer (bash or agent exec)');
292
294
  console.log(' console - Start/attach always-on coding console (tmux daemon)');
293
295
  console.log(' agent - Select which Atris agent to use');
294
296
  console.log(' chat - Chat with the selected Atris agent');
@@ -416,7 +418,7 @@ if (command === 'help' || command === '--help' || command === '-h') {
416
418
 
417
419
  // Core command handlers — loaded eagerly (used by interactiveEntry default path)
418
420
  const { initAtris: initCmd } = require('../commands/init');
419
- const { syncAtris: syncCmd } = require('../commands/sync');
421
+ const { syncAtris: syncCmd, syncAtrisAll: syncAllCmd } = require('../commands/sync');
420
422
  const { logAtris: logCmd } = require('../commands/log');
421
423
  const { activateAtris: activateCmd } = require('../commands/activate');
422
424
  const { statusAtris: statusCmd } = require('../commands/status');
@@ -427,7 +429,7 @@ const { planAtris: planCmd, doAtris: doCmd, reviewAtris: reviewCmd } = require('
427
429
  // Check if this is a known command or natural language input
428
430
  const knownCommands = ['init', 'log', 'status', 'analytics', 'visualize', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review', 'release',
429
431
  'activate', '_activate', 'agent', 'chat', 'console', 'login', 'logout', 'whoami', 'switch', 'use', 'accounts', '_resolve', '_profile-email', '_switch-session', 'shell-init', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
430
- 'clean', 'verify', 'search', 'skill', 'member', 'learn', 'plugin', 'experiments', 'pull', 'push', 'align', 'terminal', 'diff', 'business', 'sync',
432
+ 'clean', 'verify', 'search', 'skill', 'member', 'app', 'learn', 'plugin', 'experiments', 'pull', 'push', 'align', 'terminal', 'computer', 'diff', 'business', 'sync',
431
433
  'ingest', 'query', 'lint', 'loop',
432
434
  'gmail', 'calendar', 'twitter', 'slack', 'integrations', 'setup', 'clean-workspace', 'cw',
433
435
  'fork', 'browse', 'publish', 'sleep', 'wake', 'feedback', 'wiki', 'code-review', 'cr', 'soul', 'fleet'];
@@ -796,7 +798,15 @@ if (command === 'init') {
796
798
  } else if (command === 'activate') {
797
799
  activateCmd();
798
800
  } else if (command === 'update' || command === 'sync') {
799
- syncCmd();
801
+ if (process.argv.includes('--all')) {
802
+ const dryRun = process.argv.includes('--dry-run');
803
+ const force = process.argv.includes('--force') || process.argv.includes('--yes') || process.argv.includes('-y');
804
+ Promise.resolve(syncAllCmd({ dryRun, force }))
805
+ .then(() => process.exit(0))
806
+ .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
807
+ } else {
808
+ syncCmd();
809
+ }
800
810
  } else if (command === 'upgrade') {
801
811
  upgradeAtris().then(() => process.exit(0)).catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
802
812
  } else if (command === 'chat') {
@@ -1001,6 +1011,13 @@ if (command === 'init') {
1001
1011
  const dryRun = process.argv.includes('--dry-run') || process.argv.includes('-n');
1002
1012
  require('../commands/clean').cleanAtris({ dryRun });
1003
1013
  } else if (command === 'verify') {
1014
+ const sectionIdx = process.argv.indexOf('--section');
1015
+ if (sectionIdx > 0 && process.argv[sectionIdx + 1]) {
1016
+ const slug = process.argv[3] && !process.argv[3].startsWith('--') ? process.argv[3] : null;
1017
+ const section = process.argv[sectionIdx + 1];
1018
+ const code = require('../commands/verify').verifyRubric(slug, section);
1019
+ process.exit(code);
1020
+ }
1004
1021
  const taskId = process.argv[3] || null;
1005
1022
  require('../commands/verify').verifyAtris(taskId);
1006
1023
  } else if (command === 'release') {
@@ -1056,6 +1073,10 @@ if (command === 'init') {
1056
1073
  const subcommand = process.argv[3];
1057
1074
  const args = process.argv.slice(4);
1058
1075
  require('../commands/member').memberCommand(subcommand, ...args);
1076
+ } else if (command === 'app') {
1077
+ const subcommand = process.argv[3];
1078
+ const args = process.argv.slice(4);
1079
+ require('../commands/app').appCommand(subcommand, ...args);
1059
1080
  } else if (command === 'pull') {
1060
1081
  require('../commands/pull').pullAtris()
1061
1082
  .then(() => process.exit(0))
@@ -1072,6 +1093,10 @@ if (command === 'init') {
1072
1093
  require('../commands/terminal').terminalAtris()
1073
1094
  .then(() => process.exit(0))
1074
1095
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
1096
+ } else if (command === 'computer') {
1097
+ require('../commands/computer').runComputer()
1098
+ .then(() => process.exit(0))
1099
+ .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
1075
1100
  } else if (command === 'diff') {
1076
1101
  let diffSlug = process.argv[3];
1077
1102
  if (!diffSlug || diffSlug.startsWith('-')) {
@@ -1238,13 +1263,17 @@ async function agentAtris() {
1238
1263
  process.exit(1);
1239
1264
  }
1240
1265
 
1241
- // Check if logged in
1242
- const credentials = loadCredentials();
1243
-
1244
- if (!credentials || !credentials.token) {
1266
+ // Check if logged in (with token refresh)
1267
+ const ensured = await ensureValidCredentials();
1268
+ if (ensured.error === 'not_logged_in' || !ensured.credentials?.token) {
1245
1269
  console.error('✗ Error: Not logged in. Run "atris login" first.');
1246
1270
  process.exit(1);
1247
1271
  }
1272
+ if (ensured.error) {
1273
+ console.error(`✗ Error: Authentication failed: ${ensured.detail || ensured.error}. Run "atris login" to re-authenticate.`);
1274
+ process.exit(1);
1275
+ }
1276
+ const credentials = ensured.credentials;
1248
1277
 
1249
1278
  console.log('🔍 Fetching your agents...\n');
1250
1279
 
@@ -1331,12 +1360,17 @@ async function chatAtris() {
1331
1360
  process.exit(1);
1332
1361
  }
1333
1362
 
1334
- // Check credentials
1335
- const credentials = loadCredentials();
1336
- if (!credentials || !credentials.token) {
1363
+ // Check credentials (with token refresh)
1364
+ const ensured = await ensureValidCredentials();
1365
+ if (ensured.error === 'not_logged_in' || !ensured.credentials?.token) {
1337
1366
  console.error('✗ Error: Not logged in. Run "atris login" first.');
1338
1367
  process.exit(1);
1339
1368
  }
1369
+ if (ensured.error) {
1370
+ console.error(`✗ Error: Authentication failed: ${ensured.detail || ensured.error}. Run "atris login" to re-authenticate.`);
1371
+ process.exit(1);
1372
+ }
1373
+ const credentials = ensured.credentials;
1340
1374
 
1341
1375
  // If message provided, one-shot mode
1342
1376
  if (message) {
@@ -1542,7 +1576,7 @@ async function atrisDevEntry(userInput = null) {
1542
1576
  }
1543
1577
 
1544
1578
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
1545
- console.log('🤖 atrisDev Protocol Navigator Agent');
1579
+ console.log('atrisnavigator agent');
1546
1580
  console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
1547
1581
  console.log('');
1548
1582