atris 3.16.1 → 3.22.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.
Files changed (65) hide show
  1. package/README.md +32 -7
  2. package/atris/skills/atris/SKILL.md +15 -2
  3. package/atris/skills/atris-feedback/SKILL.md +7 -0
  4. package/atris/skills/design/SKILL.md +29 -2
  5. package/atris/skills/engines/SKILL.md +44 -0
  6. package/atris/skills/flow/SKILL.md +1 -1
  7. package/atris/skills/wake/SKILL.md +37 -0
  8. package/atris/skills/youtube/SKILL.md +13 -39
  9. package/atris/team/validator/MEMBER.md +1 -0
  10. package/atris/wiki/concepts/agent-activation-contract.md +3 -3
  11. package/atris/wiki/concepts/workspace-initialization-contract.md +3 -3
  12. package/atris/wiki/index.md +1 -0
  13. package/atris.md +43 -19
  14. package/bin/atris.js +413 -31
  15. package/commands/agent-spawn.js +480 -0
  16. package/commands/analytics.js +6 -3
  17. package/commands/apps.js +11 -0
  18. package/commands/autopilot.js +42 -18
  19. package/commands/brain.js +74 -7
  20. package/commands/brainstorm.js +9 -58
  21. package/commands/clean.js +1 -4
  22. package/commands/compile.js +9 -4
  23. package/commands/console.js +8 -3
  24. package/commands/deck.js +184 -0
  25. package/commands/init.js +22 -11
  26. package/commands/lesson.js +76 -0
  27. package/commands/member.js +252 -48
  28. package/commands/mission.js +405 -13
  29. package/commands/now.js +4 -2
  30. package/commands/probe.js +105 -27
  31. package/commands/pulse.js +504 -0
  32. package/commands/radar.js +1 -0
  33. package/commands/recap.js +71 -25
  34. package/commands/run.js +615 -22
  35. package/commands/site.js +48 -0
  36. package/commands/slop.js +307 -0
  37. package/commands/spaceship.js +39 -0
  38. package/commands/sync.js +0 -2
  39. package/commands/task.js +429 -37
  40. package/commands/theme.js +217 -0
  41. package/commands/verify.js +7 -3
  42. package/lib/activity-stream.js +166 -0
  43. package/lib/auto-accept-certified.js +23 -1
  44. package/lib/context-gatherer.js +170 -0
  45. package/lib/deck-from-md.js +110 -0
  46. package/lib/escape-regexp.js +13 -0
  47. package/lib/file-ops.js +6 -3
  48. package/lib/html-render.js +257 -0
  49. package/lib/journal.js +1 -1
  50. package/lib/lesson-contradiction.js +113 -0
  51. package/lib/memory-view.js +95 -0
  52. package/lib/policy-lessons.js +3 -2
  53. package/lib/pulse.js +401 -0
  54. package/lib/runner-command.js +156 -0
  55. package/lib/site.js +114 -0
  56. package/lib/slides-deck.js +237 -0
  57. package/lib/state-detection.js +1 -4
  58. package/lib/task-db.js +101 -4
  59. package/lib/task-proof.js +1 -1
  60. package/lib/theme.js +264 -0
  61. package/lib/todo-fallback.js +2 -1
  62. package/lib/todo-sections.js +33 -0
  63. package/package.json +1 -2
  64. package/utils/api.js +14 -2
  65. package/atris/atrisDev.md +0 -717
package/commands/recap.js CHANGED
@@ -53,8 +53,35 @@ function shortProof(proof, width = 70) {
53
53
  return flat.length <= width ? flat : `${flat.slice(0, width - 1)}…`;
54
54
  }
55
55
 
56
+ function plainCheck(proof, width = 70) {
57
+ if (!proof) return null;
58
+ const flat = proof.replace(/\s+/g, ' ').trim();
59
+ const checks = [];
60
+ const add = label => { if (!checks.includes(label)) checks.push(label); };
61
+
62
+ if (/\b(PR|pull request)\b.*\b(merged|MERGED)\b|\bmerged\b.*\b(PR|pull request)\b/i.test(flat)) add('merged');
63
+ if (/\b(node --test|npm test|npm run test|pytest|go test|cargo test|test\/|tests?)\b/i.test(flat)
64
+ && /\b(pass|passed|green|ok|0 failures?|9\/9|12\/12)\b/i.test(flat)) add('tests passed');
65
+ if (/\b(node --check|git diff --check|git diff --exit-code|git diff --quiet|rg\b|grep\b|diff --brief|cmp -s)\b/i.test(flat)) add('code check passed');
66
+ if (/\b(bench|benchmark|measured|latency|speed)\b/i.test(flat)) add('measured improvement');
67
+ if (/\brepeated agent review\b|\bagent review\b/i.test(flat)) add('reviewed repeatedly');
68
+ if (/\batris\/runs\/[^\s]+\.json\b|receipt\b/i.test(flat)) add('record saved');
69
+ if (/\b(human approved|accepted by|accepted_at|reward)\b/i.test(flat)) add('human accepted');
70
+
71
+ if (checks.length) return checks.join(', ');
72
+ return shortProof(proof, width);
73
+ }
74
+
56
75
  function shortTitle(title, width = 64) {
57
- const flat = String(title || '').replace(/\s+/g, ' ').trim();
76
+ const flat = String(title || '')
77
+ .replace(/\bproof\b/gi, 'checks')
78
+ .replace(/\breceipts?\b/gi, 'records')
79
+ .replace(/\bsign[- ]off\b/gi, 'approval')
80
+ .replace(/\bpolicy\b/gi, 'rules')
81
+ .replace(/\bAgentXP\b/g, 'reward')
82
+ .replace(/\bcertified\b/gi, 'checked')
83
+ .replace(/\s+/g, ' ')
84
+ .trim();
58
85
  return flat.length <= width ? flat : `${flat.slice(0, width - 1)}…`;
59
86
  }
60
87
 
@@ -103,85 +130,88 @@ function renderRecap(data) {
103
130
  `RECAP — ${data.workspace}`,
104
131
  '',
105
132
  'No task history yet.',
106
- 'Run "atris init", then let an agent work every finished task lands here with proof.',
133
+ 'Run "atris init", then let Atris do one small job. Finished work will show up here with the checks that passed.',
107
134
  ].join('\n');
108
135
  }
109
136
  const lines = [];
110
137
  lines.push(`RECAP — ${data.workspace} — last ${data.days} day${data.days === 1 ? '' : 's'}`);
111
138
  lines.push('');
139
+ lines.push('Plain English: what changed, how it was checked, and what still needs you.');
112
140
  const headline = [];
113
- if (data.shipped.length) headline.push(`${data.shipped.length} change${data.shipped.length === 1 ? '' : 's'} shipped`);
114
- if (data.waiting.length) headline.push(`${data.waiting.length} finished and waiting for your sign-off`);
115
- if (data.inProgress.length) headline.push(`${data.inProgress.length} in progress`);
116
- lines.push(headline.length ? `Your AI team: ${headline.join(' · ')}.` : 'Quiet window — no movement in this period.');
117
- lines.push('Every finished line below carries proof: the commands run and their results.');
141
+ if (data.shipped.length) headline.push(`${data.shipped.length} done`);
142
+ if (data.waiting.length) headline.push(`${data.waiting.length} needs you`);
143
+ if (data.inProgress.length) headline.push(`${data.inProgress.length} still working`);
144
+ lines.push(headline.length ? headline.join(' · ') : 'Quiet window — no movement in this period.');
118
145
 
119
146
  if (data.shipped.length) {
120
147
  lines.push('');
121
- lines.push(`SHIPPED (accepted by a human) — ${data.shipped.length}`);
148
+ lines.push(`DONE — ${data.shipped.length}`);
122
149
  for (const t of data.shipped.slice(0, 12)) {
123
150
  lines.push(` ${t.id} ${shortTitle(t.title)}`);
124
- if (t.proof) lines.push(` proof: ${shortProof(t.proof)}`);
151
+ const check = plainCheck(t.proof);
152
+ if (check) lines.push(` checked: ${check}`);
125
153
  }
126
- if (data.shipped.length > 12) lines.push(` … and ${data.shipped.length - 12} more, all with proof on file`);
154
+ if (data.shipped.length > 12) lines.push(` … and ${data.shipped.length - 12} more`);
127
155
  }
128
156
 
129
157
  if (data.waiting.length) {
130
158
  lines.push('');
131
- lines.push(`FINISHED, WAITING FOR YOUR SIGN-OFF — ${data.waiting.length}`);
159
+ lines.push(`NEEDS YOU — ${data.waiting.length}`);
132
160
  for (const t of data.waiting.slice(0, 10)) {
133
161
  lines.push(` ${t.id} ${shortTitle(t.title)}`);
162
+ const check = plainCheck(t.proof);
163
+ if (check) lines.push(` checked: ${check}`);
134
164
  }
135
165
  if (data.waiting.length > 10) lines.push(` … and ${data.waiting.length - 10} more`);
136
- lines.push(' approve or send back: atris task reviews');
166
+ lines.push(' next: run atris task reviews');
137
167
  }
138
168
 
139
169
  if (data.inProgress.length) {
140
170
  lines.push('');
141
- lines.push(`IN PROGRESS — ${data.inProgress.length}`);
171
+ lines.push(`STILL WORKING — ${data.inProgress.length}`);
142
172
  for (const t of data.inProgress) {
143
173
  lines.push(` ${t.id} ${shortTitle(t.title)}${t.owner ? ` @${t.owner}` : ''}`);
144
174
  }
145
175
  }
146
176
 
147
177
  lines.push('');
148
- lines.push(`Proof attached: ${data.proof_attached}/${data.proof_total} finished items.`);
149
- lines.push('Paste-ready summary for Slack or email: atris recap --share');
178
+ lines.push(`Checked: ${data.proof_attached}/${data.proof_total} finished items.`);
179
+ lines.push('Share this: atris recap --share');
150
180
  return lines.join('\n');
151
181
  }
152
182
 
153
183
  function renderShare(data) {
154
184
  if (data.empty) return `Nothing to share yet on ${data.workspace} — no finished tasks on record.`;
155
185
  const lines = [];
156
- lines.push(`What the AI team did on ${data.workspace} in the last ${data.days} day${data.days === 1 ? '' : 's'}:`);
186
+ lines.push(`What got done on ${data.workspace} in the last ${data.days} day${data.days === 1 ? '' : 's'}:`);
157
187
  lines.push('');
158
- if (data.shipped.length) lines.push(`- ${data.shipped.length} change${data.shipped.length === 1 ? '' : 's'} shipped, each verified before a human accepted it`);
159
- if (data.waiting.length) lines.push(`- ${data.waiting.length} more finished with proof attached, waiting for human sign-off`);
160
- if (data.inProgress.length) lines.push(`- ${data.inProgress.length} task${data.inProgress.length === 1 ? '' : 's'} in progress`);
188
+ if (data.shipped.length) lines.push(`- ${data.shipped.length} done and accepted`);
189
+ if (data.waiting.length) lines.push(`- ${data.waiting.length} ready for you to approve or send back`);
190
+ if (data.inProgress.length) lines.push(`- ${data.inProgress.length} still being worked on`);
161
191
  const highlights = [...data.shipped, ...data.waiting].filter(t => t.proof).slice(0, 5);
162
192
  if (highlights.length) {
163
193
  lines.push('');
164
194
  lines.push('Highlights:');
165
195
  for (const t of highlights) {
166
- lines.push(`- ${shortTitle(t.title, 80)} (proof: ${shortProof(t.proof, 60)})`);
196
+ lines.push(`- ${shortTitle(t.title, 80)} (${plainCheck(t.proof, 60)})`);
167
197
  }
168
198
  }
169
199
  lines.push('');
170
- lines.push('Every item above is backed by a receipt the exact commands run and their results — not a status update someone typed.');
200
+ lines.push('The finished items are backed by actual checks that ran, not a status update someone typed.');
171
201
  return lines.join('\n');
172
202
  }
173
203
 
174
204
  function printRecapHelp() {
175
205
  console.log(`
176
- atris recap - what your AI team actually did, in plain English
206
+ atris recap - what got done, in plain English
177
207
 
178
- atris recap Last 7 days: shipped, waiting on you, in progress
208
+ atris recap Last 7 days: done, needs you, still working
179
209
  atris recap --days 30 Widen the window
180
210
  atris recap --share Paste-ready summary for Slack, email, or a customer
181
211
  atris recap --json Structured output for agents and dashboards
182
212
 
183
- Reads the workspace task records and their proof. No jargon, no guesses:
184
- if it is listed as finished, the receipt is on file.
213
+ Looks at Atris' saved work and explains it without internal jargon:
214
+ what changed, how it was checked, and what still needs you.
185
215
  `);
186
216
  }
187
217
 
@@ -190,6 +220,22 @@ function recapAtris(args = []) {
190
220
  printRecapHelp();
191
221
  return;
192
222
  }
223
+ if (args.includes('--html')) {
224
+ // another way to view memory updates: a beautiful HTML page of what the workspace learned
225
+ const { buildMemorySpec } = require('../lib/memory-view');
226
+ const { renderHtml, renderBlock, THEMES: HTML_THEMES } = require('../lib/html-render');
227
+ const { mergedThemes } = require('../lib/theme');
228
+ const themes = mergedThemes(HTML_THEMES);
229
+ const flagVal = (n) => { const i = args.indexOf(n); return i !== -1 ? args[i + 1] : null; };
230
+ const spec = buildMemorySpec(process.cwd(), { theme: flagVal('--theme'), brand: flagVal('--brand') });
231
+ if (!themes[spec.theme]) spec.theme = 'atris';
232
+ if (args.includes('--block')) { console.log(JSON.stringify(renderBlock(spec, { title: 'Workspace memory', themes }), null, 2)); return; }
233
+ const html = renderHtml(spec, { title: 'Workspace memory', themes });
234
+ const out = flagVal('--out');
235
+ if (out) { fs.writeFileSync(out, html); console.log(`\n ✓ memory view written: ${out}\n`); }
236
+ else process.stdout.write(html + '\n');
237
+ return;
238
+ }
193
239
  const daysIdx = args.indexOf('--days');
194
240
  const days = daysIdx !== -1 ? Number(args[daysIdx + 1]) : DEFAULT_DAYS;
195
241
  const data = buildRecapData(process.cwd(), { days });