atris 2.1.0 โ†’ 2.2.1

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.
Files changed (44) hide show
  1. package/AGENT.md +35 -0
  2. package/AGENTS.md +46 -0
  3. package/GETTING_STARTED.md +2 -2
  4. package/PERSONA.md +5 -1
  5. package/README.md +16 -8
  6. package/atris/AGENTS.md +25 -0
  7. package/atris/GEMINI.md +8 -0
  8. package/atris/GETTING_STARTED.md +2 -2
  9. package/atris/atris.md +4 -3
  10. package/atris/features/README.md +41 -15
  11. package/atris/policies/LESSONS.md +1 -0
  12. package/atris/skills/README.md +45 -14
  13. package/atris/skills/atris/SKILL.md +7 -0
  14. package/atris/skills/autopilot/SKILL.md +9 -4
  15. package/atris/skills/autopilot/atris-autopilot.md +71 -0
  16. package/atris/skills/autopilot/hooks/stop-hook.sh +79 -0
  17. package/atris/skills/backend/SKILL.md +6 -1
  18. package/atris/skills/calendar/SKILL.md +301 -0
  19. package/atris/skills/clawhub/atris/SKILL.md +121 -0
  20. package/atris/skills/copy-editor/SKILL.md +470 -0
  21. package/atris/skills/design/SKILL.md +5 -1
  22. package/atris/skills/drive/SKILL.md +333 -0
  23. package/atris/skills/email-agent/SKILL.md +376 -0
  24. package/atris/skills/memory/SKILL.md +8 -0
  25. package/atris/skills/meta/SKILL.md +4 -0
  26. package/atris/skills/skill-improver/SKILL.md +147 -0
  27. package/atris/skills/writing/SKILL.md +3 -0
  28. package/atris/team/brainstormer.md +1 -0
  29. package/atris/team/executor.md +27 -0
  30. package/atris/team/launcher.md +1 -0
  31. package/atris/team/navigator.md +44 -5
  32. package/atris/team/validator.md +44 -3
  33. package/atris.md +37 -1
  34. package/bin/atris.js +58 -5
  35. package/commands/auth.js +24 -4
  36. package/commands/init.js +140 -17
  37. package/commands/integrations.js +330 -0
  38. package/commands/skill.js +496 -0
  39. package/commands/status.js +9 -1
  40. package/commands/sync.js +64 -19
  41. package/commands/workflow.js +7 -0
  42. package/package.json +4 -2
  43. package/utils/auth.js +33 -0
  44. package/commands/stubs.txt +0 -10
@@ -1,3 +1,11 @@
1
+ ---
2
+ name: memory
3
+ description: Search and reason over Atris journal history. Use when user asks about past work, decisions, history, or patterns. Uses RLM pattern (grep first, reason second).
4
+ version: 1.0.0
5
+ tags:
6
+ - memory
7
+ ---
8
+
1
9
  # Atris Memory Skill
2
10
 
3
11
  Search and reason over Atris journal history using the RLM pattern (grep first, reason second).
@@ -1,6 +1,10 @@
1
1
  ---
2
2
  name: meta
3
3
  description: Metacognition skill for AI agents. Use when starting work, feeling stuck, output feels off, or before complex tasks. Teaches how to think about thinking.
4
+ version: 1.0.0
5
+ tags:
6
+ - meta
7
+ - metacognition
4
8
  ---
5
9
 
6
10
  # Meta Skill
@@ -0,0 +1,147 @@
1
+ ---
2
+ name: skill-improver
3
+ description: Audit and improve Claude skills against the Anthropic skill guide. Use when creating new skills, improving existing ones, or preparing skills for ClawHub distribution. Triggers on skill audit, improve skill, new skill, skill quality, or ClawHub publish.
4
+ version: 1.0.0
5
+ tags:
6
+ - developer-tools
7
+ - skill-management
8
+ - quality
9
+ ---
10
+
11
+ # Skill Improver
12
+
13
+ Audit and improve skills to match the Anthropic skill guide standard.
14
+
15
+ ## When to activate
16
+
17
+ - User wants to create a new skill
18
+ - User wants to improve an existing skill
19
+ - Preparing a skill for ClawHub or external distribution
20
+ - After `atris skill audit` reports warnings or failures
21
+
22
+ ## The standard
23
+
24
+ A well-formed skill has:
25
+
26
+ 1. YAML frontmatter with `name` (kebab-case, matches folder), `description` (WHAT + WHEN + triggers, under 1024 chars), `version` (semver), `tags`
27
+ 2. No XML tags anywhere in the file
28
+ 3. Clear numbered instructions with concrete steps
29
+ 4. Error handling guidance
30
+ 5. Examples of input and expected output
31
+ 6. Under 5000 words in SKILL.md (move detail to `references/` subdirectory)
32
+
33
+ ## Audit process
34
+
35
+ 1. Run `atris skill audit [name]` for mechanical checks (12 automated checks)
36
+ 2. Read the SKILL.md for qualitative issues:
37
+ - Is the description specific enough to trigger correctly?
38
+ - Do instructions have concrete steps, not vague guidance?
39
+ - Are there before/after examples?
40
+ - Is error handling covered?
41
+ - Would a new agent understand this without extra context?
42
+ 3. Score: mechanical (CLI) + qualitative (your judgment)
43
+
44
+ ## Fixing common problems
45
+
46
+ ### Weak descriptions
47
+
48
+ Bad: "Essay writing skill. Triggers on: essay, draft"
49
+
50
+ Good: "Structured essay writing with approval gates at each stage (inbox, outline, panel, write, passes). Use when writing essays, drafts, outlines, or long-form content. Triggers on essay, draft, write, outline, or long-form."
51
+
52
+ Pattern: WHAT it does (1 sentence) + WHEN to use it (1 sentence) + trigger words woven in.
53
+
54
+ ### Missing trigger phrases
55
+
56
+ Triggers go IN the description field, not as a separate `triggers` key. The Anthropic spec only recognizes `name` and `description` as required fields.
57
+
58
+ ### Vague instructions
59
+
60
+ Bad: "Follow the writing process"
61
+
62
+ Good:
63
+ 1. Capture raw ideas in inbox format
64
+ 2. Build topic skeleton with evidence slots
65
+ 3. Run panel review (AI challenges claims, user approves)
66
+ 4. Write section by section, getting approval at each gate
67
+ 5. Run three passes: argument (AI), read-aloud (human), sanity (both)
68
+
69
+ ### Name mismatch
70
+
71
+ The `name` field must match the folder name exactly. Folder `backend` needs `name: backend`, not `name: atris-backend`.
72
+
73
+ ### XML tags in content
74
+
75
+ XML-style tags (angle brackets around words) are forbidden. Replace them with bracket notation like `[text]` or plain text. The skill system rejects XML in SKILL.md content.
76
+
77
+ ## Creating a new skill
78
+
79
+ 1. Create folder: `atris/skills/[kebab-name]/`
80
+ 2. Create `SKILL.md` with this template:
81
+
82
+ ```markdown
83
+ ---
84
+ name: your-skill-name
85
+ description: What this skill does. Use when [specific scenarios]. Triggers on [keywords].
86
+ version: 1.0.0
87
+ tags:
88
+ - tag-one
89
+ - tag-two
90
+ ---
91
+
92
+ # Your Skill Name
93
+
94
+ One-line summary of what this skill does.
95
+
96
+ ## When to activate
97
+
98
+ - Scenario 1
99
+ - Scenario 2
100
+
101
+ ## Instructions
102
+
103
+ ### Step 1: [First action]
104
+
105
+ Concrete explanation with example.
106
+
107
+ ### Step 2: [Second action]
108
+
109
+ Concrete explanation with example.
110
+
111
+ ## Examples
112
+
113
+ ### Example 1: [Common scenario]
114
+
115
+ User says: "..."
116
+ Actions: ...
117
+ Result: ...
118
+
119
+ ## Troubleshooting
120
+
121
+ ### Error: [Common problem]
122
+ Cause: [Why]
123
+ Fix: [How]
124
+ ```
125
+
126
+ 3. Run `atris skill audit [name]` to validate
127
+ 4. Run `atris update` to symlink to `.claude/skills/`
128
+
129
+ ## Quality tiers
130
+
131
+ - **Bronze**: Passes all 12 mechanical checks from `atris skill audit`
132
+ - **Silver**: Bronze + good description + numbered steps + examples
133
+ - **Gold**: Silver + error handling + progressive disclosure + tested in production
134
+
135
+ Gold standard reference: `atris/skills/clawhub/atris/SKILL.md`
136
+
137
+ ## Distribution checklist
138
+
139
+ Before publishing to ClawHub or sharing externally:
140
+
141
+ 1. All 12 audit checks pass (`atris skill audit [name]`)
142
+ 2. Description under 1024 chars, includes WHAT + WHEN + triggers
143
+ 3. Version field set (semver)
144
+ 4. Tags present (3-5 relevant tags)
145
+ 5. No internal references (paths must be relative, no hardcoded project paths)
146
+ 6. No README.md inside the skill folder
147
+ 7. SKILL.md is self-contained or uses `references/` for supplementary docs
@@ -1,7 +1,10 @@
1
1
  ---
2
2
  name: writing
3
3
  description: Essay writing skill. Triggers on: essay, draft, write, outline
4
+ version: 1.0.0
4
5
  allowed-tools: Read, Write, Edit, Glob, Grep
6
+ tags:
7
+ - writing
5
8
  ---
6
9
 
7
10
  # Writing Skill
@@ -1,6 +1,7 @@
1
1
  # brainstormer.md โ€” Idea & Reality Shaper
2
2
 
3
3
  > **Role:** Shape ideas, explore possibilities, adapt to user depth | **Source:** Inbox items, raw ideas
4
+ > **Style:** Read `atris/PERSONA.md` for communication style.
4
5
 
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  # executor.md โ€” Builder (The Trigger)
2
2
 
3
3
  > **Role:** Execute from build.md, one step at a time | **Source:** build.md, MAP.md
4
+ > **Style:** Read `atris/PERSONA.md` for communication style.
4
5
 
5
6
  ---
6
7
 
@@ -85,6 +86,32 @@ Feature complete. Ready for review? (y/n)
85
86
  4. **Run tests after changes** โ€” Catch issues immediately
86
87
  5. **No shortcuts** โ€” Follow the build.md steps exactly
87
88
  6. **Anti-slop aware** โ€” Read `atris/policies/ANTISLOP.md` before writing. No sparkles, no filler, no purple prose.
89
+ 7. **Stay in scope** โ€” Only touch files listed in the task. If you need to change something outside scope, stop and flag it. That's a new task.
90
+ 8. **If no exit condition, stop** โ€” A task without a clear "done" definition is not ready for execution. Send it back to navigator.
91
+
92
+ ---
93
+
94
+ ## After Each Task
95
+
96
+ Report what you learned in 1-2 sentences. What did you discover about the codebase? What was surprising? This compounds context for the next task.
97
+
98
+ ```
99
+ Done: [what was completed]
100
+ Learned: [what you now know that you didn't before]
101
+ ```
102
+
103
+ ## Update validate.md
104
+
105
+ After building, update the feature's `validate.md`:
106
+
107
+ - **Context section** โ€” Add what you learned about the codebase during execution. File locations, patterns, gotchas. This is portable knowledge for the next agent.
108
+ - **Errors Hit section** โ€” If you hit errors, document what went wrong and why. This prevents the next agent from falling in the same hole.
109
+
110
+ Don't touch the Status or Checks sections. That's the validator's job.
111
+
112
+ ## Two-Error Rule
113
+
114
+ If you hit two errors on the same task, **stop**. Don't debug from polluted context. Report what you know, update validate.md with the errors, and flag for re-scope. A fresh session with clean context and your notes will solve it faster than a tenth retry.
88
115
 
89
116
  ---
90
117
 
@@ -1,6 +1,7 @@
1
1
  # launcher.md โ€” The Closer
2
2
 
3
3
  > **Role:** Document, capture learnings, publish, celebrate | **Source:** Completed tasks, validation results
4
+ > **Style:** Read `atris/PERSONA.md` for communication style.
4
5
 
5
6
  ---
6
7
 
@@ -1,6 +1,7 @@
1
1
  # navigator.md โ€” Planner
2
2
 
3
3
  > **Role:** Transform messy human intent into precise execution plans | **Source:** idea.md, MAP.md
4
+ > **Style:** Read `atris/PERSONA.md` for communication style.
4
5
 
5
6
  ---
6
7
 
@@ -21,16 +22,32 @@
21
22
 
22
23
  When the human gives you an idea (messy, conversational, exploratory):
23
24
 
24
- 1. **Extract intent** โ€” What are they trying to build? Why?
25
- 2. **Generate atris visualization** โ€” Show them exactly what will happen (frontend boxes / backend flow / database tables)
26
- 3. **Confirm** โ€” "Is THIS what you meant?" (y/n)
27
- 4. **Create idea.md** โ€” Save their messy intent to `atris/features/[name]/idea.md`
28
- 5. **Generate build.md** โ€” Create technical spec in `atris/features/[name]/build.md`
25
+ 1. **Scout first** โ€” Read the relevant files in the codebase. Understand what exists before you plan what's next. Report what you found in 2-3 sentences.
26
+ 2. **Extract intent** โ€” What are they trying to build? Why?
27
+ 3. **Generate atris visualization** โ€” Show them exactly what will happen (frontend boxes / backend flow / database tables)
28
+ 4. **Confirm** โ€” "Is THIS what you meant?" (y/n)
29
+ 5. **Create idea.md** โ€” Save their messy intent to `atris/features/[name]/idea.md`
30
+ 6. **Generate build.md** โ€” Create technical spec in `atris/features/[name]/build.md`
29
31
 
30
32
  **DO NOT execute.** You plan. Executor builds.
31
33
 
32
34
  ---
33
35
 
36
+ ## Task Scoping
37
+
38
+ Every task you create must be:
39
+
40
+ - **One job.** Single file scope or single function scope. If it touches 4+ files, break it into multiple tasks.
41
+ - **Clear exit condition.** State what "done" looks like in one sentence.
42
+ - **Tagged.** Mark each task `[explore]` or `[execute]`:
43
+ - `[explore]` โ€” Read code, research, understand. Output is knowledge.
44
+ - `[execute]` โ€” Build, change, create. Output is code or artifact.
45
+ - **Sequenced.** Put `[explore]` tasks first. They inform the `[execute]` tasks that follow.
46
+
47
+ If you can't write a clear exit condition, the task is too vague. Break it down further or start with an `[explore]` task to clarify.
48
+
49
+ ---
50
+
34
51
  ## atris Visualization Patterns
35
52
 
36
53
  Use these for 99% of dev work:
@@ -102,6 +119,27 @@ tests:
102
119
  - test scenario 2
103
120
  ```
104
121
 
122
+ **validate.md:**
123
+ ```markdown
124
+ # Feature Name โ€” Validation
125
+
126
+ ## Status
127
+ v0 โ€” planned YYYY-MM-DD
128
+ Exit condition: [what "done" looks like in one sentence]
129
+
130
+ ## Checks
131
+ - [verifiable step: run X, expect Y]
132
+ - [verifiable step: check Z]
133
+
134
+ ## Context
135
+ [empty until executor fills in learnings]
136
+
137
+ ## Errors Hit
138
+ [empty until executor reports failures]
139
+ ```
140
+
141
+ Navigator creates validate.md with Status (v0 โ€” planned) and Checks. The executor fills in Context and Errors as it builds. The validator updates Status to v1 โ€” shipped when it passes.
142
+
105
143
  ---
106
144
 
107
145
  ## Rules
@@ -114,6 +152,7 @@ tests:
114
152
  6. **Free-flow works** โ€” Even exploratory conversations go through this flow
115
153
 
116
154
  **Before creating new feature:**
155
+ - Read `atris/lessons.md` for relevant patterns โ€” if a past lesson applies, reference it as a constraint in idea.md
117
156
  - Read atris/features/README.md
118
157
  - Search keywords for similar features
119
158
  - If exists: extend it, don't duplicate
@@ -1,6 +1,7 @@
1
1
  # validator.md โ€” Reviewer (The Safety)
2
2
 
3
3
  > **Role:** Validate execution, update docs, ensure quality | **Source:** build.md, MAP.md, code
4
+ > **Style:** Read `atris/PERSONA.md` for communication style.
4
5
 
5
6
  ---
6
7
 
@@ -84,17 +85,43 @@ Before approving, think 3 times:
84
85
  - All steps completed?
85
86
  - Nothing skipped?
86
87
 
87
- **Think 2: Edge Cases**
88
+ **Think 2: Scope Check**
89
+ - Did the executor stay in scope? Only files listed in the task should be touched.
90
+ - Was the task actually one job? If it sprawled into multiple concerns, flag it.
91
+ - Did the exit condition get met? Not "close enough" โ€” exactly met.
92
+
93
+ **Think 3: Edge Cases**
88
94
  - What could break?
89
95
  - Error handling present?
90
96
  - Boundary conditions covered?
91
97
 
92
- **Think 3: Integration**
98
+ **Think 4: Integration**
93
99
  - Does it work with existing code?
94
100
  - Breaking changes?
95
101
  - Dependencies still valid?
96
102
 
97
- **Then decide:** Approve or block.
103
+ **Then decide:** Approve or block. If scope crept, block and split into proper tasks.
104
+
105
+ ## Update validate.md
106
+
107
+ When a feature passes validation:
108
+
109
+ 1. **Update Status** โ€” Change from `v0 โ€” planned` to `v1 โ€” shipped YYYY-MM-DD` with the exit condition that was met.
110
+ 2. **Verify Checks** โ€” Run every check in the Checks section. All must pass.
111
+ 3. **Review Context** โ€” Make sure the executor's learnings are useful for future agents.
112
+ 4. **Review Errors** โ€” If errors were hit, confirm the root cause is documented.
113
+
114
+ When iterating on a shipped feature, append the new version:
115
+ ```
116
+ ## Status
117
+ v2 โ€” shipped 2026-02-15
118
+ Exit condition: Rate limiting active, 429 after 100 req/min.
119
+
120
+ v1 โ€” shipped 2026-02-07
121
+ Exit condition: Unauthenticated requests return 401, test passes.
122
+ ```
123
+
124
+ Status is the scoreboard. One line per version. Anyone can look at validate.md and know exactly what state the feature is in.
98
125
 
99
126
  ---
100
127
 
@@ -118,4 +145,18 @@ One-line description
118
145
 
119
146
  ---
120
147
 
148
+ ## Harvest Lessons
149
+
150
+ After validation, ask yourself: **did anything surprise me?** Something broke unexpectedly, worked differently than planned, or revealed a pattern worth remembering.
151
+
152
+ If yes, append to `atris/lessons.md`:
153
+
154
+ ```
155
+ - **[YYYY-MM-DD] [feature-name]** โ€” (pass|fail) โ€” One-line lesson
156
+ ```
157
+
158
+ If nothing surprised you, don't write anything. A clean build with no surprises isn't a lesson โ€” it's the system working. Only capture what's genuinely useful for the next navigator reading this file.
159
+
160
+ ---
161
+
121
162
  **Validator = The Safety. Ultrathink. Test. Approve only when perfect.**
package/atris.md CHANGED
@@ -88,15 +88,34 @@ Stage: PLAN โ†’ do โ†’ review (capitalize current stage)
88
88
  ## WORKFLOW
89
89
 
90
90
  ```
91
- plan โ†’ do โ†’ review
91
+ scout โ†’ plan โ†’ do โ†’ review
92
92
  ```
93
93
 
94
+ - **SCOUT** โ€” Read relevant files first. Understand before you act. Report what you found.
94
95
  - **PLAN** โ€” ASCII visualization, get approval, NO code yet
95
96
  - **DO** โ€” Execute step-by-step, update journal
96
97
  - **REVIEW** โ€” Test, validate, clean up, delete completed tasks
97
98
 
98
99
  ---
99
100
 
101
+ ## TASK RULES
102
+
103
+ Every task must follow these rules. No exceptions.
104
+
105
+ **One job per task.** If a task touches more than 2-3 files, break it down. If you can't describe "done" in one sentence, it's too big.
106
+
107
+ **Clear exit condition.** Every task states what "done" looks like. Not "improve auth" โ€” instead: "Add session check to upload handler. Done when: unauthenticated requests return 401 and test passes."
108
+
109
+ **Tag every task:**
110
+ - `[explore]` โ€” Ambiguous. Needs reading, research, judgment. Output is understanding.
111
+ - `[execute]` โ€” Precise. Route is clear. Just do it. Output is code or artifact.
112
+
113
+ **Explore before execute.** When starting a new area of work, the first tasks should be `[explore]`. Read the files. Map the space. Report what you found. Then plan `[execute]` tasks based on what you learned.
114
+
115
+ **Sequence matters.** Order tasks so each one builds context for the next. Early tasks should teach you about the problem. Later tasks use that knowledge.
116
+
117
+ ---
118
+
100
119
  ## AGENTS
101
120
 
102
121
  | Command | Agent | Guardrail |
@@ -168,6 +187,22 @@ Specs loaded at activate from `team/*.md`
168
187
 
169
188
  ---
170
189
 
190
+ ## PERSISTENCE
191
+
192
+ Context window = cache. Disk = truth. Route discoveries as they happen.
193
+
194
+ | You discover... | Write to... | Format |
195
+ |---------------------|----------------------|----------------------|
196
+ | Code location | MAP.md | file:line reference |
197
+ | New task | TODO.md | Task + exit condition |
198
+ | Decision / tradeoff | Journal โ†’ Notes | Timestamped line |
199
+ | Something learned | lessons.md | One-line lesson |
200
+ | Work finished | Journal โ†’ Completed | C#: description |
201
+
202
+ Don't batch. Don't wait for session end. Nothing important should live only in-context.
203
+
204
+ ---
205
+
171
206
  ## RULES
172
207
 
173
208
  - 3-4 sentences max
@@ -175,6 +210,7 @@ Specs loaded at activate from `team/*.md`
175
210
  - Check MAP.md before touching code
176
211
  - Update journal after completing work
177
212
  - Delete tasks when done (target: 0)
213
+ - Persist as you go (see PERSISTENCE)
178
214
 
179
215
  ---
180
216
 
package/bin/atris.js CHANGED
@@ -192,10 +192,22 @@ function showHelp() {
192
192
  console.log('Cloud & agents:');
193
193
  console.log(' agent - Select which Atris agent to use');
194
194
  console.log(' chat - Chat with the selected Atris agent');
195
- console.log(' login - Authenticate with Atris cloud (optional)');
195
+ console.log(' login - Authenticate (use --token <t> for non-interactive)');
196
196
  console.log(' logout - Remove credentials');
197
197
  console.log(' whoami - Show auth status');
198
198
  console.log('');
199
+ console.log('Integrations:');
200
+ console.log(' gmail - Email commands (inbox, read)');
201
+ console.log(' calendar - Calendar commands (today, week)');
202
+ console.log(' twitter - Twitter commands (post)');
203
+ console.log(' slack - Slack commands (channels)');
204
+ console.log(' integrations - Show integration status');
205
+ console.log('');
206
+ console.log('Skills:');
207
+ console.log(' skill list - Show all skills with compliance status');
208
+ console.log(' skill audit [name] - Validate skill against Anthropic guide');
209
+ console.log(' skill fix [name] - Auto-fix common compliance issues');
210
+ console.log('');
199
211
  console.log('Other:');
200
212
  console.log(' version - Show Atris version');
201
213
  console.log(' help - Show this help');
@@ -301,11 +313,13 @@ const { statusAtris: statusCmd } = require('../commands/status');
301
313
  const { analyticsAtris: analyticsCmd } = require('../commands/analytics');
302
314
  const { cleanAtris: cleanCmd } = require('../commands/clean');
303
315
  const { verifyAtris: verifyCmd } = require('../commands/verify');
316
+ const { skillCommand: skillCmd } = require('../commands/skill');
304
317
 
305
318
  // Check if this is a known command or natural language input
306
319
  const knownCommands = ['init', 'log', 'status', 'analytics', 'visualize', 'brainstorm', 'autopilot', 'plan', 'do', 'review',
307
320
  'activate', 'agent', 'chat', 'login', 'logout', 'whoami', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
308
- 'clean', 'verify', 'search'];
321
+ 'clean', 'verify', 'search', 'skill',
322
+ 'gmail', 'calendar', 'twitter', 'slack', 'integrations'];
309
323
 
310
324
  // Check if command is an atris.md spec file - triggers welcome visualization
311
325
  function isSpecFile(cmd) {
@@ -749,6 +763,43 @@ if (command === 'init') {
749
763
  } else if (command === 'search') {
750
764
  const keyword = process.argv.slice(3).join(' ');
751
765
  searchJournal(keyword);
766
+ } else if (command === 'gmail') {
767
+ const { gmailCommand } = require('../commands/integrations');
768
+ const subcommand = process.argv[3];
769
+ const args = process.argv.slice(4);
770
+ gmailCommand(subcommand, ...args)
771
+ .then(() => process.exit(0))
772
+ .catch((err) => { console.error(err.message); process.exit(1); });
773
+ } else if (command === 'calendar') {
774
+ const { calendarCommand } = require('../commands/integrations');
775
+ const subcommand = process.argv[3];
776
+ const args = process.argv.slice(4);
777
+ calendarCommand(subcommand, ...args)
778
+ .then(() => process.exit(0))
779
+ .catch((err) => { console.error(err.message); process.exit(1); });
780
+ } else if (command === 'twitter') {
781
+ const { twitterCommand } = require('../commands/integrations');
782
+ const subcommand = process.argv[3];
783
+ const args = process.argv.slice(4);
784
+ twitterCommand(subcommand, ...args)
785
+ .then(() => process.exit(0))
786
+ .catch((err) => { console.error(err.message); process.exit(1); });
787
+ } else if (command === 'slack') {
788
+ const { slackCommand } = require('../commands/integrations');
789
+ const subcommand = process.argv[3];
790
+ const args = process.argv.slice(4);
791
+ slackCommand(subcommand, ...args)
792
+ .then(() => process.exit(0))
793
+ .catch((err) => { console.error(err.message); process.exit(1); });
794
+ } else if (command === 'integrations') {
795
+ const { integrationsStatus } = require('../commands/integrations');
796
+ integrationsStatus()
797
+ .then(() => process.exit(0))
798
+ .catch((err) => { console.error(err.message); process.exit(1); });
799
+ } else if (command === 'skill') {
800
+ const subcommand = process.argv[3];
801
+ const args = process.argv.slice(4);
802
+ skillCmd(subcommand, ...args);
752
803
  } else {
753
804
  console.log(`Unknown command: ${command}`);
754
805
  console.log('Run "atris help" to see available commands');
@@ -1936,7 +1987,7 @@ async function loginAtris() {
1936
1987
  process.exit(0);
1937
1988
  } else if (choice === '2') {
1938
1989
  console.log('\n๐Ÿ“‹ Manual Token Entry');
1939
- console.log('Get your token from: https://app.atris.ai/settings/api\n');
1990
+ console.log('Get your token from: https://atris.ai/auth/cli\n');
1940
1991
 
1941
1992
  const tokenInput = await promptUser('Paste your API token: ');
1942
1993
 
@@ -2261,7 +2312,7 @@ async function agentAtris() {
2261
2312
  const agents = result.data?.my_agents || [];
2262
2313
 
2263
2314
  if (agents.length === 0) {
2264
- console.log('No agents found. Create one at https://app.atris.ai');
2315
+ console.log('No agents found. Create one at https://atris.ai');
2265
2316
  process.exit(0);
2266
2317
  }
2267
2318
 
@@ -2564,13 +2615,15 @@ async function atrisDevEntry(userInput = null) {
2564
2615
  if (existingFeatures.length > 0) {
2565
2616
  console.log(' Existing: ' + existingFeatures.join(', '));
2566
2617
  }
2567
- console.log(' NEW feature โ†’ atris/features/[name]/idea.md + build.md');
2618
+ console.log(' NEW feature โ†’ atris/features/[name]/idea.md + build.md + validate.md');
2568
2619
  console.log(' EXISTING โ†’ Update that feature\'s docs');
2569
2620
  console.log(' SIMPLE โ†’ TODO.md only');
2570
2621
  console.log('');
2571
2622
  console.log('STEP 3: Create/update docs');
2572
2623
  console.log(' idea.md = intent (any format)');
2573
2624
  console.log(' build.md = technical spec');
2625
+ console.log(' validate.md = proof it works (from _templates/validate.md.template)');
2626
+ console.log(' lessons.md = read past lessons before planning, write new ones after validating');
2574
2627
  console.log('');
2575
2628
  console.log('โ›” DO NOT execute โ€” that\'s for "atris do"');
2576
2629
  console.log('');
package/commands/auth.js CHANGED
@@ -1,13 +1,33 @@
1
1
  const { loadCredentials, saveCredentials, deleteCredentials, getCredentialsPath, openBrowser, promptUser, displayAccountSummary } = require('../utils/auth');
2
2
  const { getAppBaseUrl, apiRequestJson } = require('../utils/api');
3
3
 
4
- async function loginAtris() {
5
-
4
+ async function loginAtris(options = {}) {
5
+ // Support: atris login --token <token> --force
6
+ const args = process.argv.slice(3);
7
+ const forceFlag = args.includes('--force') || args.includes('-f') || options.force;
8
+ const tokenIndex = args.indexOf('--token');
9
+ const directToken = tokenIndex !== -1 ? args[tokenIndex + 1] : options.token;
10
+
6
11
  try {
7
12
  console.log('๐Ÿ” Login to AtrisOS\n');
8
13
 
9
14
  const existing = loadCredentials();
10
- if (existing) {
15
+
16
+ // Direct token mode (non-interactive)
17
+ if (directToken) {
18
+ const trimmed = directToken.trim();
19
+ saveCredentials(trimmed, null, existing?.email || null, existing?.user_id || null, existing?.provider || 'manual');
20
+ console.log('Token saved. Validatingโ€ฆ\n');
21
+ const summary = await displayAccountSummary(apiRequestJson);
22
+ if (summary.error) {
23
+ console.log('\nโš ๏ธ Token saved, but validation failed.');
24
+ process.exit(1);
25
+ }
26
+ console.log('\nโœ“ Logged in successfully.');
27
+ process.exit(0);
28
+ }
29
+
30
+ if (existing && !forceFlag) {
11
31
  const label = existing.email || existing.user_id || 'unknown user';
12
32
  console.log(`Already logged in as: ${label}`);
13
33
  const confirm = await promptUser('Do you want to login again? (y/N): ');
@@ -70,7 +90,7 @@ async function loginAtris() {
70
90
  process.exit(0);
71
91
  } else if (choice === '2') {
72
92
  console.log('\n๐Ÿ“‹ Manual Token Entry');
73
- console.log('Get your token from: https://app.atris.ai/settings/api\n');
93
+ console.log('Get your token from: https://atris.ai/auth/cli\n');
74
94
 
75
95
  const tokenInput = await promptUser('Paste your API token: ');
76
96