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.
- package/GETTING_STARTED.md +65 -131
- package/README.md +18 -2
- package/atris/GETTING_STARTED.md +65 -131
- package/atris/PERSONA.md +5 -1
- package/atris/atris.md +122 -153
- package/atris/skills/aeo/SKILL.md +117 -0
- package/atris/skills/atris/SKILL.md +49 -25
- package/atris/skills/create-member/SKILL.md +29 -9
- package/atris/skills/endgame/SKILL.md +9 -0
- package/atris/skills/research-search/SKILL.md +167 -0
- package/atris/skills/research-search/arxiv_search.py +157 -0
- package/atris/skills/research-search/program.md +48 -0
- package/atris/skills/research-search/results.tsv +6 -0
- package/atris/skills/research-search/scholar_search.py +154 -0
- package/atris/skills/tidy/SKILL.md +36 -21
- package/atris/team/_template/MEMBER.md +2 -0
- package/atris/team/validator/MEMBER.md +35 -1
- package/atris.md +118 -178
- package/bin/atris.js +46 -12
- package/cli/__pycache__/atris_code.cpython-314.pyc +0 -0
- package/cli/__pycache__/runtime_guard.cpython-312.pyc +0 -0
- package/cli/__pycache__/runtime_guard.cpython-314.pyc +0 -0
- package/cli/atris_code.py +889 -0
- package/cli/runtime_guard.py +693 -0
- package/commands/align.js +16 -0
- package/commands/app.js +316 -0
- package/commands/autopilot.js +863 -23
- package/commands/brainstorm.js +7 -5
- package/commands/business.js +677 -2
- package/commands/clean.js +19 -3
- package/commands/computer.js +2022 -43
- package/commands/context-sync.js +5 -0
- package/commands/integrations.js +14 -9
- package/commands/lifecycle.js +12 -0
- package/commands/plugin.js +24 -0
- package/commands/pull.js +86 -11
- package/commands/push.js +153 -9
- package/commands/serve.js +1 -0
- package/commands/sync.js +272 -76
- package/commands/verify.js +50 -1
- package/commands/wiki.js +27 -2
- package/commands/workflow.js +24 -9
- package/lib/file-ops.js +13 -1
- package/lib/journal.js +23 -0
- package/lib/manifest.js +3 -0
- package/lib/scorecard.js +42 -4
- package/lib/sync-telemetry.js +59 -0
- package/lib/todo.js +6 -0
- package/lib/wiki.js +150 -6
- package/lib/workspace-safety.js +87 -0
- package/package.json +2 -1
- package/utils/api.js +19 -0
- package/utils/auth.js +25 -1
- package/utils/config.js +24 -0
- package/utils/update-check.js +16 -0
|
@@ -47,7 +47,41 @@ tools: []
|
|
|
47
47
|
|
|
48
48
|
## Your Job
|
|
49
49
|
|
|
50
|
-
|
|
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
|
|
1
|
+
# atris
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
10
|
+
On session start, before responding:
|
|
10
11
|
|
|
11
|
-
1.
|
|
12
|
-
- `atris/logs/YYYY/YYYY-MM-DD.md`
|
|
13
|
-
- `atris/MAP.md`
|
|
14
|
-
- `atris/
|
|
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.
|
|
17
|
+
2. Show this box, then ask what to work on if no task was already given.
|
|
17
18
|
|
|
18
19
|
```
|
|
19
20
|
┌─────────────────────────────────────────────────────────────┐
|
|
20
|
-
│
|
|
21
|
+
│ atris [stage] │
|
|
21
22
|
├─────────────────────────────────────────────────────────────┤
|
|
22
|
-
│
|
|
23
|
-
│ • [2-3 items from Completed
|
|
23
|
+
│ recent │
|
|
24
|
+
│ • [2-3 items from Completed] │
|
|
24
25
|
├─────────────────────────────────────────────────────────────┤
|
|
25
|
-
│
|
|
26
|
-
│ ► [from In Progress
|
|
26
|
+
│ now │
|
|
27
|
+
│ ► [from In Progress] ····················· [in progress] │
|
|
27
28
|
│ [from Backlog] ····························── [next] │
|
|
28
29
|
├─────────────────────────────────────────────────────────────┤
|
|
29
|
-
│
|
|
30
|
-
│ • [from Inbox
|
|
30
|
+
│ inbox ([count]) │
|
|
31
|
+
│ • [from Inbox] │
|
|
31
32
|
└─────────────────────────────────────────────────────────────┘
|
|
32
|
-
|
|
33
|
-
Stage: PLAN → do → review (capitalize current stage)
|
|
34
33
|
```
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
If a task was already given, show the box and proceed with that task.
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
## operating rules
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
You can move fast. You do not get to move blindly.
|
|
41
40
|
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
+
If you cannot honor these rules, stop, write why in the journal, and ask the human before continuing.
|
|
47
56
|
|
|
48
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
│
|
|
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
|
-
|
|
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
|
-
##
|
|
115
|
+
## sweep
|
|
158
116
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
##
|
|
126
|
+
## journal
|
|
171
127
|
|
|
172
128
|
```
|
|
173
|
-
## Completed
|
|
174
|
-
- **C1:** Description [
|
|
129
|
+
## Completed
|
|
130
|
+
- **C1:** Description [reviewed]
|
|
175
131
|
|
|
176
|
-
## In Progress
|
|
132
|
+
## In Progress
|
|
177
133
|
- **T1:** Description
|
|
178
|
-
**Stage:**
|
|
179
|
-
**Claimed by:**
|
|
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
|
-
|
|
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
|
-
|
|
147
|
+
Context is a cache. Disk is truth. Route discoveries as they happen:
|
|
208
148
|
|
|
209
|
-
|
|
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
|
-
|
|
158
|
+
Do not batch. Nothing important should live only in memory.
|
|
212
159
|
|
|
213
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
+
Each has real examples in `lessons.md`. Before nontrivial execution, read the relevant recent lessons.
|
|
225
170
|
|
|
226
|
-
|
|
171
|
+
## upkeep
|
|
227
172
|
|
|
228
|
-
|
|
173
|
+
Pages that summarize or reference other files declare their sources in YAML frontmatter:
|
|
229
174
|
|
|
230
|
-
|
|
231
|
-
-
|
|
232
|
-
|
|
233
|
-
-
|
|
234
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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('
|
|
202
|
+
console.log('atris — an 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
|
-
|
|
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
|
|
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
|
|
1336
|
-
if (
|
|
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('
|
|
1579
|
+
console.log('atris — navigator agent');
|
|
1546
1580
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
1547
1581
|
console.log('');
|
|
1548
1582
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|