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.
- package/README.md +32 -7
- package/atris/skills/atris/SKILL.md +15 -2
- package/atris/skills/atris-feedback/SKILL.md +7 -0
- package/atris/skills/design/SKILL.md +29 -2
- package/atris/skills/engines/SKILL.md +44 -0
- package/atris/skills/flow/SKILL.md +1 -1
- package/atris/skills/wake/SKILL.md +37 -0
- package/atris/skills/youtube/SKILL.md +13 -39
- package/atris/team/validator/MEMBER.md +1 -0
- package/atris/wiki/concepts/agent-activation-contract.md +3 -3
- package/atris/wiki/concepts/workspace-initialization-contract.md +3 -3
- package/atris/wiki/index.md +1 -0
- package/atris.md +43 -19
- package/bin/atris.js +413 -31
- package/commands/agent-spawn.js +480 -0
- package/commands/analytics.js +6 -3
- package/commands/apps.js +11 -0
- package/commands/autopilot.js +42 -18
- package/commands/brain.js +74 -7
- package/commands/brainstorm.js +9 -58
- package/commands/clean.js +1 -4
- package/commands/compile.js +9 -4
- package/commands/console.js +8 -3
- package/commands/deck.js +184 -0
- package/commands/init.js +22 -11
- package/commands/lesson.js +76 -0
- package/commands/member.js +252 -48
- package/commands/mission.js +405 -13
- package/commands/now.js +4 -2
- package/commands/probe.js +105 -27
- package/commands/pulse.js +504 -0
- package/commands/radar.js +1 -0
- package/commands/recap.js +71 -25
- package/commands/run.js +615 -22
- package/commands/site.js +48 -0
- package/commands/slop.js +307 -0
- package/commands/spaceship.js +39 -0
- package/commands/sync.js +0 -2
- package/commands/task.js +429 -37
- package/commands/theme.js +217 -0
- package/commands/verify.js +7 -3
- package/lib/activity-stream.js +166 -0
- package/lib/auto-accept-certified.js +23 -1
- package/lib/context-gatherer.js +170 -0
- package/lib/deck-from-md.js +110 -0
- package/lib/escape-regexp.js +13 -0
- package/lib/file-ops.js +6 -3
- package/lib/html-render.js +257 -0
- package/lib/journal.js +1 -1
- package/lib/lesson-contradiction.js +113 -0
- package/lib/memory-view.js +95 -0
- package/lib/policy-lessons.js +3 -2
- package/lib/pulse.js +401 -0
- package/lib/runner-command.js +156 -0
- package/lib/site.js +114 -0
- package/lib/slides-deck.js +237 -0
- package/lib/state-detection.js +1 -4
- package/lib/task-db.js +101 -4
- package/lib/task-proof.js +1 -1
- package/lib/theme.js +264 -0
- package/lib/todo-fallback.js +2 -1
- package/lib/todo-sections.js +33 -0
- package/package.json +1 -2
- package/utils/api.js +14 -2
- 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 || '')
|
|
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
|
|
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}
|
|
114
|
-
if (data.waiting.length) headline.push(`${data.waiting.length}
|
|
115
|
-
if (data.inProgress.length) headline.push(`${data.inProgress.length}
|
|
116
|
-
lines.push(headline.length ?
|
|
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(`
|
|
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
|
-
|
|
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
|
|
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(`
|
|
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('
|
|
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(`
|
|
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(`
|
|
149
|
-
lines.push('
|
|
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
|
|
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}
|
|
159
|
-
if (data.waiting.length) lines.push(`- ${data.waiting.length}
|
|
160
|
-
if (data.inProgress.length) lines.push(`- ${data.inProgress.length}
|
|
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)} (
|
|
196
|
+
lines.push(`- ${shortTitle(t.title, 80)} (${plainCheck(t.proof, 60)})`);
|
|
167
197
|
}
|
|
168
198
|
}
|
|
169
199
|
lines.push('');
|
|
170
|
-
lines.push('
|
|
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
|
|
206
|
+
atris recap - what got done, in plain English
|
|
177
207
|
|
|
178
|
-
atris recap Last 7 days:
|
|
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
|
-
|
|
184
|
-
|
|
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 });
|