atris 2.0.21 → 2.1.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/GETTING_STARTED.md +4 -4
- package/atris/GETTING_STARTED.md +4 -4
- package/atris/atris.md +3 -3
- package/atris/skills/README.md +1 -0
- package/atris/skills/autopilot/SKILL.md +96 -0
- package/atris.md +3 -3
- package/bin/atris.js +80 -28
- package/commands/brainstorm.js +8 -8
- package/commands/init.js +14 -14
- package/commands/sync.js +6 -6
- package/commands/workflow.js +3 -3
- package/package.json +2 -2
- /package/atris/{agent_team → team}/brainstormer.md +0 -0
- /package/atris/{agent_team → team}/executor.md +0 -0
- /package/atris/{agent_team → team}/launcher.md +0 -0
- /package/atris/{agent_team → team}/navigator.md +0 -0
- /package/atris/{agent_team → team}/validator.md +0 -0
package/GETTING_STARTED.md
CHANGED
|
@@ -12,7 +12,7 @@ atris/
|
|
|
12
12
|
├── atris.md (atrisDev protocol + specs)
|
|
13
13
|
├── CLAUDE.md (tells agents to follow atrisDev)
|
|
14
14
|
├── MAP.md (navigation - AI will generate)
|
|
15
|
-
└──
|
|
15
|
+
└── team/ (agent specs)
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
## Quick Start (2 Steps)
|
|
@@ -91,7 +91,7 @@ Your system's navigation guide. Contains:
|
|
|
91
91
|
|
|
92
92
|
**Use it:** When you need to find something fast or onboard new people
|
|
93
93
|
|
|
94
|
-
###
|
|
94
|
+
### team/navigator.md
|
|
95
95
|
Your "where is X?" expert. Ask it questions like:
|
|
96
96
|
- "Where is the authentication logic?"
|
|
97
97
|
- "Show me all API endpoints"
|
|
@@ -99,7 +99,7 @@ Your "where is X?" expert. Ask it questions like:
|
|
|
99
99
|
|
|
100
100
|
Always cites MAP.md with exact file:line references.
|
|
101
101
|
|
|
102
|
-
###
|
|
102
|
+
### team/executor.md
|
|
103
103
|
Your task runner. Give it work like:
|
|
104
104
|
- "Add authentication to the upload endpoint"
|
|
105
105
|
- "Fix the bug in user registration"
|
|
@@ -107,7 +107,7 @@ Your task runner. Give it work like:
|
|
|
107
107
|
|
|
108
108
|
Reads MAP.md, plans execution with file:line references, executes step-by-step.
|
|
109
109
|
|
|
110
|
-
###
|
|
110
|
+
### team/validator.md
|
|
111
111
|
Your quality gatekeeper. Runs after changes to:
|
|
112
112
|
- Check for breaking changes
|
|
113
113
|
- Update MAP.md if structure changed
|
package/atris/GETTING_STARTED.md
CHANGED
|
@@ -12,7 +12,7 @@ atris/
|
|
|
12
12
|
├── atris.md (atrisDev protocol + specs)
|
|
13
13
|
├── CLAUDE.md (tells agents to follow atrisDev)
|
|
14
14
|
├── MAP.md (navigation - AI will generate)
|
|
15
|
-
└──
|
|
15
|
+
└── team/ (agent specs)
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
## Quick Start (2 Steps)
|
|
@@ -91,7 +91,7 @@ Your system's navigation guide. Contains:
|
|
|
91
91
|
|
|
92
92
|
**Use it:** When you need to find something fast or onboard new people
|
|
93
93
|
|
|
94
|
-
###
|
|
94
|
+
### team/navigator.md
|
|
95
95
|
Your "where is X?" expert. Ask it questions like:
|
|
96
96
|
- "Where is the authentication logic?"
|
|
97
97
|
- "Show me all API endpoints"
|
|
@@ -99,7 +99,7 @@ Your "where is X?" expert. Ask it questions like:
|
|
|
99
99
|
|
|
100
100
|
Always cites MAP.md with exact file:line references.
|
|
101
101
|
|
|
102
|
-
###
|
|
102
|
+
### team/executor.md
|
|
103
103
|
Your task runner. Give it work like:
|
|
104
104
|
- "Add authentication to the upload endpoint"
|
|
105
105
|
- "Fix the bug in user registration"
|
|
@@ -107,7 +107,7 @@ Your task runner. Give it work like:
|
|
|
107
107
|
|
|
108
108
|
Reads MAP.md, plans execution with file:line references, executes step-by-step.
|
|
109
109
|
|
|
110
|
-
###
|
|
110
|
+
### team/validator.md
|
|
111
111
|
Your quality gatekeeper. Runs after changes to:
|
|
112
112
|
- Check for breaking changes
|
|
113
113
|
- Update MAP.md if structure changed
|
package/atris/atris.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
1. Load context (ONE time, remember for session):
|
|
12
12
|
- `atris/logs/YYYY/YYYY-MM-DD.md` (today's journal)
|
|
13
13
|
- `atris/MAP.md` (navigation overview)
|
|
14
|
-
- `atris/
|
|
14
|
+
- `atris/team/*.md` (all agent specs)
|
|
15
15
|
|
|
16
16
|
2. Output this EXACT box:
|
|
17
17
|
|
|
@@ -108,7 +108,7 @@ plan → do → review
|
|
|
108
108
|
|
|
109
109
|
`atris next` = auto-selects agent based on journal state
|
|
110
110
|
|
|
111
|
-
Specs loaded at activate from `
|
|
111
|
+
Specs loaded at activate from `team/*.md`
|
|
112
112
|
|
|
113
113
|
---
|
|
114
114
|
|
|
@@ -143,7 +143,7 @@ Specs loaded at activate from `agent_team/*.md`
|
|
|
143
143
|
| `TODO.md` | Task queue (target: 0) |
|
|
144
144
|
| `logs/YYYY/MM-DD.md` | Journal (daily) |
|
|
145
145
|
| `PERSONA.md` | Communication style |
|
|
146
|
-
| `
|
|
146
|
+
| `team/` | Agent behaviors |
|
|
147
147
|
| `atrisDev.md` | Full spec (reference) |
|
|
148
148
|
|
|
149
149
|
---
|
package/atris/skills/README.md
CHANGED
|
@@ -24,6 +24,7 @@ atris/skills/writing/SKILL.md ← source of truth
|
|
|
24
24
|
| Skill | Description | Policy |
|
|
25
25
|
|-------|-------------|--------|
|
|
26
26
|
| atris | Atris workflow enforcement + plan/do/review | `policies/ANTISLOP.md` |
|
|
27
|
+
| autopilot | PRD-driven autonomous execution - loops until done | — |
|
|
27
28
|
| meta | Metacognition for agents - how to think about thinking | `policies/LESSONS.md` |
|
|
28
29
|
| design | Frontend aesthetics - avoid generic AI look | `policies/atris-design.md` |
|
|
29
30
|
| backend | Backend architecture - prevent over-engineering | `policies/atris-backend.md` |
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: PRD-driven autonomous execution - give it a task, it loops until done
|
|
3
|
+
triggers: [autopilot, autonomous, "get it done", "finish this", "ship it"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Autopilot Skill
|
|
7
|
+
|
|
8
|
+
Autonomous task execution. Plan → Do → Review loop until acceptance criteria pass.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
- User says "get this done" or "ship it"
|
|
13
|
+
- User describes a feature/bug and wants hands-off execution
|
|
14
|
+
- Any task that can be validated with acceptance criteria
|
|
15
|
+
|
|
16
|
+
## Process
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌───────────────────────────────────────────────────────┐
|
|
20
|
+
│ INPUT: "Add dark mode toggle" │
|
|
21
|
+
│ │
|
|
22
|
+
│ 1. GENERATE PRD │
|
|
23
|
+
│ - Type: feature or bug (auto-detect) │
|
|
24
|
+
│ - Acceptance criteria (testable conditions) │
|
|
25
|
+
│ - Priority: 1 (single story) │
|
|
26
|
+
│ │
|
|
27
|
+
│ 2. LOOP (max 5 iterations) │
|
|
28
|
+
│ ┌──────────────────────────────────────┐ │
|
|
29
|
+
│ │ PLAN: Navigator creates tasks │ │
|
|
30
|
+
│ │ - Read MAP.md for file locations │ │
|
|
31
|
+
│ │ - ASCII diagram of approach │ │
|
|
32
|
+
│ │ - Add tasks to TODO.md │ │
|
|
33
|
+
│ │ - Signal: [PLAN_COMPLETE] │ │
|
|
34
|
+
│ ├──────────────────────────────────────┤ │
|
|
35
|
+
│ │ DO: Executor builds │ │
|
|
36
|
+
│ │ - Implement each task │ │
|
|
37
|
+
│ │ - Verify changes work │ │
|
|
38
|
+
│ │ - Commit changes │ │
|
|
39
|
+
│ │ - Signal: [DO_COMPLETE] │ │
|
|
40
|
+
│ ├──────────────────────────────────────┤ │
|
|
41
|
+
│ │ REVIEW: Validator checks │ │
|
|
42
|
+
│ │ - Check acceptance criteria │ │
|
|
43
|
+
│ │ - If fail: [REVIEW_FAILED] reason │ │
|
|
44
|
+
│ │ - If pass: <promise>COMPLETE</promise> │
|
|
45
|
+
│ └──────────────────────────────────────┘ │
|
|
46
|
+
│ │
|
|
47
|
+
│ 3. OUTPUT │
|
|
48
|
+
│ - prd.json: PRD with passes: true │
|
|
49
|
+
│ - progress.txt: Execution log │
|
|
50
|
+
│ - Journal: Completion logged │
|
|
51
|
+
└───────────────────────────────────────────────────────┘
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Acceptance Criteria Templates
|
|
55
|
+
|
|
56
|
+
**Feature:**
|
|
57
|
+
- Feature implemented and working as described
|
|
58
|
+
- Tests pass (if test suite exists)
|
|
59
|
+
- Build passes
|
|
60
|
+
- Code follows project patterns (check MAP.md)
|
|
61
|
+
|
|
62
|
+
**Bug:**
|
|
63
|
+
- Bug is fixed and no longer reproducible
|
|
64
|
+
- Regression test added (if applicable)
|
|
65
|
+
- Build passes
|
|
66
|
+
- No new bugs introduced
|
|
67
|
+
|
|
68
|
+
## Commands
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# With description
|
|
72
|
+
atris autopilot "Add dark mode toggle"
|
|
73
|
+
|
|
74
|
+
# Bug fix
|
|
75
|
+
atris autopilot --bug "Login fails on Safari"
|
|
76
|
+
|
|
77
|
+
# From TODO.md backlog
|
|
78
|
+
atris autopilot --from-todo
|
|
79
|
+
|
|
80
|
+
# With options
|
|
81
|
+
atris autopilot "Add feature" --iterations=3 --verbose
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Stop Conditions
|
|
85
|
+
|
|
86
|
+
1. `<promise>COMPLETE</promise>` — All acceptance criteria met
|
|
87
|
+
2. Max iterations reached (default: 5)
|
|
88
|
+
3. Error that can't be recovered
|
|
89
|
+
|
|
90
|
+
## Rules
|
|
91
|
+
|
|
92
|
+
- ONE task at a time
|
|
93
|
+
- Verify before marking passes: true
|
|
94
|
+
- Minimal changes only
|
|
95
|
+
- Check MAP.md before touching code
|
|
96
|
+
- Log to journal when complete
|
package/atris.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
1. Load context (ONE time, remember for session):
|
|
12
12
|
- `atris/logs/YYYY/YYYY-MM-DD.md` (today's journal)
|
|
13
13
|
- `atris/MAP.md` (navigation overview)
|
|
14
|
-
- `atris/
|
|
14
|
+
- `atris/team/*.md` (all agent specs)
|
|
15
15
|
|
|
16
16
|
2. Output this EXACT box:
|
|
17
17
|
|
|
@@ -108,7 +108,7 @@ plan → do → review
|
|
|
108
108
|
|
|
109
109
|
`atris next` = auto-selects agent based on journal state
|
|
110
110
|
|
|
111
|
-
Specs loaded at activate from `
|
|
111
|
+
Specs loaded at activate from `team/*.md`
|
|
112
112
|
|
|
113
113
|
---
|
|
114
114
|
|
|
@@ -143,7 +143,7 @@ Specs loaded at activate from `agent_team/*.md`
|
|
|
143
143
|
| `TODO.md` | Task queue (target: 0) |
|
|
144
144
|
| `logs/YYYY/MM-DD.md` | Journal (daily) |
|
|
145
145
|
| `PERSONA.md` | Communication style |
|
|
146
|
-
| `
|
|
146
|
+
| `team/` | Agent behaviors |
|
|
147
147
|
| `atrisDev.md` | Full spec (reference) |
|
|
148
148
|
|
|
149
149
|
---
|
package/bin/atris.js
CHANGED
|
@@ -164,6 +164,7 @@ function showHelp() {
|
|
|
164
164
|
console.log('Setup:');
|
|
165
165
|
console.log(' init - Initialize Atris in current project');
|
|
166
166
|
console.log(' update - Update local files to latest version');
|
|
167
|
+
console.log(' upgrade - Install latest Atris from npm');
|
|
167
168
|
console.log('');
|
|
168
169
|
console.log('Core workflow:');
|
|
169
170
|
console.log(' plan - Create build spec with visualization');
|
|
@@ -303,7 +304,7 @@ const { verifyAtris: verifyCmd } = require('../commands/verify');
|
|
|
303
304
|
|
|
304
305
|
// Check if this is a known command or natural language input
|
|
305
306
|
const knownCommands = ['init', 'log', 'status', 'analytics', 'visualize', 'brainstorm', 'autopilot', 'plan', 'do', 'review',
|
|
306
|
-
'activate', 'agent', 'chat', 'login', 'logout', 'whoami', 'update', 'version', 'help', 'next', 'atris',
|
|
307
|
+
'activate', 'agent', 'chat', 'login', 'logout', 'whoami', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
|
|
307
308
|
'clean', 'verify', 'search'];
|
|
308
309
|
|
|
309
310
|
// Check if command is an atris.md spec file - triggers welcome visualization
|
|
@@ -616,6 +617,8 @@ if (command === 'init') {
|
|
|
616
617
|
activateCmd();
|
|
617
618
|
} else if (command === 'update') {
|
|
618
619
|
syncCmd();
|
|
620
|
+
} else if (command === 'upgrade') {
|
|
621
|
+
upgradeAtris();
|
|
619
622
|
} else if (command === 'chat') {
|
|
620
623
|
chatAtris()
|
|
621
624
|
.then(() => process.exit(0))
|
|
@@ -754,7 +757,7 @@ if (command === 'init') {
|
|
|
754
757
|
|
|
755
758
|
function initAtris() {
|
|
756
759
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
757
|
-
const
|
|
760
|
+
const teamDir = path.join(targetDir, 'team');
|
|
758
761
|
const sourceFile = path.join(__dirname, '..', 'atris.md');
|
|
759
762
|
const targetFile = path.join(targetDir, 'atris.md');
|
|
760
763
|
|
|
@@ -766,10 +769,10 @@ function initAtris() {
|
|
|
766
769
|
console.log('✓ atris/ folder already exists');
|
|
767
770
|
}
|
|
768
771
|
|
|
769
|
-
// Create
|
|
770
|
-
if (!fs.existsSync(
|
|
771
|
-
fs.mkdirSync(
|
|
772
|
-
console.log('✓ Created atris/
|
|
772
|
+
// Create team/ subfolder
|
|
773
|
+
if (!fs.existsSync(teamDir)) {
|
|
774
|
+
fs.mkdirSync(teamDir, { recursive: true });
|
|
775
|
+
console.log('✓ Created atris/team/ folder');
|
|
773
776
|
}
|
|
774
777
|
|
|
775
778
|
// Create policies/ subfolder
|
|
@@ -784,10 +787,10 @@ function initAtris() {
|
|
|
784
787
|
const personaFile = path.join(targetDir, 'PERSONA.md');
|
|
785
788
|
const mapFile = path.join(targetDir, 'MAP.md');
|
|
786
789
|
const taskContextsFile = path.join(targetDir, 'TASK_CONTEXTS.md');
|
|
787
|
-
const navigatorFile = path.join(
|
|
788
|
-
const executorFile = path.join(
|
|
789
|
-
const validatorFile = path.join(
|
|
790
|
-
const launcherFile = path.join(
|
|
790
|
+
const navigatorFile = path.join(teamDir, 'navigator.md');
|
|
791
|
+
const executorFile = path.join(teamDir, 'executor.md');
|
|
792
|
+
const validatorFile = path.join(teamDir, 'validator.md');
|
|
793
|
+
const launcherFile = path.join(teamDir, 'launcher.md');
|
|
791
794
|
|
|
792
795
|
const gettingStartedSource = path.join(__dirname, '..', 'GETTING_STARTED.md');
|
|
793
796
|
const personaSource = path.join(__dirname, '..', 'PERSONA.md');
|
|
@@ -815,29 +818,29 @@ function initAtris() {
|
|
|
815
818
|
}
|
|
816
819
|
|
|
817
820
|
// Copy agent templates from package
|
|
818
|
-
const navigatorSource = path.join(__dirname, '..', 'atris', '
|
|
819
|
-
const executorSource = path.join(__dirname, '..', 'atris', '
|
|
820
|
-
const validatorSource = path.join(__dirname, '..', 'atris', '
|
|
821
|
-
const launcherSource = path.join(__dirname, '..', 'atris', '
|
|
821
|
+
const navigatorSource = path.join(__dirname, '..', 'atris', 'team', 'navigator.md');
|
|
822
|
+
const executorSource = path.join(__dirname, '..', 'atris', 'team', 'executor.md');
|
|
823
|
+
const validatorSource = path.join(__dirname, '..', 'atris', 'team', 'validator.md');
|
|
824
|
+
const launcherSource = path.join(__dirname, '..', 'atris', 'team', 'launcher.md');
|
|
822
825
|
|
|
823
826
|
if (!fs.existsSync(navigatorFile) && fs.existsSync(navigatorSource)) {
|
|
824
827
|
fs.copyFileSync(navigatorSource, navigatorFile);
|
|
825
|
-
console.log('✓ Created
|
|
828
|
+
console.log('✓ Created team/navigator.md');
|
|
826
829
|
}
|
|
827
830
|
|
|
828
831
|
if (!fs.existsSync(executorFile) && fs.existsSync(executorSource)) {
|
|
829
832
|
fs.copyFileSync(executorSource, executorFile);
|
|
830
|
-
console.log('✓ Created
|
|
833
|
+
console.log('✓ Created team/executor.md');
|
|
831
834
|
}
|
|
832
835
|
|
|
833
836
|
if (!fs.existsSync(validatorFile) && fs.existsSync(validatorSource)) {
|
|
834
837
|
fs.copyFileSync(validatorSource, validatorFile);
|
|
835
|
-
console.log('✓ Created
|
|
838
|
+
console.log('✓ Created team/validator.md');
|
|
836
839
|
}
|
|
837
840
|
|
|
838
841
|
if (!fs.existsSync(launcherFile) && fs.existsSync(launcherSource)) {
|
|
839
842
|
fs.copyFileSync(launcherSource, launcherFile);
|
|
840
|
-
console.log('✓ Created
|
|
843
|
+
console.log('✓ Created team/launcher.md');
|
|
841
844
|
}
|
|
842
845
|
|
|
843
846
|
// Copy policies from package
|
|
@@ -859,7 +862,7 @@ function initAtris() {
|
|
|
859
862
|
console.log(' ├── atris.md (AI agent instructions)');
|
|
860
863
|
console.log(' ├── MAP.md (placeholder)');
|
|
861
864
|
console.log(' ├── TASK_CONTEXTS.md (placeholder)');
|
|
862
|
-
console.log(' ├──
|
|
865
|
+
console.log(' ├── team/');
|
|
863
866
|
console.log(' │ ├── navigator.md');
|
|
864
867
|
console.log(' │ ├── executor.md');
|
|
865
868
|
console.log(' │ ├── validator.md');
|
|
@@ -878,7 +881,7 @@ function initAtris() {
|
|
|
878
881
|
|
|
879
882
|
function syncAtris() {
|
|
880
883
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
881
|
-
const
|
|
884
|
+
const teamDir = path.join(targetDir, 'team');
|
|
882
885
|
|
|
883
886
|
// Check if atris/ folder exists
|
|
884
887
|
if (!fs.existsSync(targetDir)) {
|
|
@@ -886,9 +889,9 @@ function syncAtris() {
|
|
|
886
889
|
process.exit(1);
|
|
887
890
|
}
|
|
888
891
|
|
|
889
|
-
// Ensure
|
|
890
|
-
if (!fs.existsSync(
|
|
891
|
-
fs.mkdirSync(
|
|
892
|
+
// Ensure team folder exists
|
|
893
|
+
if (!fs.existsSync(teamDir)) {
|
|
894
|
+
fs.mkdirSync(teamDir, { recursive: true });
|
|
892
895
|
}
|
|
893
896
|
|
|
894
897
|
// Ensure policies folder exists
|
|
@@ -904,10 +907,10 @@ function syncAtris() {
|
|
|
904
907
|
{ source: 'atrisDev.md', target: 'atrisDev.md' },
|
|
905
908
|
{ source: 'PERSONA.md', target: 'PERSONA.md' },
|
|
906
909
|
{ source: 'GETTING_STARTED.md', target: 'GETTING_STARTED.md' },
|
|
907
|
-
{ source: 'atris/
|
|
908
|
-
{ source: 'atris/
|
|
909
|
-
{ source: 'atris/
|
|
910
|
-
{ source: 'atris/
|
|
910
|
+
{ source: 'atris/team/navigator.md', target: 'team/navigator.md' },
|
|
911
|
+
{ source: 'atris/team/executor.md', target: 'team/executor.md' },
|
|
912
|
+
{ source: 'atris/team/validator.md', target: 'team/validator.md' },
|
|
913
|
+
{ source: 'atris/team/launcher.md', target: 'team/launcher.md' },
|
|
911
914
|
{ source: 'atris/policies/ANTISLOP.md', target: 'policies/ANTISLOP.md' }
|
|
912
915
|
];
|
|
913
916
|
|
|
@@ -944,6 +947,55 @@ function syncAtris() {
|
|
|
944
947
|
}
|
|
945
948
|
}
|
|
946
949
|
|
|
950
|
+
async function upgradeAtris() {
|
|
951
|
+
console.log('');
|
|
952
|
+
console.log('┌─────────────────────────────────────────────────────────────┐');
|
|
953
|
+
console.log('│ Atris Upgrade │');
|
|
954
|
+
console.log('└─────────────────────────────────────────────────────────────┘');
|
|
955
|
+
console.log('');
|
|
956
|
+
console.log(`Current version: ${CLI_VERSION}`);
|
|
957
|
+
console.log('');
|
|
958
|
+
console.log('Checking for updates...');
|
|
959
|
+
|
|
960
|
+
// Force check npm for latest version
|
|
961
|
+
const updateInfo = await checkForUpdates(true);
|
|
962
|
+
|
|
963
|
+
if (!updateInfo || !updateInfo.needsUpdate) {
|
|
964
|
+
console.log('');
|
|
965
|
+
console.log('✓ You are on the latest version!');
|
|
966
|
+
console.log('');
|
|
967
|
+
return;
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
console.log('');
|
|
971
|
+
console.log(`📦 Update available: ${updateInfo.installed} → ${updateInfo.latest}`);
|
|
972
|
+
console.log('');
|
|
973
|
+
console.log('Installing update...');
|
|
974
|
+
console.log('');
|
|
975
|
+
|
|
976
|
+
// Run npm update -g atris
|
|
977
|
+
const result = spawnSync('npm', ['update', '-g', 'atris'], {
|
|
978
|
+
stdio: 'inherit',
|
|
979
|
+
shell: true
|
|
980
|
+
});
|
|
981
|
+
|
|
982
|
+
if (result.status === 0) {
|
|
983
|
+
console.log('');
|
|
984
|
+
console.log('✓ Atris upgraded successfully!');
|
|
985
|
+
console.log('');
|
|
986
|
+
console.log('Run `atris update` in your projects to sync local files.');
|
|
987
|
+
console.log('');
|
|
988
|
+
} else {
|
|
989
|
+
console.log('');
|
|
990
|
+
console.log('✗ Upgrade failed. Try running manually:');
|
|
991
|
+
console.log(' npm update -g atris');
|
|
992
|
+
console.log('');
|
|
993
|
+
console.log('If you see permission errors, try:');
|
|
994
|
+
console.log(' sudo npm update -g atris');
|
|
995
|
+
console.log('');
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
|
|
947
999
|
// ============================================
|
|
948
1000
|
// Log System
|
|
949
1001
|
// ============================================
|
|
@@ -2528,7 +2580,7 @@ async function atrisDevEntry(userInput = null) {
|
|
|
2528
2580
|
|
|
2529
2581
|
function launchAtris() {
|
|
2530
2582
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
2531
|
-
const launcherFile = path.join(targetDir, '
|
|
2583
|
+
const launcherFile = path.join(targetDir, 'team', 'launcher.md');
|
|
2532
2584
|
|
|
2533
2585
|
if (!fs.existsSync(launcherFile)) {
|
|
2534
2586
|
console.log('✗ launcher.md not found. Run "atris init" first.');
|
package/commands/brainstorm.js
CHANGED
|
@@ -354,10 +354,10 @@ function generateWorkflowFile(workflowFile, metadata) {
|
|
|
354
354
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
355
355
|
|
|
356
356
|
// Load all context needed for agents
|
|
357
|
-
const navigatorFile = path.join(targetDir, '
|
|
358
|
-
const executorFile = path.join(targetDir, '
|
|
359
|
-
const validatorFile = path.join(targetDir, '
|
|
360
|
-
const launcherFile = path.join(targetDir, '
|
|
357
|
+
const navigatorFile = path.join(targetDir, 'team', 'navigator.md');
|
|
358
|
+
const executorFile = path.join(targetDir, 'team', 'executor.md');
|
|
359
|
+
const validatorFile = path.join(targetDir, 'team', 'validator.md');
|
|
360
|
+
const launcherFile = path.join(targetDir, 'team', 'launcher.md');
|
|
361
361
|
const personaFile = path.join(targetDir, 'PERSONA.md');
|
|
362
362
|
const mapFile = path.join(targetDir, 'MAP.md');
|
|
363
363
|
const todoFile = path.join(targetDir, 'TODO.md');
|
|
@@ -471,10 +471,10 @@ async function autopilotAtris(initialIdea = null) {
|
|
|
471
471
|
throw new Error('atris/ folder not found. Run "atris init" first.');
|
|
472
472
|
}
|
|
473
473
|
|
|
474
|
-
const navigatorFile = path.join(targetDir, '
|
|
475
|
-
const executorFile = path.join(targetDir, '
|
|
476
|
-
const validatorFile = path.join(targetDir, '
|
|
477
|
-
const launcherFile = path.join(targetDir, '
|
|
474
|
+
const navigatorFile = path.join(targetDir, 'team', 'navigator.md');
|
|
475
|
+
const executorFile = path.join(targetDir, 'team', 'executor.md');
|
|
476
|
+
const validatorFile = path.join(targetDir, 'team', 'validator.md');
|
|
477
|
+
const launcherFile = path.join(targetDir, 'team', 'launcher.md');
|
|
478
478
|
|
|
479
479
|
const missingSpecs = [];
|
|
480
480
|
if (!fs.existsSync(navigatorFile)) missingSpecs.push('navigator.md');
|
package/commands/init.js
CHANGED
|
@@ -150,7 +150,7 @@ function detectProjectContext(projectRoot = process.cwd()) {
|
|
|
150
150
|
|
|
151
151
|
/**
|
|
152
152
|
* Inject project-specific patterns into agent specs
|
|
153
|
-
* @param {string} agentTeamDir - Directory containing
|
|
153
|
+
* @param {string} agentTeamDir - Directory containing team specs
|
|
154
154
|
* @param {Object} profile - Project profile from detectProjectContext()
|
|
155
155
|
*/
|
|
156
156
|
function injectProjectPatterns(agentTeamDir, profile) {
|
|
@@ -229,7 +229,7 @@ ${profile.hasCode ? `**Validation:** Run \`${profile.testCommand}\` to verify ch
|
|
|
229
229
|
|
|
230
230
|
function initAtris() {
|
|
231
231
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
232
|
-
const agentTeamDir = path.join(targetDir, '
|
|
232
|
+
const agentTeamDir = path.join(targetDir, 'team');
|
|
233
233
|
const sourceFile = path.join(__dirname, '..', 'atris.md');
|
|
234
234
|
const targetFile = path.join(targetDir, 'atris.md');
|
|
235
235
|
|
|
@@ -242,7 +242,7 @@ function initAtris() {
|
|
|
242
242
|
|
|
243
243
|
if (!fs.existsSync(agentTeamDir)) {
|
|
244
244
|
fs.mkdirSync(agentTeamDir, { recursive: true });
|
|
245
|
-
console.log('✓ Created atris/
|
|
245
|
+
console.log('✓ Created atris/team/ folder');
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
const gettingStartedFile = path.join(targetDir, 'GETTING_STARTED.md');
|
|
@@ -427,35 +427,35 @@ function initAtris() {
|
|
|
427
427
|
});
|
|
428
428
|
|
|
429
429
|
|
|
430
|
-
const navigatorSource = path.join(__dirname, '..', 'atris', '
|
|
431
|
-
const executorSource = path.join(__dirname, '..', 'atris', '
|
|
432
|
-
const validatorSource = path.join(__dirname, '..', 'atris', '
|
|
433
|
-
const launcherSource = path.join(__dirname, '..', 'atris', '
|
|
434
|
-
const brainstormerSource = path.join(__dirname, '..', 'atris', '
|
|
430
|
+
const navigatorSource = path.join(__dirname, '..', 'atris', 'team', 'navigator.md');
|
|
431
|
+
const executorSource = path.join(__dirname, '..', 'atris', 'team', 'executor.md');
|
|
432
|
+
const validatorSource = path.join(__dirname, '..', 'atris', 'team', 'validator.md');
|
|
433
|
+
const launcherSource = path.join(__dirname, '..', 'atris', 'team', 'launcher.md');
|
|
434
|
+
const brainstormerSource = path.join(__dirname, '..', 'atris', 'team', 'brainstormer.md');
|
|
435
435
|
|
|
436
436
|
if (!fs.existsSync(navigatorFile) && fs.existsSync(navigatorSource)) {
|
|
437
437
|
fs.copyFileSync(navigatorSource, navigatorFile);
|
|
438
|
-
console.log('✓ Created
|
|
438
|
+
console.log('✓ Created team/navigator.md');
|
|
439
439
|
}
|
|
440
440
|
|
|
441
441
|
if (!fs.existsSync(executorFile) && fs.existsSync(executorSource)) {
|
|
442
442
|
fs.copyFileSync(executorSource, executorFile);
|
|
443
|
-
console.log('✓ Created
|
|
443
|
+
console.log('✓ Created team/executor.md');
|
|
444
444
|
}
|
|
445
445
|
|
|
446
446
|
if (!fs.existsSync(validatorFile) && fs.existsSync(validatorSource)) {
|
|
447
447
|
fs.copyFileSync(validatorSource, validatorFile);
|
|
448
|
-
console.log('✓ Created
|
|
448
|
+
console.log('✓ Created team/validator.md');
|
|
449
449
|
}
|
|
450
450
|
|
|
451
451
|
if (!fs.existsSync(launcherFile) && fs.existsSync(launcherSource)) {
|
|
452
452
|
fs.copyFileSync(launcherSource, launcherFile);
|
|
453
|
-
console.log('✓ Created
|
|
453
|
+
console.log('✓ Created team/launcher.md');
|
|
454
454
|
}
|
|
455
455
|
|
|
456
456
|
if (!fs.existsSync(brainstormerFile) && fs.existsSync(brainstormerSource)) {
|
|
457
457
|
fs.copyFileSync(brainstormerSource, brainstormerFile);
|
|
458
|
-
console.log('✓ Created
|
|
458
|
+
console.log('✓ Created team/brainstormer.md');
|
|
459
459
|
}
|
|
460
460
|
|
|
461
461
|
// Detect project context and generate profile
|
|
@@ -466,7 +466,7 @@ function initAtris() {
|
|
|
466
466
|
|
|
467
467
|
// Inject project patterns into agent specs
|
|
468
468
|
injectProjectPatterns(agentTeamDir, profile);
|
|
469
|
-
console.log('✓ Injected project patterns into
|
|
469
|
+
console.log('✓ Injected project patterns into team specs');
|
|
470
470
|
|
|
471
471
|
// Create agent instruction files for different tools
|
|
472
472
|
const agentInstructions = `# AGENTS.md — Universal Agent Instructions
|
package/commands/sync.js
CHANGED
|
@@ -3,7 +3,7 @@ const path = require('path');
|
|
|
3
3
|
|
|
4
4
|
function syncAtris() {
|
|
5
5
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
6
|
-
const agentTeamDir = path.join(targetDir, '
|
|
6
|
+
const agentTeamDir = path.join(targetDir, 'team');
|
|
7
7
|
|
|
8
8
|
if (!fs.existsSync(targetDir)) {
|
|
9
9
|
console.error('✗ Error: atris/ folder not found. Run "atris init" first.');
|
|
@@ -27,11 +27,11 @@ function syncAtris() {
|
|
|
27
27
|
{ source: 'PERSONA.md', target: 'PERSONA.md' },
|
|
28
28
|
{ source: 'GETTING_STARTED.md', target: 'GETTING_STARTED.md' },
|
|
29
29
|
{ source: 'atris/CLAUDE.md', target: 'CLAUDE.md' },
|
|
30
|
-
{ source: 'atris/
|
|
31
|
-
{ source: 'atris/
|
|
32
|
-
{ source: 'atris/
|
|
33
|
-
{ source: 'atris/
|
|
34
|
-
{ source: 'atris/
|
|
30
|
+
{ source: 'atris/team/navigator.md', target: 'team/navigator.md' },
|
|
31
|
+
{ source: 'atris/team/executor.md', target: 'team/executor.md' },
|
|
32
|
+
{ source: 'atris/team/validator.md', target: 'team/validator.md' },
|
|
33
|
+
{ source: 'atris/team/launcher.md', target: 'team/launcher.md' },
|
|
34
|
+
{ source: 'atris/team/brainstormer.md', target: 'team/brainstormer.md' },
|
|
35
35
|
{ source: 'atris/policies/ANTISLOP.md', target: 'policies/ANTISLOP.md' }
|
|
36
36
|
];
|
|
37
37
|
|
package/commands/workflow.js
CHANGED
|
@@ -14,7 +14,7 @@ async function planAtris(userInput = null) {
|
|
|
14
14
|
const executionMode = executeFlag ? 'agent' : (config.execution_mode || 'prompt');
|
|
15
15
|
|
|
16
16
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
17
|
-
const navigatorFile = path.join(targetDir, '
|
|
17
|
+
const navigatorFile = path.join(targetDir, 'team', 'navigator.md');
|
|
18
18
|
const personaPath = path.join(targetDir, 'PERSONA.md');
|
|
19
19
|
const mapFilePath = path.join(targetDir, 'MAP.md');
|
|
20
20
|
const featuresReadmePath = path.join(targetDir, 'features', 'README.md');
|
|
@@ -307,7 +307,7 @@ async function doAtris() {
|
|
|
307
307
|
|
|
308
308
|
const cwd = process.cwd();
|
|
309
309
|
const targetDir = path.join(cwd, 'atris');
|
|
310
|
-
const executorFile = path.join(targetDir, '
|
|
310
|
+
const executorFile = path.join(targetDir, 'team', 'executor.md');
|
|
311
311
|
|
|
312
312
|
if (!fs.existsSync(executorFile)) {
|
|
313
313
|
console.log('✗ executor.md not found. Run "atris init" first.');
|
|
@@ -676,7 +676,7 @@ async function reviewAtris() {
|
|
|
676
676
|
const executionMode = executeFlag ? 'agent' : (config.execution_mode || 'prompt');
|
|
677
677
|
|
|
678
678
|
const targetDir = path.join(process.cwd(), 'atris');
|
|
679
|
-
const validatorFile = path.join(targetDir, '
|
|
679
|
+
const validatorFile = path.join(targetDir, 'team', 'validator.md');
|
|
680
680
|
|
|
681
681
|
if (!fs.existsSync(validatorFile)) {
|
|
682
682
|
console.log('✗ validator.md not found. Run "atris init" first.');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atris",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "atrisDev (atris dev) - CLI for AI coding agents. Works with Claude Code, Cursor, Windsurf. Make any codebase AI-navigable.",
|
|
5
5
|
"main": "bin/atris.js",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"PERSONA.md",
|
|
18
18
|
"atris/CLAUDE.md",
|
|
19
19
|
"atris/GEMINI.md",
|
|
20
|
-
"atris/
|
|
20
|
+
"atris/team/",
|
|
21
21
|
"atris/features/_templates/",
|
|
22
22
|
"atris/policies/",
|
|
23
23
|
"atris/skills/"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|