atris 3.12.1 → 3.14.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/README.md +39 -14
- package/bin/atris.js +39 -15
- package/commands/business.js +514 -24
- package/commands/computer.js +326 -9
- package/commands/errors.js +155 -0
- package/commands/proof.js +115 -0
- package/commands/pull.js +12 -6
- package/commands/push.js +8 -2
- package/commands/task.js +217 -0
- package/commands/visualize.js +324 -8
- package/lib/task-db.js +288 -0
- package/lib/todo-fallback.js +142 -0
- package/lib/todo.js +99 -184
- package/package.json +2 -2
- 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/README.md
CHANGED
|
@@ -4,6 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
It turns any repo into an AI workspace with shared context, a `plan -> do -> review` loop, daily logs, feature packs, and reusable skills.
|
|
6
6
|
|
|
7
|
+
Atris gives every owner persistent AI computers.
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Owner = User | Business
|
|
11
|
+
Owner has many Computers
|
|
12
|
+
Computer = workspace + files + tools + secrets + memory + agents + validation loop
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
A computer can be personal or shared by a business. It can run a job like code, research, CRM, reporting, recruiting, event ops, support, or business ops.
|
|
16
|
+
|
|
7
17
|
## For Coding Agents
|
|
8
18
|
|
|
9
19
|
If you're an agent, run:
|
|
@@ -19,6 +29,8 @@ Then read the workspace's `atris/atris.md` and follow it exactly. `atris.md` is
|
|
|
19
29
|
## What Atris Gives You
|
|
20
30
|
|
|
21
31
|
- An AI workspace on top of any repo
|
|
32
|
+
- Persistent AI computers for scoped jobs
|
|
33
|
+
- A local computer card that makes each workspace inspectable
|
|
22
34
|
- A strict `plan -> do -> review` loop
|
|
23
35
|
- Daily logs, task tracking, feature packs, and project memory
|
|
24
36
|
- Skills, team members, integrations, and cloud sync when you need them
|
|
@@ -27,7 +39,7 @@ Then read the workspace's `atris/atris.md` and follow it exactly. `atris.md` is
|
|
|
27
39
|
|
|
28
40
|
| File | Purpose |
|
|
29
41
|
|------|---------|
|
|
30
|
-
| `atris/atris.md` |
|
|
42
|
+
| `atris/atris.md` | Main instructions for agents working in this repo |
|
|
31
43
|
| `atris/MAP.md` | Navigation index with file:line refs |
|
|
32
44
|
| `atris/TODO.md` | Shared task queue |
|
|
33
45
|
| `atris/logs/YYYY/YYYY-MM-DD.md` | Daily log, inbox, notes, completions |
|
|
@@ -54,6 +66,7 @@ atris --version
|
|
|
54
66
|
```
|
|
55
67
|
|
|
56
68
|
Requires Node.js 18+.
|
|
69
|
+
`atris task` uses built-in SQLite and requires Node.js 22+.
|
|
57
70
|
|
|
58
71
|
If you want Atris cloud workspaces, businesses, or integrations, run `atris setup` after install.
|
|
59
72
|
|
|
@@ -67,15 +80,15 @@ atris
|
|
|
67
80
|
|
|
68
81
|
`atris init` scaffolds the workspace, including `atris/wiki/`. `atris` loads context and hands the workflow off to `atris/atris.md`.
|
|
69
82
|
|
|
70
|
-
If you're still shaping the idea, use `atris brainstorm`. If you want Atris to keep cycling, use `atris run` or `atris autopilot`. If you want
|
|
83
|
+
If you're still shaping the idea, use `atris brainstorm`. If you want Atris to keep cycling, use `atris run` or `atris autopilot`. If you want project memory checked for stale pages and missing context, use `atris loop`. `atris activate` surfaces wiki state from `atris/wiki/STATUS.md` when it exists.
|
|
71
84
|
|
|
72
85
|
Core loop: `plan` -> `do` -> `review`
|
|
73
86
|
|
|
74
87
|
Integrates with any agent.
|
|
75
88
|
|
|
76
|
-
## Business
|
|
89
|
+
## Business Owners
|
|
77
90
|
|
|
78
|
-
If you want a
|
|
91
|
+
If you want a shared owner for a company, lab, collective, community, artist, team, or project, use the business command instead of raw `atris init`.
|
|
79
92
|
|
|
80
93
|
```bash
|
|
81
94
|
atris business init "BLOND:ISH" --owner-email joel@blondish.world
|
|
@@ -84,9 +97,17 @@ atris business onboard --website https://blondish.world --contact "Joel Zimmerma
|
|
|
84
97
|
atris align --fix
|
|
85
98
|
```
|
|
86
99
|
|
|
87
|
-
That creates the
|
|
100
|
+
That creates the shared owner, creates its first/default computer, writes `.atris/business.json`, initializes `.atris/state/` for events and run history, and scaffolds the local `atris/` workspace under `~/arena/atris-business/<slug>/` with starter roles, a default recap template, and an initial task queue in `atris/TODO.md`.
|
|
88
101
|
|
|
89
|
-
If you do not have a neat source pack yet, `atris business onboard` is the
|
|
102
|
+
If you do not have a neat source pack yet, `atris business onboard` is the easiest intake step: give it a website, a named human, a few notes, or run it in a folder with loose files. Atris turns that into raw intake, a starter brief, a first workflow, a safe next action, and a short operator brief.
|
|
103
|
+
|
|
104
|
+
Use the owner's language when you talk about it:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
Your business runs on Atris.
|
|
108
|
+
Your lab runs on Atris.
|
|
109
|
+
Your collective runs on Atris.
|
|
110
|
+
```
|
|
90
111
|
|
|
91
112
|
You can also use bare input:
|
|
92
113
|
|
|
@@ -116,30 +137,34 @@ atris business record atris/reports/2026-04-12-operator-recap.md --outcome mixed
|
|
|
116
137
|
| `atris autopilot` | Guided loop with approvals |
|
|
117
138
|
| `atris log` | Add inbox items to today's journal |
|
|
118
139
|
| `atris status` | Show active work and completions |
|
|
140
|
+
| `atris task` | Local agent task plane with atomic claims and TODO import |
|
|
119
141
|
| `atris learn` | Manage structured learnings |
|
|
120
142
|
| `atris ingest` | Stage raw evidence into `atris/context/` and compile into `atris/wiki/` |
|
|
121
143
|
| `atris loop` | Refresh wiki health, stale/orphan signals, and next ingest candidates |
|
|
122
144
|
| `atris wiki` | Full wiki namespace: ingest, query, lint, search, log, and loop |
|
|
123
|
-
| `atris
|
|
145
|
+
| `atris receipt` | Save evidence from an agent run |
|
|
146
|
+
| `atris experiments` | Run small experiments and compare results |
|
|
147
|
+
| `atris computer card` | Show or write the local owner/computer card |
|
|
124
148
|
|
|
125
149
|
## Built-In Systems
|
|
126
150
|
|
|
127
151
|
- `atris learn` stores structured project memory in `atris/learnings.jsonl`
|
|
128
152
|
- `atris wiki` keeps repo memory in `atris/wiki/` by default, with `--cloud` when you want the remote workspace path
|
|
129
153
|
- `atris ingest` now stages local source packs under `atris/context/_ingest/`, writes a manifest receipt, and refreshes `atris/wiki/STATUS.md` plus `log.md`
|
|
130
|
-
- `atris wiki --private`
|
|
154
|
+
- `atris wiki --private` stores local-only sensitive notes under `.atris/presidio/`
|
|
131
155
|
- `atris loop` refreshes `atris/wiki/STATUS.md` and `atris/wiki/log.md`, flags stale/orphan pages, and suggests the next ingest
|
|
132
156
|
- `atris activate` loads the current wiki status so the next session starts with project memory, not just tasks
|
|
133
|
-
- `atris
|
|
157
|
+
- `atris task` keeps a local SQLite task plane for agents while `atris/TODO.md` remains the readable project board
|
|
158
|
+
- `atris experiments` runs small test packs in `atris/experiments/`
|
|
134
159
|
- `atris pull` and `atris push` sync cloud workspaces and journals
|
|
135
160
|
|
|
136
161
|
## Verifiable Feedback Loop
|
|
137
162
|
|
|
138
163
|
Under the hood, Atris can keep score on real repo work.
|
|
139
164
|
|
|
140
|
-
-
|
|
141
|
-
- `atris autopilot` can run that check after review
|
|
142
|
-
- Future
|
|
165
|
+
- Tasks can carry a `Verify:` command, so work can end on a deterministic check instead of pure prose.
|
|
166
|
+
- `atris autopilot` can run that check after review and record the result in the journal.
|
|
167
|
+
- Future task picks can use recent results, so Atris learns from repo-local history without claiming model retraining.
|
|
143
168
|
|
|
144
169
|
## Benchmark Harness
|
|
145
170
|
|
|
@@ -167,7 +192,7 @@ What to inspect:
|
|
|
167
192
|
- receipts land in `atris/experiments/endstate-baseline/artifacts/` and
|
|
168
193
|
`atris/experiments/endstate-stack/artifacts/`
|
|
169
194
|
- scores append to each pack's `results.tsv`
|
|
170
|
-
- `atris experiments compare endstate` prints the latest side-by-side
|
|
195
|
+
- `atris experiments compare endstate` prints the latest side-by-side comparison
|
|
171
196
|
- `atris experiments replay endstate` runs the full public dry-run rehearsal
|
|
172
197
|
- the benchmark contract lives at `atris/features/endstate/contract.md`
|
|
173
198
|
- the verification log lives at `atris/features/endstate/validate.md`
|
|
@@ -198,7 +223,7 @@ For Codex, copy any skill folder into `~/.codex/skills/`.
|
|
|
198
223
|
## v3.2.0
|
|
199
224
|
|
|
200
225
|
- **Staleness gate** — tasks tagged `[unverified]` are skipped at the moment of use, not pruned eagerly. Three-state model: actionable / unverified / deleted.
|
|
201
|
-
- **Lesson gate** — `isLessonResolved` checks whether a lesson already shipped before proposing new
|
|
226
|
+
- **Lesson gate** — `isLessonResolved` checks whether a lesson already shipped before proposing new work from it. Prevents the loop from re-solving solved problems.
|
|
202
227
|
- **`atris release`** — new command: tags the version, bumps package.json, creates a GitHub release, and drafts a `/launch` post in one shot.
|
|
203
228
|
- **Shell injection fix** — `checkStaleness` switched from `execSync` string interpolation to `execFileSync` with args arrays. Markdown-derived content (task titles, inbox items) no longer reaches a shell.
|
|
204
229
|
- **Codex hardening** — `atris activate` and `atris` entry point detect Codex environments and write `AGENTS.md` so Codex sessions start with workspace context.
|
package/bin/atris.js
CHANGED
|
@@ -204,19 +204,26 @@ function showHelp() {
|
|
|
204
204
|
console.log('');
|
|
205
205
|
console.log('Quick Start:');
|
|
206
206
|
console.log('');
|
|
207
|
-
console.log(' 1. atris
|
|
208
|
-
console.log(' 2. Describe what you want
|
|
209
|
-
console.log(' 3.
|
|
207
|
+
console.log(' 1. atris Open a persistent AI computer for this workspace');
|
|
208
|
+
console.log(' 2. Describe what you want run, built, researched, or validated');
|
|
209
|
+
console.log(' 3. Atris acts with context, memory, tools, and a review loop');
|
|
210
210
|
console.log('');
|
|
211
211
|
console.log('Common invocations:');
|
|
212
212
|
console.log(' atris init');
|
|
213
|
+
console.log(' atris computer');
|
|
214
|
+
console.log(' atris business init "My Company"');
|
|
213
215
|
console.log(' atris run');
|
|
214
216
|
console.log(' atris status');
|
|
215
217
|
console.log(' atris soul');
|
|
216
|
-
console.log(' atris fleet');
|
|
218
|
+
console.log(' atris fleet status');
|
|
217
219
|
console.log('');
|
|
218
220
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
219
221
|
console.log('');
|
|
222
|
+
console.log('Atris Computers:');
|
|
223
|
+
console.log(' Owner = User | Business');
|
|
224
|
+
console.log(' Owners have Computers: workspace + files + tools + secrets + memory + agents + validation');
|
|
225
|
+
console.log(' Types: code, research, CRM, reporting, recruiting, events, support, business ops');
|
|
226
|
+
console.log('');
|
|
220
227
|
console.log('Setup:');
|
|
221
228
|
console.log(' setup - Guided first-time setup (login, pick business, pull)');
|
|
222
229
|
console.log(' init - Initialize Atris in current project');
|
|
@@ -237,6 +244,7 @@ function showHelp() {
|
|
|
237
244
|
console.log(' search - Search journal history (atris search <keyword>)');
|
|
238
245
|
console.log(' clean - Housekeeping (stale tasks, archive journals, broken refs)');
|
|
239
246
|
console.log(' verify - Validate work is done (tests, MAP.md, changes)');
|
|
247
|
+
console.log(' task - Local agent task plane (atomic claims, TODO import)');
|
|
240
248
|
console.log(' release - Tag release, bump version, create GitHub release, draft /launch');
|
|
241
249
|
console.log(' learn - Project learnings (patterns, pitfalls, preferences)');
|
|
242
250
|
console.log(' ingest - Local-first wiki ingest into atris/wiki/');
|
|
@@ -247,7 +255,7 @@ function showHelp() {
|
|
|
247
255
|
console.log('Optional helpers:');
|
|
248
256
|
console.log(' brainstorm - Explore ideas conversationally before planning');
|
|
249
257
|
console.log(' autopilot - Guided loop that can clarify TODOs and run plan → do → review');
|
|
250
|
-
console.log(' visualize -
|
|
258
|
+
console.log(' visualize - Generate a Slack/deck-ready visual from a prompt');
|
|
251
259
|
console.log('');
|
|
252
260
|
console.log('Experiments:');
|
|
253
261
|
console.log(' experiments init [slug] - Prepare atris/experiments/ or scaffold a pack');
|
|
@@ -272,7 +280,7 @@ function showHelp() {
|
|
|
272
280
|
console.log(' wake [business] - Resume workspace (agents restart)');
|
|
273
281
|
console.log('');
|
|
274
282
|
console.log('Business:');
|
|
275
|
-
console.log(' business init <name> - Create
|
|
283
|
+
console.log(' business init <name> - Create shared owner + first/default computer');
|
|
276
284
|
console.log(' business onboard - Onboard from sparse input (--name, --website, --contact)');
|
|
277
285
|
console.log(' business add <slug> - Connect a business');
|
|
278
286
|
console.log(' business list - Show connected businesses');
|
|
@@ -280,7 +288,8 @@ function showHelp() {
|
|
|
280
288
|
console.log(' business team [slug] - Show members, roles, and admin access');
|
|
281
289
|
console.log(' business health <slug> - Health report (members, workspace, issues)');
|
|
282
290
|
console.log(' business audit - One-line health summary of all businesses');
|
|
283
|
-
console.log(' business
|
|
291
|
+
console.log(' business doctor - Catch stale cache, alias, and folder bindings');
|
|
292
|
+
console.log(' business create <name> - Cloud-only business record; add --workspace to also scaffold local');
|
|
284
293
|
console.log(' business connect <svc> - Wire a skill/integration');
|
|
285
294
|
console.log(' business notify <mode> - Set notification mode (digest/silent/push)');
|
|
286
295
|
console.log(' business deploy <slug> - Push local business to cloud');
|
|
@@ -290,8 +299,11 @@ function showHelp() {
|
|
|
290
299
|
console.log(' cr --all - Audit all backend services');
|
|
291
300
|
console.log('');
|
|
292
301
|
console.log('Cloud & agents:');
|
|
293
|
-
console.log(' computer -
|
|
302
|
+
console.log(' computer - Open a scoped AI computer (cloud/local, personal/business)');
|
|
303
|
+
console.log(' receipt - Save evidence from an agent run');
|
|
294
304
|
console.log(' console - Start/attach always-on coding console (tmux daemon)');
|
|
305
|
+
console.log(' soul - Show, snapshot, or fork workspace identity');
|
|
306
|
+
console.log(' fleet - Inspect local fleet status');
|
|
295
307
|
console.log(' agent - Select which Atris agent to use');
|
|
296
308
|
console.log(' chat - Chat with the selected Atris agent');
|
|
297
309
|
console.log(' login - Sign in or add another account');
|
|
@@ -432,10 +444,10 @@ const { planAtris: planCmd, doAtris: doCmd, reviewAtris: reviewCmd } = require('
|
|
|
432
444
|
// Check if this is a known command or natural language input
|
|
433
445
|
const knownCommands = ['init', 'log', 'status', 'analytics', 'visualize', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review', 'release',
|
|
434
446
|
'activate', '_activate', 'agent', 'chat', 'console', 'login', 'logout', 'whoami', 'switch', 'use', 'accounts', '_resolve', '_profile-email', '_switch-session', 'shell-init', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
|
|
435
|
-
'clean', 'verify', 'search', 'skill', 'member', 'app', 'learn', 'plugin', 'experiments', 'pull', 'push', 'align', 'terminal', 'computer', 'diff', 'business', 'sync',
|
|
436
|
-
'ingest', 'query', 'lint', 'loop',
|
|
447
|
+
'clean', 'verify', 'search', 'skill', 'member', 'app', 'learn', 'plugin', 'experiments', 'receipt', 'proof', 'openclaw', 'pull', 'push', 'align', 'terminal', 'computer', 'diff', 'business', 'sync',
|
|
448
|
+
'ingest', 'query', 'lint', 'loop', 'task',
|
|
437
449
|
'gmail', 'calendar', 'twitter', 'slack', 'integrations', 'setup', 'clean-workspace', 'cw',
|
|
438
|
-
'fork', 'browse', 'publish', 'sleep', 'wake', 'feedback', 'wiki', 'code-review', 'cr', 'soul', 'fleet'];
|
|
450
|
+
'fork', 'browse', 'publish', 'sleep', 'wake', 'feedback', 'errors', 'wiki', 'code-review', 'cr', 'soul', 'fleet'];
|
|
439
451
|
|
|
440
452
|
// Check if command is an atris.md spec file - triggers welcome visualization
|
|
441
453
|
function isSpecFile(cmd) {
|
|
@@ -779,6 +791,11 @@ if (command === 'init') {
|
|
|
779
791
|
console.error(`✗ Error: ${error.message || error}`);
|
|
780
792
|
process.exit(1);
|
|
781
793
|
});
|
|
794
|
+
} else if (command === 'task') {
|
|
795
|
+
// SQLite-backed task plane. ~/.atris/tasks.db, gitignored, per-workspace.
|
|
796
|
+
Promise.resolve(require('../commands/task').run(process.argv.slice(3)))
|
|
797
|
+
.then(() => process.exit(0))
|
|
798
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
782
799
|
} else if (command === 'agent') {
|
|
783
800
|
agentAtris().then(() => process.exit(0)).catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
784
801
|
} else if (command === 'log') {
|
|
@@ -868,10 +885,9 @@ if (command === 'init') {
|
|
|
868
885
|
} else if (command === 'shell-init') {
|
|
869
886
|
require('../commands/auth').shellInit();
|
|
870
887
|
} else if (command === 'visualize') {
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
require('../commands/visualize').visualizeAtris();
|
|
888
|
+
require('../commands/visualize').visualizeAtris(process.argv.slice(3))
|
|
889
|
+
.then(() => process.exit(0))
|
|
890
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
875
891
|
} else if (command === 'run') {
|
|
876
892
|
const args = process.argv.slice(3);
|
|
877
893
|
if (args.includes('--help') || args.includes('-h')) {
|
|
@@ -1160,6 +1176,10 @@ if (command === 'init') {
|
|
|
1160
1176
|
const subcommand = process.argv[3];
|
|
1161
1177
|
const args = process.argv.slice(4);
|
|
1162
1178
|
require('../commands/experiments').experimentsCommand(subcommand, ...args);
|
|
1179
|
+
} else if (command === 'receipt' || command === 'proof' || command === 'openclaw') {
|
|
1180
|
+
const subcommand = process.argv[3];
|
|
1181
|
+
const args = process.argv.slice(4);
|
|
1182
|
+
require('../commands/proof').proofCommand(subcommand, ...args);
|
|
1163
1183
|
} else if (command === 'setup') {
|
|
1164
1184
|
require('../commands/setup').setupAtris()
|
|
1165
1185
|
.then(() => process.exit(0))
|
|
@@ -1188,6 +1208,10 @@ if (command === 'init') {
|
|
|
1188
1208
|
require('../commands/feedback').feedbackCommand()
|
|
1189
1209
|
.then(() => process.exit(0))
|
|
1190
1210
|
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
1211
|
+
} else if (command === 'errors') {
|
|
1212
|
+
require('../commands/errors').errorsCommand()
|
|
1213
|
+
.then(() => process.exit(0))
|
|
1214
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
1191
1215
|
} else {
|
|
1192
1216
|
console.log(`Unknown command: ${command}`);
|
|
1193
1217
|
console.log('Run "atris help" to see available commands');
|