atris 2.3.3 → 2.3.5

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: atris
3
- description: "Codebase intelligence — generates structured navigation maps with file:line references so agents stop re-scanning the same files every session. Use when exploring code, answering 'where is X?', or onboarding to a new codebase."
3
+ description: Codebase intelligence — generates structured navigation maps with file:line references so agents stop re-scanning the same files every session. Use when exploring code, answering "where is X?", or onboarding to a new codebase.
4
4
  version: 1.1.0
5
5
  requires:
6
6
  bins:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: drive
3
3
  description: Google Drive integration via AtrisOS API. Browse, search, read, upload files and work with Google Sheets. Use when user asks about Drive, files, docs, sheets, or spreadsheets.
4
- version: 1.2.0
4
+ version: 1.1.0
5
5
  tags:
6
6
  - drive
7
7
  - backend
@@ -199,29 +199,6 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/files" \
199
199
  }'
200
200
  ```
201
201
 
202
- ### Update Existing File
203
- ```bash
204
- curl -s -X PUT "https://api.atris.ai/api/integrations/google-drive/files/{file_id}" \
205
- -H "Authorization: Bearer $TOKEN" \
206
- -H "Content-Type: application/json" \
207
- -d '{
208
- "content": "Updated file content here",
209
- "mime_type": "text/plain"
210
- }'
211
- ```
212
-
213
- **Update content and rename:**
214
- ```bash
215
- curl -s -X PUT "https://api.atris.ai/api/integrations/google-drive/files/{file_id}" \
216
- -H "Authorization: Bearer $TOKEN" \
217
- -H "Content-Type: application/json" \
218
- -d '{
219
- "content": "New content",
220
- "mime_type": "text/plain",
221
- "name": "renamed-file.txt"
222
- }'
223
- ```
224
-
225
202
  ---
226
203
 
227
204
  ## Google Sheets
@@ -322,14 +299,6 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/sheets/{spre
322
299
  3. **Confirm with user**: "Upload {filename} to Drive?"
323
300
  4. Upload: `POST /google-drive/files` with `{name, content, mime_type}`
324
301
 
325
- ### "Edit a file on Drive"
326
- 1. Run bootstrap
327
- 2. Find the file: `GET /google-drive/search?q=FILENAME`
328
- 3. Read current content: `GET /google-drive/files/{id}/export?mime_type=text/plain`
329
- 4. Make edits
330
- 5. **Show user the changes for approval**
331
- 6. Update: `PUT /google-drive/files/{id}` with `{content, mime_type}`
332
-
333
302
  ---
334
303
 
335
304
  ## Error Handling
@@ -387,13 +356,8 @@ curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/sheets/{id}/
387
356
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
388
357
  -d '{"range":"Sheet1","values":[["Alice",95]]}'
389
358
 
390
- # Upload a new file
359
+ # Upload a file
391
360
  curl -s -X POST "https://api.atris.ai/api/integrations/google-drive/files" \
392
361
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
393
362
  -d '{"name":"notes.txt","content":"Hello world","mime_type":"text/plain"}'
394
-
395
- # Update an existing file
396
- curl -s -X PUT "https://api.atris.ai/api/integrations/google-drive/files/{file_id}" \
397
- -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
398
- -d '{"content":"Updated content","mime_type":"text/plain"}'
399
363
  ```
@@ -250,17 +250,6 @@ curl -s -X DELETE "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}
250
250
  -H "Authorization: Bearer $TOKEN"
251
251
  ```
252
252
 
253
- ### Mark as Read / Unread
254
- ```bash
255
- # Mark as read
256
- curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/{message_id}/read" \
257
- -H "Authorization: Bearer $TOKEN"
258
-
259
- # Mark as unread
260
- curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/{message_id}/unread" \
261
- -H "Authorization: Bearer $TOKEN"
262
- ```
263
-
264
253
  ### Archive Email
265
254
  ```bash
266
255
  # Single message
@@ -274,19 +263,6 @@ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/batch-arch
274
263
  -d '{"message_ids": ["id1", "id2", "id3"]}'
275
264
  ```
276
265
 
277
- ### Trash Email
278
- ```bash
279
- # Single message
280
- curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/{message_id}/trash" \
281
- -H "Authorization: Bearer $TOKEN"
282
-
283
- # Batch trash
284
- curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/batch-trash" \
285
- -H "Authorization: Bearer $TOKEN" \
286
- -H "Content-Type: application/json" \
287
- -d '{"message_ids": ["id1", "id2", "id3"]}'
288
- ```
289
-
290
266
  ### Check Status
291
267
  ```bash
292
268
  curl -s "https://api.atris.ai/api/integrations/gmail/status" \
@@ -434,12 +410,6 @@ curl -s -X POST "https://api.atris.ai/api/integrations/gmail/drafts" \
434
410
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
435
411
  -d '{"to":"email@example.com","subject":"Hi","body":"Draft text"}'
436
412
 
437
- # Mark as read
438
- curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/{message_id}/read" -H "Authorization: Bearer $TOKEN"
439
-
440
- # Trash an email
441
- curl -s -X POST "https://api.atris.ai/api/integrations/gmail/messages/{message_id}/trash" -H "Authorization: Bearer $TOKEN"
442
-
443
413
  # Send a draft
444
414
  curl -s -X POST "https://api.atris.ai/api/integrations/gmail/drafts/{draft_id}/send" \
445
415
  -H "Authorization: Bearer $TOKEN"
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: slack
3
3
  description: Slack integration via AtrisOS API. Read messages, send as yourself, search conversations, manage DMs. Use when user asks about Slack, messages, channels, or team communication.
4
- version: 1.1.0
4
+ version: 1.0.0
5
5
  tags:
6
6
  - slack
7
7
  - backend
@@ -187,14 +187,6 @@ curl -s "https://api.atris.ai/api/integrations/slack/users" \
187
187
  -H "Authorization: Bearer $TOKEN"
188
188
  ```
189
189
 
190
- ### Search Users
191
- ```bash
192
- curl -s "https://api.atris.ai/api/integrations/slack/users/search?q=justin" \
193
- -H "Authorization: Bearer $TOKEN"
194
- ```
195
-
196
- Searches by name, display name, or email. Much faster than pulling the full user list.
197
-
198
190
  ### Send as Bot
199
191
  ```bash
200
192
  curl -s -X POST "https://api.atris.ai/api/integrations/slack/test-send" \
@@ -231,9 +223,9 @@ curl -s -X DELETE "https://api.atris.ai/api/integrations/slack" \
231
223
 
232
224
  ### "Send a message to someone"
233
225
  1. Run bootstrap
234
- 2. Find the user: `GET /slack/users/search?q=NAME`
226
+ 2. Find the user: `GET /slack/users` (search by name/email)
235
227
  3. **Show user the draft for approval**
236
- 4. Send DM: `POST /slack/me/dm` with `{slack_user_id, text}`
228
+ 4. Send DM: `POST /slack/me/dm` with `{user_id, text}`
237
229
  5. Confirm: "Message sent!"
238
230
 
239
231
  ### "Reply in a channel"
@@ -251,7 +243,7 @@ curl -s -X DELETE "https://api.atris.ai/api/integrations/slack" \
251
243
 
252
244
  ### "What did [person] say to me?"
253
245
  1. Run bootstrap
254
- 2. Find user: `GET /slack/users/search?q=NAME` (get user ID)
246
+ 2. List users: `GET /slack/users` (find user ID)
255
247
  3. List DMs: `GET /slack/me/dms` (find DM channel with that user)
256
248
  4. Read messages: `GET /slack/me/messages/{channel_id}`
257
249
  5. Display conversation
@@ -325,7 +317,4 @@ curl -s "https://api.atris.ai/api/integrations/slack/me/search?q=project+update"
325
317
 
326
318
  # List workspace users
327
319
  curl -s "https://api.atris.ai/api/integrations/slack/users" -H "Authorization: Bearer $TOKEN"
328
-
329
- # Search users by name
330
- curl -s "https://api.atris.ai/api/integrations/slack/users/search?q=justin" -H "Authorization: Bearer $TOKEN"
331
320
  ```
@@ -1,6 +1,21 @@
1
- # brainstormer.md — Idea & Reality Shaper
1
+ ---
2
+ name: brainstormer
3
+ role: Idea Shaper
4
+ description: Shape ideas, explore possibilities, adapt to user depth
5
+ version: 1.0.0
6
+
7
+ skills: []
8
+
9
+ permissions:
10
+ can-read: true
11
+ can-plan: false
12
+ can-execute: false
13
+ can-approve: false
14
+ ---
15
+
16
+ # Brainstormer — Idea & Reality Shaper
2
17
 
3
- > **Role:** Shape ideas, explore possibilities, adapt to user depth | **Source:** Inbox items, raw ideas
18
+ > **Source:** Inbox items, raw ideas
4
19
  > **Style:** Read `atris/PERSONA.md` for communication style.
5
20
 
6
21
  ---
@@ -1,6 +1,21 @@
1
- # executor.md — Builder (The Trigger)
1
+ ---
2
+ name: executor
3
+ role: Builder
4
+ description: Execute from build specs, one step at a time
5
+ version: 1.0.0
6
+
7
+ skills: []
8
+
9
+ permissions:
10
+ can-read: true
11
+ can-plan: false
12
+ can-execute: true
13
+ can-approve: false
14
+ ---
15
+
16
+ # Executor — Builder
2
17
 
3
- > **Role:** Execute from build.md, one step at a time | **Source:** build.md, MAP.md
18
+ > **Source:** build.md, MAP.md
4
19
  > **Style:** Read `atris/PERSONA.md` for communication style.
5
20
 
6
21
  ---
@@ -1,6 +1,22 @@
1
- # launcher.md — The Closer
1
+ ---
2
+ name: launcher
3
+ role: Closer
4
+ description: Document, capture learnings, publish, celebrate
5
+ version: 1.0.0
6
+
7
+ skills: []
8
+
9
+ permissions:
10
+ can-read: true
11
+ can-plan: false
12
+ can-execute: false
13
+ can-approve: false
14
+ can-ship: true
15
+ ---
16
+
17
+ # Launcher — The Closer
2
18
 
3
- > **Role:** Document, capture learnings, publish, celebrate | **Source:** Completed tasks, validation results
19
+ > **Source:** Completed tasks, validation results
4
20
  > **Style:** Read `atris/PERSONA.md` for communication style.
5
21
 
6
22
  ---
@@ -1,6 +1,21 @@
1
- # navigator.md — Planner
1
+ ---
2
+ name: navigator
3
+ role: Planner
4
+ description: Transform messy human intent into precise execution plans
5
+ version: 1.0.0
6
+
7
+ skills: []
8
+
9
+ permissions:
10
+ can-read: true
11
+ can-plan: true
12
+ can-execute: false
13
+ can-approve: false
14
+ ---
15
+
16
+ # Navigator — Planner
2
17
 
3
- > **Role:** Transform messy human intent into precise execution plans | **Source:** idea.md, MAP.md
18
+ > **Source:** idea.md, MAP.md
4
19
  > **Style:** Read `atris/PERSONA.md` for communication style.
5
20
 
6
21
  ---
@@ -1,6 +1,22 @@
1
- # validator.md — Reviewer (The Safety)
1
+ ---
2
+ name: validator
3
+ role: Reviewer
4
+ description: Validate execution, run tests, ensure quality before shipping
5
+ version: 1.0.0
6
+
7
+ skills: []
8
+
9
+ permissions:
10
+ can-read: true
11
+ can-plan: false
12
+ can-execute: false
13
+ can-approve: true
14
+ can-ship: true
15
+ ---
16
+
17
+ # Validator — Reviewer
2
18
 
3
- > **Role:** Validate execution, update docs, ensure quality | **Source:** build.md, MAP.md, code
19
+ > **Source:** build.md, MAP.md, code
4
20
  > **Style:** Read `atris/PERSONA.md` for communication style.
5
21
 
6
22
  ---
package/bin/atris.js CHANGED
@@ -219,10 +219,18 @@ function showHelp() {
219
219
  console.log(' integrations - Show integration status');
220
220
  console.log('');
221
221
  console.log('Skills:');
222
+ console.log(' skill create <name> - Scaffold a new skill (--integration, --system)');
223
+ console.log(' skill link [--all] - Symlink skills to ~/.claude/skills/ (system-level)');
222
224
  console.log(' skill list - Show all skills with compliance status');
223
225
  console.log(' skill audit [name] - Validate skill against Anthropic guide');
224
226
  console.log(' skill fix [name] - Auto-fix common compliance issues');
225
227
  console.log('');
228
+ console.log('Team:');
229
+ console.log(' member create <name> - Scaffold a new team member (MEMBER.md)');
230
+ console.log(' member list - Show all team members');
231
+ console.log(' member activate <n> - Activate a member (link skills, show context)');
232
+ console.log(' member upgrade <n> - Convert flat file to directory format');
233
+ console.log('');
226
234
  console.log('Plugin:');
227
235
  console.log(' plugin build - Package skills as .plugin for Cowork');
228
236
  console.log(' plugin publish - Sync skills to marketplace repo and push');
@@ -334,12 +342,13 @@ const { analyticsAtris: analyticsCmd } = require('../commands/analytics');
334
342
  const { cleanAtris: cleanCmd } = require('../commands/clean');
335
343
  const { verifyAtris: verifyCmd } = require('../commands/verify');
336
344
  const { skillCommand: skillCmd } = require('../commands/skill');
345
+ const { memberCommand: memberCmd } = require('../commands/member');
337
346
  const { pluginCommand: pluginCmd } = require('../commands/plugin');
338
347
 
339
348
  // Check if this is a known command or natural language input
340
349
  const knownCommands = ['init', 'log', 'status', 'analytics', 'visualize', 'brainstorm', 'autopilot', 'plan', 'do', 'review',
341
350
  'activate', 'agent', 'chat', 'login', 'logout', 'whoami', 'switch', 'accounts', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
342
- 'clean', 'verify', 'search', 'skill', 'plugin',
351
+ 'clean', 'verify', 'search', 'skill', 'member', 'plugin',
343
352
  'gmail', 'calendar', 'twitter', 'slack', 'integrations'];
344
353
 
345
354
  // Check if command is an atris.md spec file - triggers welcome visualization
@@ -825,6 +834,10 @@ if (command === 'init') {
825
834
  const subcommand = process.argv[3];
826
835
  const args = process.argv.slice(4);
827
836
  skillCmd(subcommand, ...args);
837
+ } else if (command === 'member') {
838
+ const subcommand = process.argv[3];
839
+ const args = process.argv.slice(4);
840
+ memberCmd(subcommand, ...args);
828
841
  } else if (command === 'plugin') {
829
842
  const subcommand = process.argv[3] || 'build';
830
843
  const args = process.argv.slice(4);
@@ -897,31 +910,22 @@ function initAtris() {
897
910
  console.log('✓ Created TASK_CONTEXTS.md placeholder');
898
911
  }
899
912
 
900
- // Copy agent templates from package
901
- const navigatorSource = path.join(__dirname, '..', 'atris', 'team', 'navigator.md');
902
- const executorSource = path.join(__dirname, '..', 'atris', 'team', 'executor.md');
903
- const validatorSource = path.join(__dirname, '..', 'atris', 'team', 'validator.md');
904
- const launcherSource = path.join(__dirname, '..', 'atris', 'team', 'launcher.md');
913
+ // Copy agent templates from package (MEMBER.md directory format)
914
+ const members = ['navigator', 'executor', 'validator', 'launcher', 'brainstormer'];
915
+ members.forEach(name => {
916
+ const sourceFile = path.join(__dirname, '..', 'atris', 'team', name, 'MEMBER.md');
917
+ const memberDir = path.join(teamDir, name);
918
+ const targetFile = path.join(memberDir, 'MEMBER.md');
919
+ const legacyFile = path.join(teamDir, `${name}.md`);
905
920
 
906
- if (!fs.existsSync(navigatorFile) && fs.existsSync(navigatorSource)) {
907
- fs.copyFileSync(navigatorSource, navigatorFile);
908
- console.log('✓ Created team/navigator.md');
909
- }
910
-
911
- if (!fs.existsSync(executorFile) && fs.existsSync(executorSource)) {
912
- fs.copyFileSync(executorSource, executorFile);
913
- console.log('✓ Created team/executor.md');
914
- }
921
+ if (fs.existsSync(targetFile) || fs.existsSync(legacyFile)) return;
915
922
 
916
- if (!fs.existsSync(validatorFile) && fs.existsSync(validatorSource)) {
917
- fs.copyFileSync(validatorSource, validatorFile);
918
- console.log('✓ Created team/validator.md');
919
- }
920
-
921
- if (!fs.existsSync(launcherFile) && fs.existsSync(launcherSource)) {
922
- fs.copyFileSync(launcherSource, launcherFile);
923
- console.log('✓ Created team/launcher.md');
924
- }
923
+ if (fs.existsSync(sourceFile)) {
924
+ fs.mkdirSync(memberDir, { recursive: true });
925
+ fs.copyFileSync(sourceFile, targetFile);
926
+ console.log(`✓ Created team/${name}/MEMBER.md`);
927
+ }
928
+ });
925
929
 
926
930
  // Copy policies from package
927
931
  const antislopSource = path.join(__dirname, '..', 'atris', 'policies', 'ANTISLOP.md');
@@ -987,10 +991,11 @@ function syncAtris() {
987
991
  { source: 'atrisDev.md', target: 'atrisDev.md' },
988
992
  { source: 'PERSONA.md', target: 'PERSONA.md' },
989
993
  { source: 'GETTING_STARTED.md', target: 'GETTING_STARTED.md' },
990
- { source: 'atris/team/navigator.md', target: 'team/navigator.md' },
991
- { source: 'atris/team/executor.md', target: 'team/executor.md' },
992
- { source: 'atris/team/validator.md', target: 'team/validator.md' },
993
- { source: 'atris/team/launcher.md', target: 'team/launcher.md' },
994
+ { source: 'atris/team/navigator/MEMBER.md', target: 'team/navigator/MEMBER.md' },
995
+ { source: 'atris/team/executor/MEMBER.md', target: 'team/executor/MEMBER.md' },
996
+ { source: 'atris/team/validator/MEMBER.md', target: 'team/validator/MEMBER.md' },
997
+ { source: 'atris/team/launcher/MEMBER.md', target: 'team/launcher/MEMBER.md' },
998
+ { source: 'atris/team/brainstormer/MEMBER.md', target: 'team/brainstormer/MEMBER.md' },
994
999
  { source: 'atris/policies/ANTISLOP.md', target: 'policies/ANTISLOP.md' }
995
1000
  ];
996
1001
 
@@ -1014,6 +1019,7 @@ function syncAtris() {
1014
1019
  return;
1015
1020
  }
1016
1021
 
1022
+ fs.mkdirSync(path.dirname(targetFile), { recursive: true });
1017
1023
  fs.copyFileSync(sourceFile, targetFile);
1018
1024
  console.log(`✓ Updated ${target}`);
1019
1025
  updated++;
package/commands/init.js CHANGED
@@ -475,36 +475,23 @@ function initAtris() {
475
475
  });
476
476
 
477
477
 
478
- const navigatorSource = path.join(__dirname, '..', 'atris', 'team', 'navigator.md');
479
- const executorSource = path.join(__dirname, '..', 'atris', 'team', 'executor.md');
480
- const validatorSource = path.join(__dirname, '..', 'atris', 'team', 'validator.md');
481
- const launcherSource = path.join(__dirname, '..', 'atris', 'team', 'launcher.md');
482
- const brainstormerSource = path.join(__dirname, '..', 'atris', 'team', 'brainstormer.md');
483
-
484
- if (!fs.existsSync(navigatorFile) && fs.existsSync(navigatorSource)) {
485
- fs.copyFileSync(navigatorSource, navigatorFile);
486
- console.log('✓ Created team/navigator.md');
487
- }
488
-
489
- if (!fs.existsSync(executorFile) && fs.existsSync(executorSource)) {
490
- fs.copyFileSync(executorSource, executorFile);
491
- console.log('✓ Created team/executor.md');
492
- }
493
-
494
- if (!fs.existsSync(validatorFile) && fs.existsSync(validatorSource)) {
495
- fs.copyFileSync(validatorSource, validatorFile);
496
- console.log('✓ Created team/validator.md');
497
- }
498
-
499
- if (!fs.existsSync(launcherFile) && fs.existsSync(launcherSource)) {
500
- fs.copyFileSync(launcherSource, launcherFile);
501
- console.log('✓ Created team/launcher.md');
502
- }
503
-
504
- if (!fs.existsSync(brainstormerFile) && fs.existsSync(brainstormerSource)) {
505
- fs.copyFileSync(brainstormerSource, brainstormerFile);
506
- console.log('✓ Created team/brainstormer.md');
507
- }
478
+ // Copy team members (MEMBER.md format directory per member)
479
+ const members = ['navigator', 'executor', 'validator', 'launcher', 'brainstormer'];
480
+ members.forEach(name => {
481
+ const sourceFile = path.join(__dirname, '..', 'atris', 'team', name, 'MEMBER.md');
482
+ const targetDir = path.join(teamDir, name);
483
+ const targetFile = path.join(targetDir, 'MEMBER.md');
484
+ const legacyFile = path.join(teamDir, `${name}.md`);
485
+
486
+ // Skip if already exists (either format)
487
+ if (fs.existsSync(targetFile) || fs.existsSync(legacyFile)) return;
488
+
489
+ if (fs.existsSync(sourceFile)) {
490
+ fs.mkdirSync(targetDir, { recursive: true });
491
+ fs.copyFileSync(sourceFile, targetFile);
492
+ console.log(`✓ Created team/${name}/MEMBER.md`);
493
+ }
494
+ });
508
495
 
509
496
  // Detect project context and generate profile
510
497
  const profile = detectProjectContext(process.cwd());