atris 3.16.0 → 3.16.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.
package/README.md CHANGED
@@ -32,6 +32,7 @@ Then read the workspace's `atris/atris.md` and follow it exactly. `atris.md` is
32
32
  - A strict `plan -> do -> review` loop
33
33
  - Daily logs, task tracking, feature packs, and project memory
34
34
  - Skills, team members, integrations, and cloud sync when you need them
35
+ - A plain-English answer to "what did my AI actually do?" — run `atris recap` (add `--share` for a paste-ready summary backed by receipts)
35
36
 
36
37
  ## Critical Files
37
38
 
package/bin/atris.js CHANGED
@@ -328,6 +328,7 @@ function showHelp() {
328
328
  console.log(' radar - Show live agents joined with tasks, missions, and worktrees');
329
329
  console.log(' ctop - Show a process-first live agent CPU/memory view');
330
330
  console.log(' status - See local work and completions (`atris status <business>` for remote)');
331
+ console.log(' recap - What your AI team did, in plain English (--share for paste-ready)');
331
332
  console.log(' xp - Show Career XP and contribution graph');
332
333
  console.log(' analytics - Show recent productivity from journals');
333
334
  console.log(' search - Search journal history (atris search <keyword>)');
@@ -357,6 +358,13 @@ function showHelp() {
357
358
  console.log(' experiments run <slug> - Execute a pack or record an Endstate receipt');
358
359
  console.log(' experiments benchmark [m] - Run validate/runtime experiment benchmarks');
359
360
  console.log('');
361
+ console.log('Compile loop (learn like AI, run like code):');
362
+ console.log(' compile record <name> - Append an execution record (--input/--output)');
363
+ console.log(' compile build <name> - Compile records into a deterministic run.js');
364
+ console.log(' compile backtest <name> - Replay all records, score accuracy vs gate');
365
+ console.log(' compile promote <name> - Activate (gate: accuracy >= threshold)');
366
+ console.log(' compile exec <name> - Run the compiled process token-free');
367
+ console.log('');
360
368
  console.log('Quick commands:');
361
369
  console.log(' atris - Load context and start (natural language)');
362
370
  console.log(' next - Auto-advance to next step');
@@ -766,9 +774,9 @@ if (command === '2' && ['fast', 'pro'].includes(String(firstCommandArg || '').to
766
774
  const knownCommands = ['init', 'log', 'now', 'radar', 'ctop', 'status', 'analytics', 'visualize', 'brain', 'brainstorm', 'autopilot', 'run', 'plan', 'do', 'review', 'release',
767
775
  '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',
768
776
  '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',
769
- 'ingest', 'query', 'lint', 'loop', 'task', 'mission', 'worktree', 'aeo', 'improve', 'xp', 'play', 'gm', 'x',
777
+ 'ingest', 'query', 'lint', 'loop', 'task', 'mission', 'probe', 'worktree', 'aeo', 'improve', 'xp', 'play', 'gm', 'x', 'recap',
770
778
  'gmail', 'calendar', 'twitter', 'slack', 'imessage', 'integrations', 'setup', 'clean-workspace', 'cw',
771
- 'fork', 'browse', 'publish', 'sleep', 'wake', 'feedback', 'errors', 'wiki', 'code-review', 'cr', 'soul', 'fleet'];
779
+ 'fork', 'browse', 'publish', 'sleep', 'wake', 'feedback', 'errors', 'wiki', 'code-review', 'cr', 'soul', 'fleet', 'compile'];
772
780
 
773
781
  // Check if command is an atris.md spec file - triggers welcome visualization
774
782
  function isSpecFile(cmd) {
@@ -1041,7 +1049,7 @@ async function interactiveEntry(userInput) {
1041
1049
 
1042
1050
  // ASCII Welcome Visualization
1043
1051
  function showWelcomeVisualization() {
1044
- const { getBacklogTasks, getInProgressTasks } = require('../lib/state-detection');
1052
+ const { getTaskCounts } = require('../lib/state-detection');
1045
1053
  const cwd = process.cwd();
1046
1054
  const atrisDir = path.join(cwd, 'atris');
1047
1055
  const projectName = path.basename(cwd);
@@ -1050,6 +1058,8 @@ function showWelcomeVisualization() {
1050
1058
  let filesIndexed = 0;
1051
1059
  let tasksInBacklog = 0;
1052
1060
  let tasksInProgress = 0;
1061
+ let tasksInReview = 0;
1062
+ let tasksCertified = 0;
1053
1063
  let journalEntries = 0;
1054
1064
  let hasMap = false;
1055
1065
  let isInitialized = fs.existsSync(atrisDir);
@@ -1065,15 +1075,15 @@ function showWelcomeVisualization() {
1065
1075
  filesIndexed = fileRefs ? fileRefs.length : 0;
1066
1076
  }
1067
1077
 
1068
- // Check TODO.md
1069
- const todoPath = path.join(atrisDir, 'TODO.md');
1070
- if (fs.existsSync(todoPath)) {
1071
- try {
1072
- tasksInBacklog = getBacklogTasks(atrisDir).length;
1073
- tasksInProgress = getInProgressTasks(atrisDir).length;
1074
- } catch {
1075
- // Silently fail - show 0 tasks if parsing fails
1076
- }
1078
+ // Task lane counts — DB truth first, TODO.md parse as fallback
1079
+ try {
1080
+ const counts = getTaskCounts(atrisDir);
1081
+ tasksInBacklog = counts.backlog;
1082
+ tasksInProgress = counts.active;
1083
+ tasksInReview = counts.review;
1084
+ tasksCertified = counts.reviewCertified;
1085
+ } catch {
1086
+ // Silently fail - show 0 tasks if reading fails
1077
1087
  }
1078
1088
 
1079
1089
  // Count journal entries today
@@ -1122,13 +1132,19 @@ function showWelcomeVisualization() {
1122
1132
  console.log(` │ 📄 Spec: atris.md v${CLI_VERSION.padEnd(18)}│`);
1123
1133
  console.log(` │ 🗺️ Map: ${hasMap ? (filesIndexed + ' files indexed').padEnd(26) : 'not generated yet'.padEnd(26)}│`);
1124
1134
  console.log(` │ 📋 Tasks: ${(tasksInBacklog + ' backlog, ' + tasksInProgress + ' active').padEnd(26)}│`);
1135
+ if (tasksInReview > 0) {
1136
+ const reviewText = tasksCertified > 0
1137
+ ? `${tasksInReview} waiting (${tasksCertified} certified)`
1138
+ : `${tasksInReview} waiting`;
1139
+ console.log(` │ ⏳ Review: ${reviewText.padEnd(26)}│`);
1140
+ }
1125
1141
  console.log(` │ 📝 Journal: ${(journalEntries + ' entries today').padEnd(26)}│`);
1126
1142
  console.log(' │ │');
1127
1143
  console.log(' │ ┌──────────────────────────────────┐ │');
1128
1144
  console.log(' │ │ MAP.md ←──── YOU ARE HERE │ │');
1129
1145
  console.log(' │ │ ↓ │ │');
1130
- const taskText = `${tasksInBacklog} tasks waiting`;
1131
- console.log(` │ │ TODO.md ←── ${taskText.padEnd(17)}│ │`);
1146
+ const taskText = `${tasksInBacklog} task${tasksInBacklog === 1 ? '' : 's'} waiting`;
1147
+ console.log(` │ │ TODO.md ←── ${taskText.padEnd(20)}│ │`);
1132
1148
  console.log(' │ │ ↓ │ │');
1133
1149
  console.log(' │ │ navigator → executor → validator│ │');
1134
1150
  console.log(' │ └──────────────────────────────────┘ │');
@@ -1136,7 +1152,11 @@ function showWelcomeVisualization() {
1136
1152
  console.log(' └──────────────────────────────────────────┘');
1137
1153
  }
1138
1154
  console.log('');
1139
- console.log(` Ready. Run 'atris plan' to start.`);
1155
+ if (tasksCertified > 0) {
1156
+ console.log(` Ready. ${tasksCertified} certified await accept — run 'atris task reviews'.`);
1157
+ } else {
1158
+ console.log(` Ready. Run 'atris plan' to start.`);
1159
+ }
1140
1160
  console.log('');
1141
1161
  }
1142
1162
 
@@ -1165,6 +1185,11 @@ if (command === 'init') {
1165
1185
  Promise.resolve(require('../commands/mission').missionCommand(process.argv.slice(3)))
1166
1186
  .then(() => process.exit(0))
1167
1187
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
1188
+ } else if (command === 'probe') {
1189
+ // Chat-lane probe (TRR-22): one real /atris2/turn over the full tool relay.
1190
+ Promise.resolve(require('../commands/probe').probeCommand(process.argv.slice(3)))
1191
+ .then((code) => process.exit(code || 0))
1192
+ .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
1168
1193
  } else if (command === 'worktree') {
1169
1194
  Promise.resolve(require('../commands/worktree').worktreeCommand(process.argv.slice(3)))
1170
1195
  .then((code) => process.exit(code || 0))
@@ -1234,6 +1259,8 @@ if (command === 'init') {
1234
1259
  process.exit(0);
1235
1260
  }
1236
1261
  require('../commands/now').nowAtris(args);
1262
+ } else if (command === 'recap') {
1263
+ require('../commands/recap').recapAtris(process.argv.slice(3));
1237
1264
  } else if (command === 'activate') {
1238
1265
  const args = process.argv.slice(3);
1239
1266
  if (args.includes('--help') || args.includes('-h') || args[0] === 'help') {
@@ -1746,6 +1773,12 @@ if (command === 'init') {
1746
1773
  const subcommand = process.argv[3];
1747
1774
  const args = process.argv.slice(4);
1748
1775
  require('../commands/experiments').experimentsCommand(subcommand, ...args);
1776
+ } else if (command === 'compile') {
1777
+ const subcommand = process.argv[3];
1778
+ const args = process.argv.slice(4);
1779
+ Promise.resolve(require('../commands/compile').compileCommand(subcommand, ...args))
1780
+ .then(() => process.exit(process.exitCode || 0))
1781
+ .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
1749
1782
  } else if (command === 'receipt' || command === 'proof' || command === 'openclaw') {
1750
1783
  const subcommand = process.argv[3];
1751
1784
  const args = process.argv.slice(4);