atris 3.27.0 → 3.29.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/AGENTS.md +1 -3
- package/README.md +5 -5
- package/atris/features/company-brain-sync/build.md +4 -4
- package/atris/features/company-brain-sync/idea.md +2 -2
- package/atris/features/company-brain-sync/validate.md +19 -19
- package/atris/skills/aeo/SKILL.md +1 -1
- package/atris/skills/autopilot/SKILL.md +2 -2
- package/atris/skills/slides/SKILL.md +2 -2
- package/bin/atris.js +23 -18
- package/commands/aeo.js +1 -1
- package/commands/autopilot.js +1 -1
- package/commands/computer.js +9 -9
- package/commands/feedback.js +1 -1
- package/commands/init.js +2 -2
- package/commands/live.js +3 -3
- package/commands/plugin.js +1 -1
- package/commands/pull.js +4 -4
- package/commands/security-review.js +360 -0
- package/commands/task.js +0 -1
- package/lib/security-scan.js +440 -0
- package/package.json +1 -8
- package/atris/wiki/concepts/agent-activation-contract.md +0 -81
- package/atris/wiki/concepts/workspace-initialization-contract.md +0 -73
- package/atris/wiki/index.md +0 -31
- package/atris/wiki/sources/atris-labs-2026-05-10.txt +0 -14
- package/atris/wiki/sources/atris-labs-goals-2026-05-10.txt +0 -14
- package/atris/wiki/sources/atrisos-generative-ui-product-surface-2026-05-10.txt +0 -10
- package/atris/wiki/sources/jack-dorsey-2026-05-10.txt +0 -12
package/AGENTS.md
CHANGED
|
@@ -110,7 +110,7 @@ member -> mission start --verify -> status --status active -> one bounded step -
|
|
|
110
110
|
- [ ] Only use `atris task accept <id>` when the human has approved the proof
|
|
111
111
|
- [ ] Keep durable learning in Atris-owned policy/skill/wiki/task state; keep `AGENTS.md` as a generated/pointer layer
|
|
112
112
|
- [ ] Treat `atris/TODO.md` as a rendered view; do not manually use it as the source of truth
|
|
113
|
-
- [ ] Use
|
|
113
|
+
- [ ] Use the real business slug from local Atris state; do not hardcode private slugs in generated docs
|
|
114
114
|
|
|
115
115
|
## Anti-patterns
|
|
116
116
|
|
|
@@ -136,12 +136,10 @@ Load these first:
|
|
|
136
136
|
- `atris/now.md`
|
|
137
137
|
- `atris/brain/STATUS.md`
|
|
138
138
|
- `atris/brain/self_improvement_ledger.md`
|
|
139
|
-
- `atris/wiki/concepts/agent-activation-contract.md`
|
|
140
139
|
- `atris/skills/atris/SKILL.md`
|
|
141
140
|
- `atris/PERSONA.md`
|
|
142
141
|
- `atris/MAP.md`
|
|
143
142
|
- `atris/TODO.md`
|
|
144
|
-
- `atris/wiki/index.md`
|
|
145
143
|
|
|
146
144
|
First-message rule: lead with the move before writing to the operator.
|
|
147
145
|
Purpose: optimize for decision-speed; lead with the move, then use descriptions only when they help the operator act.
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Owner has many Computers
|
|
|
10
10
|
Computer = workspace + files + tools + secrets + memory + agents + validation loop
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
A computer can be personal or shared by a business. It can run a job like code, research, CRM, reporting,
|
|
13
|
+
A computer can be personal or shared by a business. It can run a job like code, research, CRM, reporting, event ops, support, or business ops.
|
|
14
14
|
|
|
15
15
|
## For Coding Agents
|
|
16
16
|
|
|
@@ -142,9 +142,9 @@ leaderboard.
|
|
|
142
142
|
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`.
|
|
143
143
|
|
|
144
144
|
```bash
|
|
145
|
-
atris business init "
|
|
146
|
-
cd ~/arena/atris-business/
|
|
147
|
-
atris business onboard --website https://
|
|
145
|
+
atris business init "Example Co" --owner-email operator@example.com
|
|
146
|
+
cd ~/arena/atris-business/example-co
|
|
147
|
+
atris business onboard --website https://example.com --contact "Example Owner" --note "sample customer workspace"
|
|
148
148
|
atris align --fix
|
|
149
149
|
```
|
|
150
150
|
|
|
@@ -166,7 +166,7 @@ You can also use bare input:
|
|
|
166
166
|
atris business onboard https://example.com "founder-led b2b ops" ./notes.md
|
|
167
167
|
```
|
|
168
168
|
|
|
169
|
-
If you already have a folder full of source material, run it from there with `atris business init "
|
|
169
|
+
If you already have a folder full of source material, run it from there with `atris business init "Example Co" --here`.
|
|
170
170
|
|
|
171
171
|
When the first recap is done, record it into the RL state logs:
|
|
172
172
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
## Current Patch
|
|
4
4
|
|
|
5
|
-
The immediate
|
|
5
|
+
The immediate Example Co lane now follows the correct company-brain model:
|
|
6
6
|
|
|
7
|
-
- `atris push` keeps the business root as the path root so `
|
|
7
|
+
- `atris push` keeps the business root as the path root so `example-co/atris/MAP.md` maps to cloud `/atris/MAP.md`
|
|
8
8
|
- business `pull` and `push` default to the `atris/` scope
|
|
9
9
|
- root-level duplicates such as `MAP.md`, `TODO.md`, and `security-report.md` are ignored by default
|
|
10
10
|
- manifests record the local workspace root to prevent a manifest from one folder authorizing pushes from another folder
|
|
@@ -114,7 +114,7 @@ Later it should also let the user ask Atris to merge semantically with model ass
|
|
|
114
114
|
|
|
115
115
|
`atris sync --watch` is the current always-on lane:
|
|
116
116
|
|
|
117
|
-
- watch `
|
|
117
|
+
- watch `example-co/atris/`
|
|
118
118
|
- debounce local edits
|
|
119
119
|
- fetch cloud hashes periodically
|
|
120
120
|
- sync clean changes
|
|
@@ -136,5 +136,5 @@ Required before broad customer use:
|
|
|
136
136
|
- retry-policy tests proving watch failures do not kill the alive loop
|
|
137
137
|
- fixture tests proving parent-folder junk is ignored
|
|
138
138
|
- fixture tests proving no cloud deletes without explicit opt-in
|
|
139
|
-
- end-to-end dry-run against a real
|
|
139
|
+
- end-to-end dry-run against a real Example Co-shaped workspace
|
|
140
140
|
- command copy that never recommends `--force` for normal use
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Problem
|
|
4
4
|
|
|
5
|
-
Atris business workspaces are company brains, not plain folders. The canonical knowledge surface is the `atris/` folder inside each business workspace, for example `
|
|
5
|
+
Atris business workspaces are company brains, not plain folders. The canonical knowledge surface is the `atris/` folder inside each business workspace, for example `example-co/atris/`.
|
|
6
6
|
|
|
7
7
|
Raw push/pull is the wrong abstraction for this surface. It makes a shared knowledge base feel like file mirroring, which creates merge anxiety and makes users responsible for sync safety.
|
|
8
8
|
|
|
@@ -19,7 +19,7 @@ Cloud Atris is canonical. Local Atris is a working copy. Sync publishes proposed
|
|
|
19
19
|
|
|
20
20
|
## User Model
|
|
21
21
|
|
|
22
|
-
Jonathan should be able to work inside `
|
|
22
|
+
Jonathan should be able to work inside `example-co/atris/` and run one command:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
atris sync
|
|
@@ -51,47 +51,47 @@ node -c commands/pull.js
|
|
|
51
51
|
node -c commands/push.js
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
Fresh
|
|
54
|
+
Fresh Example Co-shaped workspace dry-run:
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
atris sync
|
|
57
|
+
atris sync example-co --dry-run
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
Observed result:
|
|
61
61
|
|
|
62
62
|
```text
|
|
63
|
-
Syncing
|
|
63
|
+
Syncing example-co knowledge wiki...
|
|
64
64
|
scope: atris/
|
|
65
65
|
...
|
|
66
|
-
Pushing to
|
|
66
|
+
Pushing to Example Co...
|
|
67
67
|
Checking cloud freshness... fresh
|
|
68
68
|
Already up to date.
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
Fresh
|
|
71
|
+
Fresh Example Co-shaped workspace real command with no local edits:
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
|
-
atris sync
|
|
74
|
+
atris sync example-co
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
Observed result:
|
|
78
78
|
|
|
79
79
|
```text
|
|
80
|
-
Pulling
|
|
80
|
+
Pulling Example Co...
|
|
81
81
|
Already up to date.
|
|
82
82
|
122 unchanged.
|
|
83
|
-
Pushing to
|
|
83
|
+
Pushing to Example Co...
|
|
84
84
|
Checking cloud freshness... fresh
|
|
85
85
|
Already up to date.
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
No cloud writes were required in the validation case because the clean workspace had no local changes to publish.
|
|
89
89
|
|
|
90
|
-
Local edit dry-run in
|
|
90
|
+
Local edit dry-run in an Example Co-shaped workspace:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
93
|
printf '# Sync smoke\n\nLocal-only knowledge update.\n' > atris/wiki/smoke/local-edit.md
|
|
94
|
-
atris sync
|
|
94
|
+
atris sync example-co --dry-run
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
Observed result:
|
|
@@ -101,11 +101,11 @@ Observed result:
|
|
|
101
101
|
1 would be pushed, 122 unchanged. (--dry-run, nothing sent)
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
-
Local delete dry-run in
|
|
104
|
+
Local delete dry-run in an Example Co-shaped workspace:
|
|
105
105
|
|
|
106
106
|
```bash
|
|
107
107
|
rm -f atris/wiki/index.md
|
|
108
|
-
atris sync
|
|
108
|
+
atris sync example-co --dry-run
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
Observed result:
|
|
@@ -118,7 +118,7 @@ Deletes require an explicit real push with --delete.
|
|
|
118
118
|
Real delete attempt without `--delete`:
|
|
119
119
|
|
|
120
120
|
```bash
|
|
121
|
-
atris sync
|
|
121
|
+
atris sync example-co
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
Observed result:
|
|
@@ -148,10 +148,10 @@ Slug auto-detection:
|
|
|
148
148
|
atris sync --dry-run
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
Observed result from
|
|
151
|
+
Observed result from an Example Co-shaped workspace:
|
|
152
152
|
|
|
153
153
|
```text
|
|
154
|
-
Syncing
|
|
154
|
+
Syncing example-co knowledge wiki...
|
|
155
155
|
scope: atris/
|
|
156
156
|
```
|
|
157
157
|
|
|
@@ -165,7 +165,7 @@ Observed shape:
|
|
|
165
165
|
|
|
166
166
|
```text
|
|
167
167
|
Company brain status
|
|
168
|
-
business:
|
|
168
|
+
business: example-co
|
|
169
169
|
brain: atris/ (...)
|
|
170
170
|
conflicts: none
|
|
171
171
|
watcher: ...
|
|
@@ -218,12 +218,12 @@ atris pull example-co --keep-local --only atris/wiki --timeout 120
|
|
|
218
218
|
atris push example-co --only atris/wiki --dry-run
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
-
-
|
|
221
|
+
- Example Co post-publish smoke:
|
|
222
222
|
|
|
223
223
|
```bash
|
|
224
|
-
cd ~/arena/atris-business/
|
|
224
|
+
cd ~/arena/atris-business/example-co
|
|
225
225
|
atris wiki verify
|
|
226
|
-
atris push
|
|
226
|
+
atris push example-co --dry-run
|
|
227
227
|
```
|
|
228
228
|
|
|
229
229
|
- Packaged CLI smoke already passed locally for `3.15.12`: tarball install exposes `atris pull --no-manifest` and `atris wiki verify`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: aeo
|
|
3
3
|
description: "AI Engine Optimization — write content engineered to get cited by ChatGPT, Claude, and Gemini. Not SEO. Triggers on: aeo, AI engine, llm citation, get cited, write for ai."
|
|
4
|
-
when_to_use: "Use when the user wants content that ranks in AI answers (not Google SERP). Examples: 'write an AEO page', 'get ExampleCo cited by ChatGPT', 'aeo for our
|
|
4
|
+
when_to_use: "Use when the user wants content that ranks in AI answers (not Google SERP). Examples: 'write an AEO page', 'get ExampleCo cited by ChatGPT', 'aeo for our pricing page', 'make this quotable by LLMs'."
|
|
5
5
|
version: 0.1.0
|
|
6
6
|
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
|
|
7
7
|
tags:
|
|
@@ -20,8 +20,8 @@ Every tick prints this BEFORE scanning for work, so you can see the loop's state
|
|
|
20
20
|
┌──────────────────────────────────────────────────────────────┐
|
|
21
21
|
│ tick · 14:23 │
|
|
22
22
|
│ identity: building atris-business cloud for design partners │
|
|
23
|
-
│ horizon:
|
|
24
|
-
│
|
|
23
|
+
│ horizon: customer-onboarding │
|
|
24
|
+
│ three setup checks are ready to ship │
|
|
25
25
|
│ progress: ████████░░░░ 6/9 endgame steps │
|
|
26
26
|
└──────────────────────────────────────────────────────────────┘
|
|
27
27
|
```
|
|
@@ -121,7 +121,7 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-slides/presentatio
|
|
|
121
121
|
{
|
|
122
122
|
"insertText": {
|
|
123
123
|
"objectId": "subtitleId",
|
|
124
|
-
"text": "
|
|
124
|
+
"text": "{{company_name}} - Confidential"
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
]
|
|
@@ -207,7 +207,7 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-slides/presentatio
|
|
|
207
207
|
{
|
|
208
208
|
"replaceAllText": {
|
|
209
209
|
"containsText": {"text": "{{company_name}}"},
|
|
210
|
-
"replaceText": "
|
|
210
|
+
"replaceText": "Example Co"
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
213
|
]
|
package/bin/atris.js
CHANGED
|
@@ -345,7 +345,7 @@ function showHelp() {
|
|
|
345
345
|
console.log('Atris Computers:');
|
|
346
346
|
console.log(' Owner = User | Business');
|
|
347
347
|
console.log(' Owners have Computers: workspace + files + tools + secrets + memory + agents + validation');
|
|
348
|
-
console.log(' Types: code, research, CRM, reporting,
|
|
348
|
+
console.log(' Types: code, research, CRM, reporting, events, support, business ops');
|
|
349
349
|
console.log('');
|
|
350
350
|
console.log('Setup:');
|
|
351
351
|
console.log(' setup - Guided first-time setup (login, pick business, pull)');
|
|
@@ -823,7 +823,7 @@ if (command === '2' && ['fast', 'pro'].includes(String(firstCommandArg || '').to
|
|
|
823
823
|
const knownCommands = ['init', 'log', 'now', 'radar', 'ctop', 'status', 'analytics', 'visualize', 'brain', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review', 'release',
|
|
824
824
|
'activate', '_activate', 'agent', 'chat', 'fast', 'ax', 'console', 'serve', 'login', 'logout', 'whoami', 'switch', 'use', 'accounts', '_resolve', '_profile-email', '_switch-session', 'shell-init', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
|
|
825
825
|
'clean', 'verify', 'search', 'skill', 'member', 'codex-goal', 'app', 'apps', 'learn', 'lesson', 'plugin', 'experiments', 'receipt', 'proof', 'openclaw', 'pull', 'push', 'live', 'align', 'terminal', 'computer', 'diff', 'business', 'sync', 'youtube',
|
|
826
|
-
'ingest', 'query', 'lint', 'loop', 'pulse', 'task', 'mission', 'probe', 'worktree', 'aeo', 'slop', 'deck', 'site', 'theme', 'card', 'reel', 'improve', 'xp', 'play', 'gm', 'x', 'recap', 'signup', 'clarity', 'moves',
|
|
826
|
+
'ingest', 'query', 'lint', 'loop', 'pulse', 'task', 'mission', 'probe', 'worktree', 'aeo', 'slop', 'security-review', 'secure', 'deck', 'site', 'theme', 'card', 'reel', 'improve', 'xp', 'play', 'gm', 'x', 'recap', 'signup', 'clarity', 'moves',
|
|
827
827
|
'gmail', 'calendar', 'twitter', 'slack', 'imessage', 'integrations', 'setup', 'clean-workspace', 'cw',
|
|
828
828
|
'fork', 'browse', 'publish', 'sleep', 'wake', 'feedback', 'errors', 'wiki', 'code-review', 'cr', 'soul', 'fleet', 'compile', 'spaceship'];
|
|
829
829
|
|
|
@@ -2061,6 +2061,27 @@ if (command === 'init') {
|
|
|
2061
2061
|
Promise.resolve(require('../commands/slop').slopCommand(process.argv.slice(3)))
|
|
2062
2062
|
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2063
2063
|
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2064
|
+
} else if (command === 'security-review' || command === 'secure') {
|
|
2065
|
+
// Security review: deterministic secrets/PII/code-risk scan (no LLM). Exit 1 = HIGH finding,
|
|
2066
|
+
// for the autopilot/mission/CI gate + a SOC 2 evidence artifact via --json.
|
|
2067
|
+
Promise.resolve(require('../commands/security-review').securityReviewCommand(process.argv.slice(3)))
|
|
2068
|
+
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2069
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2070
|
+
} else if (command === 'signup') {
|
|
2071
|
+
// Signup: one-call seedless agent signup → writes the active profile (install→signup→play seam).
|
|
2072
|
+
Promise.resolve(require('../commands/signup').signupCommand(process.argv.slice(3)))
|
|
2073
|
+
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2074
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2075
|
+
} else if (command === 'moves') {
|
|
2076
|
+
// Moves: your 3 next moves — approve one into the loop, kill, or skip.
|
|
2077
|
+
Promise.resolve(require('../commands/moves').movesCommand(process.argv.slice(3)))
|
|
2078
|
+
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2079
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2080
|
+
} else if (command === 'clarity') {
|
|
2081
|
+
// Clarity: interview yourself once; agents read how you work so you stop repeating it.
|
|
2082
|
+
Promise.resolve(require('../commands/clarity').clarityCommand(process.argv.slice(3)))
|
|
2083
|
+
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2084
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2064
2085
|
} else if (command === 'deck') {
|
|
2065
2086
|
// Deck: premium Google Slides from a plain content spec, via the Atris deck engine (anti-slop design system).
|
|
2066
2087
|
Promise.resolve(require('../commands/deck').run(process.argv.slice(3)))
|
|
@@ -2086,22 +2107,6 @@ if (command === 'init') {
|
|
|
2086
2107
|
Promise.resolve(require('../commands/reel').run(process.argv.slice(3)))
|
|
2087
2108
|
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2088
2109
|
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2089
|
-
} else if (command === 'signup') {
|
|
2090
|
-
// Signup: one-call seedless agent signup (POST /auth/agent/signup) → writes the
|
|
2091
|
-
// active profile so `atris play` works next. The install→signup→play seam.
|
|
2092
|
-
Promise.resolve(require('../commands/signup').signupCommand(process.argv.slice(3)))
|
|
2093
|
-
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2094
|
-
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2095
|
-
} else if (command === 'moves') {
|
|
2096
|
-
// Moves: your 3 next moves — approve one into the loop, kill, or skip.
|
|
2097
|
-
Promise.resolve(require('../commands/moves').movesCommand(process.argv.slice(3)))
|
|
2098
|
-
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2099
|
-
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2100
|
-
} else if (command === 'clarity') {
|
|
2101
|
-
// Clarity: interview yourself once; agents read how you work so you stop repeating it.
|
|
2102
|
-
Promise.resolve(require('../commands/clarity').clarityCommand(process.argv.slice(3)))
|
|
2103
|
-
.then((code) => process.exit(typeof code === 'number' ? code : 0))
|
|
2104
|
-
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
2105
2110
|
} else if (command === 'receipt' || command === 'proof' || command === 'openclaw') {
|
|
2106
2111
|
const subcommand = process.argv[3];
|
|
2107
2112
|
const args = process.argv.slice(4);
|
package/commands/aeo.js
CHANGED
|
@@ -173,7 +173,7 @@ function printHelp() {
|
|
|
173
173
|
console.log('');
|
|
174
174
|
console.log('Examples:');
|
|
175
175
|
console.log(' atris aeo log --engine perplexity --limit 5');
|
|
176
|
-
console.log(' atris aeo packet
|
|
176
|
+
console.log(' atris aeo packet <slug>');
|
|
177
177
|
console.log(' atris aeo status');
|
|
178
178
|
console.log(' atris aeo discover https://atris.ai/aeo --canonical-url https://atris.ai/aeo');
|
|
179
179
|
}
|
package/commands/autopilot.js
CHANGED
|
@@ -42,7 +42,7 @@ function looksOwnerGatedTitle(title) {
|
|
|
42
42
|
/\bhuman[- ](?:approval|input|gate|gated)\b/.test(text) ||
|
|
43
43
|
/\bmanual send\b/.test(text) ||
|
|
44
44
|
/\broute confirmation\b/.test(text) ||
|
|
45
|
-
/\bconfirm
|
|
45
|
+
/\bconfirm customer destination\b/.test(text) ||
|
|
46
46
|
/\bconfirm .+ destination before .+ approval\b/.test(text) ||
|
|
47
47
|
/\bapprove and manually send\b/.test(text)
|
|
48
48
|
);
|
package/commands/computer.js
CHANGED
|
@@ -1601,8 +1601,8 @@ async function computerCreate(token, args = [], defaults = {}) {
|
|
|
1601
1601
|
console.log('Create a business computer, activate it, and wake it in one command.');
|
|
1602
1602
|
console.log('');
|
|
1603
1603
|
console.log('Examples:');
|
|
1604
|
-
console.log(' atris computer create "My Business Computer" --business
|
|
1605
|
-
console.log(' atris computer create "
|
|
1604
|
+
console.log(' atris computer create "My Business Computer" --business <business>');
|
|
1605
|
+
console.log(' atris computer create "Support Computer"');
|
|
1606
1606
|
if (!options.name && !options.help) process.exitCode = 1;
|
|
1607
1607
|
return;
|
|
1608
1608
|
}
|
|
@@ -1810,8 +1810,8 @@ async function computerDelete(token, ctx, options = {}, args = []) {
|
|
|
1810
1810
|
console.log('Sleeps the computer first, then deletes the non-default workspace after confirmation.');
|
|
1811
1811
|
console.log('');
|
|
1812
1812
|
console.log('Examples:');
|
|
1813
|
-
console.log(' atris computer delete --business
|
|
1814
|
-
console.log(' atris computer delete --business
|
|
1813
|
+
console.log(' atris computer delete --business <business> --workspace ws_123');
|
|
1814
|
+
console.log(' atris computer delete --business <business> --workspace ws_123 --confirm "delete ws_123"');
|
|
1815
1815
|
return;
|
|
1816
1816
|
}
|
|
1817
1817
|
|
|
@@ -3291,7 +3291,7 @@ async function runComputer() {
|
|
|
3291
3291
|
console.log(' Owner has many Computers');
|
|
3292
3292
|
console.log(' Computer = workspace + files + tools + secrets + memory + agents + validation');
|
|
3293
3293
|
console.log('');
|
|
3294
|
-
console.log('Common types: codeops, research, CRM, reporting,
|
|
3294
|
+
console.log('Common types: codeops, research, CRM, reporting, event ops, support, business ops.');
|
|
3295
3295
|
console.log('A business can be a company, lab, collective, community, artist, team, or project.');
|
|
3296
3296
|
console.log('');
|
|
3297
3297
|
console.log('First use:');
|
|
@@ -3342,10 +3342,10 @@ async function runComputer() {
|
|
|
3342
3342
|
console.log(' atris computer');
|
|
3343
3343
|
console.log(' atris computer card --write');
|
|
3344
3344
|
console.log(' atris business init "My Lab" # first/default computer with Atris + operator');
|
|
3345
|
-
console.log(' atris computer create "
|
|
3346
|
-
console.log(' atris computer --business
|
|
3347
|
-
console.log(' atris computer sleep --business
|
|
3348
|
-
console.log(' atris computer delete --business
|
|
3345
|
+
console.log(' atris computer create "Support Computer" --business <business>');
|
|
3346
|
+
console.log(' atris computer --business <business> --workspace <workspace-id>');
|
|
3347
|
+
console.log(' atris computer sleep --business <business> --workspace <workspace-id>');
|
|
3348
|
+
console.log(' atris computer delete --business <business> --workspace <workspace-id>');
|
|
3349
3349
|
console.log(' atris computer proof');
|
|
3350
3350
|
console.log(' atris computer local');
|
|
3351
3351
|
console.log(' atris computer codex');
|
package/commands/feedback.js
CHANGED
|
@@ -231,7 +231,7 @@ function printHelp(write = console.log) {
|
|
|
231
231
|
write(' atris feedback delete <id> Delete feedback (admin)');
|
|
232
232
|
write('');
|
|
233
233
|
write('IDs may be the first 8 chars of the UUID.');
|
|
234
|
-
write('Business slugs come from ~/.atris/businesses.json
|
|
234
|
+
write('Business slugs come from ~/.atris/businesses.json.');
|
|
235
235
|
write('');
|
|
236
236
|
}
|
|
237
237
|
|
package/commands/init.js
CHANGED
|
@@ -257,7 +257,7 @@ function initAtris() {
|
|
|
257
257
|
}
|
|
258
258
|
// GUARD: Refuse nested init.
|
|
259
259
|
// Bug: running `atris init` inside an existing `atris/` folder creates
|
|
260
|
-
// `atris/atris/` nesting hell.
|
|
260
|
+
// `atris/atris/` nesting hell. A cloud business workspace had this exact problem.
|
|
261
261
|
// Fix: detect three nesting conditions and refuse with a clear error.
|
|
262
262
|
const cwd = process.cwd();
|
|
263
263
|
const cwdBase = path.basename(cwd);
|
|
@@ -705,7 +705,7 @@ member -> mission start --verify -> status --status active -> one bounded step -
|
|
|
705
705
|
- [ ] Only use \`atris task accept <id>\` when the human has approved the proof
|
|
706
706
|
- [ ] Keep durable learning in Atris-owned policy/skill/wiki/task state; keep \`AGENTS.md\` as a generated/pointer layer
|
|
707
707
|
- [ ] Treat \`atris/TODO.md\` as a rendered view; do not manually use it as the source of truth
|
|
708
|
-
- [ ] Use
|
|
708
|
+
- [ ] Use the real business slug from local Atris state; do not hardcode private slugs in generated docs
|
|
709
709
|
|
|
710
710
|
## Anti-patterns
|
|
711
711
|
|
package/commands/live.js
CHANGED
|
@@ -101,10 +101,10 @@ function printLiveHelp() {
|
|
|
101
101
|
console.log('Keeps a business brain fresh: doctor, pull, watch local changes, push after quiet, and periodically pull.');
|
|
102
102
|
console.log('');
|
|
103
103
|
console.log('Examples:');
|
|
104
|
-
console.log(' atris live
|
|
104
|
+
console.log(' atris live <business>');
|
|
105
105
|
console.log(' atris live --once');
|
|
106
|
-
console.log(' atris live
|
|
107
|
-
console.log(' atris live
|
|
106
|
+
console.log(' atris live <business> --dry-run');
|
|
107
|
+
console.log(' atris live <business> --interval=120 --debounce=30');
|
|
108
108
|
console.log('');
|
|
109
109
|
console.log('Options:');
|
|
110
110
|
console.log(' --once Run one freshness cycle and exit');
|
package/commands/plugin.js
CHANGED
|
@@ -46,7 +46,7 @@ function generateManifest(skills, projectDir) {
|
|
|
46
46
|
version: pkg.version || '1.0.0',
|
|
47
47
|
description: `Atris workspace skills for Cowork — ${skills.length} integrations (email, calendar, slack, drive, notion, and more)`,
|
|
48
48
|
author: {
|
|
49
|
-
name: typeof pkg.author === 'string' ? pkg.author : (pkg.author?.name || 'Atris
|
|
49
|
+
name: typeof pkg.author === 'string' ? pkg.author : (pkg.author?.name || 'Atris')
|
|
50
50
|
},
|
|
51
51
|
homepage: pkg.homepage || 'https://github.com/atrislabs/atris',
|
|
52
52
|
keywords: ['atris', 'workspace', 'integrations', 'email', 'calendar', 'slack', 'notion', 'drive']
|
package/commands/pull.js
CHANGED
|
@@ -110,9 +110,9 @@ async function pullAtris() {
|
|
|
110
110
|
console.log(' Local files that conflict with cloud are replaced by the cloud version.');
|
|
111
111
|
console.log('');
|
|
112
112
|
console.log(' atris pull Pull into current business workspace');
|
|
113
|
-
console.log(' atris pull
|
|
114
|
-
console.log(' atris pull
|
|
115
|
-
console.log(' atris pull
|
|
113
|
+
console.log(' atris pull <business> Pull a business into ./<business> or --into <path>');
|
|
114
|
+
console.log(' atris pull <business> --into /tmp/<business>');
|
|
115
|
+
console.log(' atris pull <business> --only atris/wiki/');
|
|
116
116
|
console.log(' atris pull --keep-local Preserve conflicting local edits as .remote files (legacy)');
|
|
117
117
|
console.log(' atris pull --dry-run Preview pull changes without writing local files');
|
|
118
118
|
console.log(' atris pull --no-manifest Pull for inspection without changing this machine\'s sync anchor');
|
|
@@ -249,7 +249,7 @@ async function pullBusiness(slug) {
|
|
|
249
249
|
// correct workspace for THIS business — i.e. it has a `.atris/business.json`
|
|
250
250
|
// whose slug matches `slug`. Any other signal (a stray `atris/` folder, a
|
|
251
251
|
// business.json for a different business, etc.) is NOT enough: pulling
|
|
252
|
-
//
|
|
252
|
+
// one business on top of another business workspace would mix two businesses into
|
|
253
253
|
// one directory and write one manifest over the other (or vice
|
|
254
254
|
// versa), causing the next sync to do strange things.
|
|
255
255
|
//
|