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 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/empire/atris-cli --verify`
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/empire/atris-cli`
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
@@ -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
- const command = process.argv[2];
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': 'status',
804
- 'whats going on': 'status',
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', 'Blocked'].includes(section)) renderedOpen += 1;
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: countTodoItems(todoText),
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
  }