atris 3.15.46 → 3.15.49
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/AGENTS.md +2 -2
- package/atris/skills/atris/SKILL.md +1 -1
- package/atris/wiki/index.md +2 -0
- package/bin/atris.js +12 -4
- package/commands/brain.js +77 -3
- package/commands/business.js +574 -21
- package/commands/computer.js +23 -17
- package/commands/mission.js +18 -2
- package/commands/now.js +45 -5
- package/commands/radar.js +754 -0
- package/commands/sync.js +101 -1
- package/commands/task.js +84 -0
- package/lib/task-db.js +29 -3
- package/package.json +2 -1
- package/templates/business-starter/MAP.md +1 -0
- package/templates/business-starter/team/README.md +3 -0
- package/templates/business-starter/team/START_HERE.md +45 -0
package/AGENTS.md
CHANGED
|
@@ -130,7 +130,7 @@ member -> mission start --verify -> status --status active -> one bounded step -
|
|
|
130
130
|
This workspace has a compiled agent brain.
|
|
131
131
|
|
|
132
132
|
On session start, activate it first:
|
|
133
|
-
`atris brain activate --root /Users/keshavrao/arena/
|
|
133
|
+
`atris brain activate --root /Users/keshavrao/arena/atris-cli --verify`
|
|
134
134
|
|
|
135
135
|
Load these first:
|
|
136
136
|
- `atris/now.md`
|
|
@@ -149,5 +149,5 @@ Shape: `<operator>, today is about <move>` -> `I picked this because <why now>`
|
|
|
149
149
|
Definitions: operator = current person or agent; move = one concrete high-leverage workflow; why now = business reason; ready = prepared action or proof; paths = 2-4 optional deeper views.
|
|
150
150
|
|
|
151
151
|
Re-run after meaningful work:
|
|
152
|
-
`atris brain compile --root /Users/keshavrao/arena/
|
|
152
|
+
`atris brain compile --root /Users/keshavrao/arena/atris-cli`
|
|
153
153
|
<!-- ATRIS_BRAIN_COMPILE:END -->
|
|
@@ -26,4 +26,4 @@ Key behaviors:
|
|
|
26
26
|
- Read PERSONA.md (3-4 sentences, ASCII visuals)
|
|
27
27
|
- Check MAP.md for file:line refs
|
|
28
28
|
- Use `atris task` for claims, proof, ready, and accept
|
|
29
|
-
- Treat TODO.md as a rendered view; regenerate it instead of hand-editing tasks
|
|
29
|
+
- Treat TODO.md as a rendered view; regenerate it instead of hand-editing tasks
|
package/atris/wiki/index.md
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- [[atris/wiki/concepts/intent-capability-composition.md]] — the operating loop; roadmap from gaps
|
|
13
13
|
- [[atris/wiki/concepts/wiki-as-memory-substrate.md]] — what `atris/wiki/` is and isn't
|
|
14
14
|
- [[atris/wiki/concepts/plan-do-review-loop.md]] — core Atris workflow and how local memory fits into it
|
|
15
|
+
- [[atris/wiki/concepts/rebased-pack-co-first-loop.md]] — local-only business workspace first loop and proof guardrails
|
|
15
16
|
- [[atris/wiki/concepts/atris-labs-goals.md]] — atris-labs north star, 2026 Q2 targets, standing constraints
|
|
16
17
|
- [[atris/wiki/concepts/horizon-types.md]] — horizon slug prefix convention; type categories and inference rules
|
|
17
18
|
- [[atris/wiki/concepts/verifiable-reward-loop.md]] — reward, scorecards, and why the repo now acts like an RL-style environment
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
|
|
22
23
|
## Briefs
|
|
23
24
|
|
|
25
|
+
- [[atris/wiki/briefs/rebased-pack-co-starter-brief.md]] — starter brief for the local-only Rebased Pack Co smoke workspace
|
|
24
26
|
- [[atris/wiki/briefs/atris-cli-overview.md]] — summary of CLI, owner/computer model, workspace layers, and why `atris/wiki/` exists
|
|
25
27
|
- [[atris/wiki/briefs/atris-labs-workspace-protocol.md]] — atris-labs workspace protocol: on-load sequence, layout, surfaces, north star
|
|
26
28
|
- [[atris/wiki/briefs/atrisos-generative-ui-product-surface.md]] — historical AtrisOS generative UI / block surface design note
|
package/bin/atris.js
CHANGED
|
@@ -103,7 +103,7 @@ if (!skipUpdateCheck && (!updateCommand || (updateCommand && !['version', 'updat
|
|
|
103
103
|
});
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
let command = process.argv[2];
|
|
107
107
|
const commandArgs = process.argv.slice(3);
|
|
108
108
|
const firstCommandArg = process.argv[3];
|
|
109
109
|
const isBusinessSyncSafetyCommand = command === 'sync'
|
|
@@ -333,6 +333,8 @@ function showHelp() {
|
|
|
333
333
|
console.log(' log - Add ideas to inbox');
|
|
334
334
|
console.log(' now - Show atris/now.md, the current operating truth');
|
|
335
335
|
console.log(' activate - Load Atris context');
|
|
336
|
+
console.log(' radar - Show live agents joined with tasks, missions, and worktrees');
|
|
337
|
+
console.log(' ctop - Show a process-first live agent CPU/memory view');
|
|
336
338
|
console.log(' status - See local work and completions (`atris status <business>` for remote)');
|
|
337
339
|
console.log(' xp - Show Career XP and contribution graph');
|
|
338
340
|
console.log(' analytics - Show recent productivity from journals');
|
|
@@ -764,7 +766,7 @@ if (command === '2' && ['fast', 'pro'].includes(String(firstCommandArg || '').to
|
|
|
764
766
|
}
|
|
765
767
|
|
|
766
768
|
// Check if this is a known command or natural language input
|
|
767
|
-
const knownCommands = ['init', 'log', 'now', 'status', 'analytics', 'visualize', 'brain', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review', 'release',
|
|
769
|
+
const knownCommands = ['init', 'log', 'now', 'radar', 'ctop', 'status', 'analytics', 'visualize', 'brain', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review', 'release',
|
|
768
770
|
'activate', '_activate', 'agent', 'chat', 'console', 'serve', 'login', 'logout', 'whoami', 'switch', 'use', 'accounts', '_resolve', '_profile-email', '_switch-session', 'shell-init', 'update', 'upgrade', 'version', 'help', 'next', 'atris',
|
|
769
771
|
'clean', 'verify', 'search', 'skill', 'member', 'codex-goal', 'app', 'apps', 'learn', 'lesson', 'plugin', 'experiments', 'receipt', 'proof', 'openclaw', 'pull', 'push', 'live', 'align', 'terminal', 'computer', 'diff', 'business', 'sync',
|
|
770
772
|
'ingest', 'query', 'lint', 'loop', 'task', 'mission', 'worktree', 'aeo', 'xp', 'play', 'gm', 'x',
|
|
@@ -800,8 +802,9 @@ const voiceTriggers = {
|
|
|
800
802
|
'start a business': 'business',
|
|
801
803
|
'new business': 'business',
|
|
802
804
|
'show status': 'status',
|
|
803
|
-
'what happened': '
|
|
804
|
-
'whats going on': '
|
|
805
|
+
'what happened': 'radar',
|
|
806
|
+
'whats going on': 'radar',
|
|
807
|
+
'what is going on': 'radar',
|
|
805
808
|
'run tests': 'verify',
|
|
806
809
|
'check health': 'status',
|
|
807
810
|
'deploy': 'business',
|
|
@@ -1180,6 +1183,11 @@ if (command === 'init') {
|
|
|
1180
1183
|
Promise.resolve(require('../commands/worktree').worktreeCommand(process.argv.slice(3)))
|
|
1181
1184
|
.then((code) => process.exit(code || 0))
|
|
1182
1185
|
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
1186
|
+
} else if (command === 'radar' || command === 'ctop') {
|
|
1187
|
+
const radarArgs = command === 'ctop' ? ['--agents', ...process.argv.slice(3)] : process.argv.slice(3);
|
|
1188
|
+
Promise.resolve(require('../commands/radar').radarCommand(radarArgs))
|
|
1189
|
+
.then((code) => process.exit(code || 0))
|
|
1190
|
+
.catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
|
|
1183
1191
|
} else if (command === 'codex-goal') {
|
|
1184
1192
|
Promise.resolve(require('../commands/codex-goal').codexGoalCommand(process.argv.slice(3)))
|
|
1185
1193
|
.then(() => process.exit(process.exitCode || 0))
|
package/commands/brain.js
CHANGED
|
@@ -183,7 +183,7 @@ function countTodoItems(todoText) {
|
|
|
183
183
|
if (!isTitled) continue;
|
|
184
184
|
|
|
185
185
|
titled += 1;
|
|
186
|
-
if (hasRenderedSections && ['Backlog', 'In Progress'
|
|
186
|
+
if (hasRenderedSections && ['Backlog', 'In Progress'].includes(section)) renderedOpen += 1;
|
|
187
187
|
if (hasRenderedSections && section === 'Completed') renderedDone += 1;
|
|
188
188
|
}
|
|
189
189
|
|
|
@@ -195,6 +195,70 @@ function countTodoItems(todoText) {
|
|
|
195
195
|
};
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
+
const EXECUTABLE_TASK_STATUSES = new Set(['open', 'claimed']);
|
|
199
|
+
const COMPLETED_TASK_STATUSES = new Set(['done', 'completed', 'accepted']);
|
|
200
|
+
|
|
201
|
+
function readTaskProjectionTasks(root) {
|
|
202
|
+
const projection = readJson(path.join(root, '.atris', 'state', 'tasks.projection.json'));
|
|
203
|
+
const tasks = Array.isArray(projection?.tasks) ? projection.tasks : null;
|
|
204
|
+
return tasks || null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function isCertifiedReviewTask(task) {
|
|
208
|
+
if (String(task?.status || '').toLowerCase() !== 'review') return false;
|
|
209
|
+
const metadata = task.metadata || {};
|
|
210
|
+
const review = task.review || {};
|
|
211
|
+
const passCount = Number(metadata.agent_review_pass_count || review.agent_review_pass_count || 0);
|
|
212
|
+
return Boolean(metadata.agent_certified || review.agent_certified || passCount >= 2);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function summarizeTaskProjection(root) {
|
|
216
|
+
const tasks = readTaskProjectionTasks(root);
|
|
217
|
+
if (!tasks) return null;
|
|
218
|
+
|
|
219
|
+
const counts = {};
|
|
220
|
+
const certifiedReviewTasks = [];
|
|
221
|
+
for (const task of tasks) {
|
|
222
|
+
const status = String(task?.status || '').toLowerCase();
|
|
223
|
+
counts[status] = (counts[status] || 0) + 1;
|
|
224
|
+
if (isCertifiedReviewTask(task)) {
|
|
225
|
+
certifiedReviewTasks.push({
|
|
226
|
+
ref: task.display_id || task.legacy_ref || task.id,
|
|
227
|
+
title: task.title || 'Untitled task',
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
tasks,
|
|
234
|
+
counts,
|
|
235
|
+
certifiedReviewTasks,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function countTaskProjectionItems(root) {
|
|
240
|
+
const summary = summarizeTaskProjection(root);
|
|
241
|
+
if (!summary) return null;
|
|
242
|
+
|
|
243
|
+
let open = 0;
|
|
244
|
+
let done = 0;
|
|
245
|
+
for (const [status, count] of Object.entries(summary.counts)) {
|
|
246
|
+
if (EXECUTABLE_TASK_STATUSES.has(status)) open += count;
|
|
247
|
+
if (COMPLETED_TASK_STATUSES.has(status)) done += count;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
open,
|
|
252
|
+
checked: done,
|
|
253
|
+
titled: summary.tasks.length,
|
|
254
|
+
done,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function countWorkItems(root, todoText) {
|
|
259
|
+
return countTaskProjectionItems(root) || countTodoItems(todoText);
|
|
260
|
+
}
|
|
261
|
+
|
|
198
262
|
function listMarkdown(root, relDir, limit = 12) {
|
|
199
263
|
const dir = path.join(root, relDir);
|
|
200
264
|
if (!fs.existsSync(dir)) return [];
|
|
@@ -271,7 +335,8 @@ function collectState(root) {
|
|
|
271
335
|
name: business.name || business.slug || firstHeading(status || mapText, path.basename(root)),
|
|
272
336
|
slug: business.slug || path.basename(root),
|
|
273
337
|
business,
|
|
274
|
-
todo:
|
|
338
|
+
todo: countWorkItems(root, todoText),
|
|
339
|
+
taskProjection: summarizeTaskProjection(root),
|
|
275
340
|
hasNow: nowText.length > 0,
|
|
276
341
|
nowHeading: firstHeading(nowText, null),
|
|
277
342
|
hasMap: mapText.length > 0,
|
|
@@ -292,7 +357,7 @@ function collectState(root) {
|
|
|
292
357
|
}
|
|
293
358
|
|
|
294
359
|
function prepareBrainState(root) {
|
|
295
|
-
refreshNowFile(root);
|
|
360
|
+
refreshNowFile(root, { preserveCustom: true });
|
|
296
361
|
return collectState(root);
|
|
297
362
|
}
|
|
298
363
|
|
|
@@ -482,6 +547,12 @@ function memberNextMove(member, state = null) {
|
|
|
482
547
|
const name = member.name || member.slug;
|
|
483
548
|
const context = `${member.startHere}\n${member.goals}`;
|
|
484
549
|
const identity = `${member.slug}\n${member.name}`;
|
|
550
|
+
const certifiedReview = state?.taskProjection?.certifiedReviewTasks?.[0] || null;
|
|
551
|
+
const certifiedReviewMove = certifiedReview
|
|
552
|
+
? `${name}: hand off certified review ${certifiedReview.ref} to the operator: run ` +
|
|
553
|
+
`\`atris task accept ${certifiedReview.ref}\` if approved or ` +
|
|
554
|
+
`\`atris task revise ${certifiedReview.ref} --note "<what must change>"\` if not; do not create new work until this checkpoint is clear.`
|
|
555
|
+
: null;
|
|
485
556
|
if (member.slug === 'justin' || /justin/i.test(member.name || '')) {
|
|
486
557
|
return `${name}: run one customer-moving GTM rep, update the relevant workspace state within 10 minutes, and leave a scorecard.`;
|
|
487
558
|
}
|
|
@@ -496,6 +567,7 @@ function memberNextMove(member, state = null) {
|
|
|
496
567
|
return `${name}: choose or create one bounded mission step, run its verifier, and close it with proof, a scorecard, and the next move.`;
|
|
497
568
|
}
|
|
498
569
|
if (/validator|reviewer/i.test(identity)) {
|
|
570
|
+
if (certifiedReviewMove) return certifiedReviewMove;
|
|
499
571
|
if ((state?.todo?.open || 0) === 0 && (state?.todo?.done || 0) === 0) {
|
|
500
572
|
return `${name}: wait for one concrete artifact or ask Navigator to create a reviewable task with verifier, proof target, and residual-risk checklist.`;
|
|
501
573
|
}
|
|
@@ -503,6 +575,7 @@ function memberNextMove(member, state = null) {
|
|
|
503
575
|
}
|
|
504
576
|
if (/executor|builder/i.test(identity)) {
|
|
505
577
|
if ((state?.todo?.open || 0) === 0) {
|
|
578
|
+
if (certifiedReviewMove) return certifiedReviewMove;
|
|
506
579
|
return `${name}: ask Navigator to create one bounded task with files, verifier, and stop rule before making a patch.`;
|
|
507
580
|
}
|
|
508
581
|
return `${name}: execute the highest-leverage claimed task one scoped step at a time, run the verifier after the patch, and hand off proof for review.`;
|
|
@@ -511,6 +584,7 @@ function memberNextMove(member, state = null) {
|
|
|
511
584
|
return `${name}: turn one messy or unclaimed intent into a MAP-backed plan with ASCII visualization, exact files, verifier, rollback, and a review-ready task.`;
|
|
512
585
|
}
|
|
513
586
|
if (/launcher|closer/i.test(identity)) {
|
|
587
|
+
if (certifiedReviewMove) return certifiedReviewMove;
|
|
514
588
|
if ((state?.todo?.done || 0) === 0) {
|
|
515
589
|
return `${name}: wait for one validated task receipt before closeout, or ask Validator to produce a review decision with proof.`;
|
|
516
590
|
}
|