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 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` | God file. Protocol and source of truth |
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 the repo brain kept honest, use `atris loop`. `atris activate` now surfaces wiki state from `atris/wiki/STATUS.md` when it exists.
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 Workspaces
89
+ ## Business Owners
77
90
 
78
- If you want a real business workspace, use the business command instead of raw `atris init`.
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 cloud business, writes `.atris/business.json`, initializes `.atris/state/` for events, episodes, and scorecards, and scaffolds the local `atris/` workspace under `~/arena/atris-business/<slug>/` with starter team lanes, a default recap artifact, and a first-loop starter queue in `atris/TODO.md`.
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 low-friction intake step: give it a website, a named human, a few notes, or even just run it in a folder with loose files, and it seeds raw intake, a starter brief, a first loop, a safe next action, and an operator one-pager for you.
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 experiments` | Run Karpathy-style keep/revert packs |
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` uses `.atris/presidio/` for local-only sensitive notes and operating memory
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 experiments` runs Karpathy-style keep/revert loops in `atris/experiments/`
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
- - Endgame tasks can carry a `Verify:` command, so work can end on a deterministic check instead of pure prose.
141
- - `atris autopilot` can run that check after review, record a reward in the journal, and append a local scorecard when a horizon closes.
142
- - Future horizon picks can weight against recent scorecards, so the loop learns from repo-local history without claiming model retraining.
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 scorecard
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 horizons from it. Prevents the loop from re-solving solved problems.
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 Load context, start building');
208
- console.log(' 2. Describe what you want (in your editor or terminal)');
209
- console.log(' 3. Agent shows visualization, you approve, it builds');
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 - Legacy visualization helper (prefer "atris plan")');
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 canonical business workspace (cloud + local)');
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 create <name> - Create new business; add --workspace for canonical local scaffold');
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 - Talk directly to the AI computer (bash or agent exec)');
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
- console.log('ℹ️ "atris visualize" is a legacy helper. Visualization is now built into "atris plan".');
872
- console.log(' Prefer: atris plan');
873
- console.log('');
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');