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.
- package/atris/skills/clawhub/atris/SKILL.md +1 -1
- package/atris/skills/drive/SKILL.md +2 -38
- package/atris/skills/email-agent/SKILL.md +0 -30
- package/atris/skills/slack/SKILL.md +4 -15
- package/atris/team/{brainstormer.md → brainstormer/MEMBER.md} +17 -2
- package/atris/team/{executor.md → executor/MEMBER.md} +17 -2
- package/atris/team/{launcher.md → launcher/MEMBER.md} +18 -2
- package/atris/team/{navigator.md → navigator/MEMBER.md} +17 -2
- package/atris/team/{validator.md → validator/MEMBER.md} +18 -2
- package/bin/atris.js +34 -28
- package/commands/init.js +17 -30
- package/commands/member.js +461 -0
- package/commands/skill.js +395 -1
- package/commands/sync.js +6 -5
- package/commands/workflow.js +9 -3
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: atris
|
|
3
|
-
description:
|
|
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.
|
|
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
|
|
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.
|
|
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/
|
|
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 `{
|
|
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.
|
|
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
|
-
|
|
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
|
-
> **
|
|
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
|
-
|
|
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
|
-
> **
|
|
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
|
-
|
|
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
|
-
> **
|
|
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
|
-
|
|
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
|
-
> **
|
|
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
|
-
|
|
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
|
-
> **
|
|
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
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
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
|
-
|
|
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
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
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
|
-
|
|
479
|
-
const
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
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());
|