atris 3.74.0 → 3.74.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/bin/atris.js CHANGED
@@ -143,7 +143,8 @@ const helpRequested = updateCommand === 'help'
143
143
  const jsonRequested = process.argv.slice(2).includes('--json');
144
144
  const dryRunRequested = updateArgs.includes('--dry-run');
145
145
  const skipUpdateCheck = Boolean(process.env.ATRIS_SKIP_UPDATE_CHECK || process.env.NO_UPDATE_NOTIFIER || helpRequested || jsonRequested);
146
- if (!skipUpdateCheck && (!updateCommand || (updateCommand && !['version', 'update', 'mcp'].includes(updateCommand)))) {
146
+ // recap promises local only: no registry call and no background install.
147
+ if (!skipUpdateCheck && (!updateCommand || (updateCommand && !['version', 'update', 'mcp', 'recap'].includes(updateCommand)))) {
147
148
  updateCheckPromise = checkForUpdates()
148
149
  .then((updateInfo) => {
149
150
  if (updateInfo) {
@@ -545,7 +546,7 @@ function helpCatalog() {
545
546
  { name: 'done', summary: 'land what your coding agent built: check, accept, sign', json: true, interactive_risk: 'low' },
546
547
  { name: 'task', summary: 'local task plane: new, claim, ready, accept', json: true, interactive_risk: 'low' },
547
548
  { name: 'review', summary: 'validate work and capture learnings', json: false, interactive_risk: 'low' },
548
- { name: 'recap', summary: 'spoken recap of what your team did', json: true, interactive_risk: 'low' },
549
+ { name: 'recap', summary: 'what your ai agent and team did today', json: true, interactive_risk: 'low' },
549
550
  { name: 'mission', summary: 'durable goal + owner + verifier + tick', json: true, interactive_risk: 'medium' },
550
551
  { name: 'campaign', summary: 'long goal + judge + budget + seats, made of missions', json: true, interactive_risk: 'low' },
551
552
  { name: 'log', summary: 'append an idea to today inbox (or --repl)', json: true, interactive_risk: 'low' },
@@ -568,7 +569,7 @@ function showHelpAll() {
568
569
  console.log(' atris spaceship Keep working for a few hours');
569
570
  console.log(' atris autopilot Keep working until you stop');
570
571
  console.log(' atris mission the one goal');
571
- console.log(' atris recap what got done');
572
+ console.log(' atris recap what your ai agent did today');
572
573
  console.log(' atris review check the work');
573
574
  console.log(' atris stop stop the live goal');
574
575
  console.log('');
@@ -616,7 +617,7 @@ function showHelpAll() {
616
617
  console.log(' launchpad - Show the next action from local brain, task, mission, and proof state');
617
618
  console.log(' brief - Show the one-glance operator brief');
618
619
  console.log(' status - See local work and completions (`atris status <business>` for remote)');
619
- console.log(' recap - What your AI team did, in spoken lines (--verbose for the old report)');
620
+ console.log(' recap - What your AI agent and team did today, in plain lines (--verbose for the old report)');
620
621
  console.log(' report - Weekly block: landings, journal completions, and Career XP');
621
622
  console.log(' xp - Show Career XP and contribution graph');
622
623
  console.log(' analytics - Show recent productivity from journals');
@@ -1756,7 +1757,9 @@ function showWelcomeVisualization() {
1756
1757
  // Count journal entries today
1757
1758
  const today = new Date();
1758
1759
  const year = today.getFullYear();
1759
- const dateStr = today.toISOString().split('T')[0];
1760
+ // Local calendar day, like the journal writer; toISOString is UTC and
1761
+ // reads tomorrow's empty file every evening west of Greenwich.
1762
+ const dateStr = `${year}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
1760
1763
  const journalPath = path.join(atrisDir, 'logs', String(year), `${dateStr}.md`);
1761
1764
  if (fs.existsSync(journalPath)) {
1762
1765
  const journalContent = fs.readFileSync(journalPath, 'utf8');
@@ -2014,31 +2017,31 @@ if (command === 'guide') {
2014
2017
  process.exit(typeof code === 'number' ? code : 0);
2015
2018
  } else if (command === 'task') {
2016
2019
  // SQLite-backed task plane. ~/.atris/tasks.db, gitignored, per-workspace.
2017
- Promise.resolve(require('../commands/task').run(process.argv.slice(3)))
2020
+ Promise.resolve().then(() => require('../commands/task').run(process.argv.slice(3)))
2018
2021
  .then(() => process.exit(0))
2019
2022
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2020
2023
  } else if (command === 'team') {
2021
- Promise.resolve(require('../commands/team').teamCommand(process.argv.slice(3)))
2024
+ Promise.resolve().then(() => require('../commands/team').teamCommand(process.argv.slice(3)))
2022
2025
  .then((code) => process.exit(code || 0))
2023
2026
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2024
2027
  } else if (command === 'campaign') {
2025
- Promise.resolve(require('../commands/campaign').campaignCommand(process.argv.slice(3)))
2028
+ Promise.resolve().then(() => require('../commands/campaign').campaignCommand(process.argv.slice(3)))
2026
2029
  .then((code) => exitAfterStdoutDrain(code || 0))
2027
2030
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2028
2031
  } else if (command === 'who') {
2029
- Promise.resolve(require('../commands/who').whoCommand(process.argv.slice(3)))
2032
+ Promise.resolve().then(() => require('../commands/who').whoCommand(process.argv.slice(3)))
2030
2033
  .then((code) => process.exit(code || 0))
2031
2034
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2032
2035
  } else if (command === 'wish') {
2033
- Promise.resolve(require('../commands/wish').wishCommand(process.argv.slice(3)))
2036
+ Promise.resolve().then(() => require('../commands/wish').wishCommand(process.argv.slice(3)))
2034
2037
  .then((code) => process.exit(code || 0))
2035
2038
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2036
2039
  } else if (command === 'drill') {
2037
- Promise.resolve(require('../commands/drill').drillCommand(process.argv.slice(3)))
2040
+ Promise.resolve().then(() => require('../commands/drill').drillCommand(process.argv.slice(3)))
2038
2041
  .then((code) => process.exit(code || 0))
2039
2042
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2040
2043
  } else if (command === 'bench') {
2041
- Promise.resolve(require('../commands/bench').benchCommand(process.argv.slice(3)))
2044
+ Promise.resolve().then(() => require('../commands/bench').benchCommand(process.argv.slice(3)))
2042
2045
  .then((code) => process.exit(code || 0))
2043
2046
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(2); });
2044
2047
  } else if (command === 'router') {
@@ -2053,7 +2056,7 @@ if (command === 'guide') {
2053
2056
  if (process.stdout.writableLength === 0) process.exit(code);
2054
2057
  else process.stdout.write('', () => process.exit(code));
2055
2058
  };
2056
- Promise.resolve(require('../commands/decide').decideCommand(process.argv.slice(3)))
2059
+ Promise.resolve().then(() => require('../commands/decide').decideCommand(process.argv.slice(3)))
2057
2060
  .then(() => exitAfterStdoutDrain(process.exitCode || 0))
2058
2061
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); exitAfterStdoutDrain(1); });
2059
2062
  } else if (
@@ -2069,7 +2072,7 @@ if (command === 'guide') {
2069
2072
  check: humanCommands.checkCommand,
2070
2073
  proof: humanCommands.proofCommand,
2071
2074
  };
2072
- Promise.resolve(handlers[command](process.argv.slice(3)))
2075
+ Promise.resolve().then(() => handlers[command](process.argv.slice(3)))
2073
2076
  .then((code) => exitWhenFlushed(Number.isInteger(code) ? code : (process.exitCode || 0)))
2074
2077
  .catch((err) => { console.error(`\nAtris could not finish that request: ${err.message || err}`); exitWhenFlushed(1); });
2075
2078
  } else if (command === 'mission') {
@@ -2081,11 +2084,11 @@ if (command === 'guide') {
2081
2084
  if (process.stdout.writableLength === 0) process.exit(code);
2082
2085
  else process.stdout.write('', () => process.exit(code));
2083
2086
  };
2084
- Promise.resolve(require('../commands/mission').missionCommand(process.argv.slice(3)))
2087
+ Promise.resolve().then(() => require('../commands/mission').missionCommand(process.argv.slice(3)))
2085
2088
  .then(() => exitAfterStdoutDrain(process.exitCode || 0))
2086
2089
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); exitAfterStdoutDrain(1); });
2087
2090
  } else if (command === 'recover') {
2088
- Promise.resolve(require('../commands/recover').recoverCommand(process.argv.slice(3)))
2091
+ Promise.resolve().then(() => require('../commands/recover').recoverCommand(process.argv.slice(3)))
2089
2092
  .then((code) => process.exit(code || 0))
2090
2093
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2091
2094
  } else if (command === 'agents') {
@@ -2094,20 +2097,20 @@ if (command === 'guide') {
2094
2097
  process.exit(code || 0);
2095
2098
  } else if (command === 'pulse') {
2096
2099
  // Pulse: durable overnight self-improvement heartbeat (OS cron) for atris-cli.
2097
- Promise.resolve(require('../commands/pulse').pulseCommand(process.argv.slice(3)))
2100
+ Promise.resolve().then(() => require('../commands/pulse').pulseCommand(process.argv.slice(3)))
2098
2101
  .then((res) => process.exit(res && res.ok === false ? 1 : 0))
2099
2102
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2100
2103
  } else if (command === 'probe') {
2101
2104
  // Chat-lane probe (TRR-22): one real /atris2/turn over the full tool relay.
2102
- Promise.resolve(require('../commands/probe').probeCommand(process.argv.slice(3)))
2105
+ Promise.resolve().then(() => require('../commands/probe').probeCommand(process.argv.slice(3)))
2103
2106
  .then((code) => process.exit(code || 0))
2104
2107
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2105
2108
  } else if (command === 'worktree') {
2106
- Promise.resolve(require('../commands/worktree').worktreeCommand(process.argv.slice(3)))
2109
+ Promise.resolve().then(() => require('../commands/worktree').worktreeCommand(process.argv.slice(3)))
2107
2110
  .then((code) => process.exit(code || 0))
2108
2111
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2109
2112
  } else if (command === 'autoland') {
2110
- Promise.resolve(require('../commands/autoland').autolandCommand(process.argv.slice(3)))
2113
+ Promise.resolve().then(() => require('../commands/autoland').autolandCommand(process.argv.slice(3)))
2111
2114
  .then((code) => process.exit(code || 0))
2112
2115
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2113
2116
  } else if (command === 'land') {
@@ -2122,61 +2125,61 @@ if (command === 'guide') {
2122
2125
  process.exit(2);
2123
2126
  });
2124
2127
  } else if (command === 'caretaker') {
2125
- Promise.resolve(require('../commands/caretaker').caretakerCommand(process.argv.slice(3)))
2128
+ Promise.resolve().then(() => require('../commands/caretaker').caretakerCommand(process.argv.slice(3)))
2126
2129
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2127
2130
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2128
2131
  } else if (command === 'close') {
2129
- Promise.resolve(require('../commands/close').run(process.argv.slice(3)))
2132
+ Promise.resolve().then(() => require('../commands/close').run(process.argv.slice(3)))
2130
2133
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2131
2134
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2132
2135
  } else if (command === 'goal' || command === 'wtf') {
2133
- Promise.resolve(require('../commands/goal').run(process.argv.slice(3)))
2136
+ Promise.resolve().then(() => require('../commands/goal').run(process.argv.slice(3)))
2134
2137
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2135
2138
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2136
2139
  } else if (command === 'founder') {
2137
- Promise.resolve(require('../commands/founder').founderCommand(process.argv.slice(3)))
2140
+ Promise.resolve().then(() => require('../commands/founder').founderCommand(process.argv.slice(3)))
2138
2141
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2139
2142
  .catch((err) => { console.error(`\nerror: ${err.message || err}`); process.exit(1); });
2140
2143
  } else if (command === 'drive') {
2141
2144
  // Drive: one self-driving tick, mission doctor -> auto-fix safe findings -> count disengagements.
2142
- Promise.resolve(require('../commands/drive').driveCommand(process.argv.slice(3)))
2145
+ Promise.resolve().then(() => require('../commands/drive').driveCommand(process.argv.slice(3)))
2143
2146
  .then((code) => process.exit(code || 0))
2144
2147
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2145
2148
  } else if (command === 'rsi') {
2146
2149
  // RSI: read the Dream-RSI attempt ledger (trees, attempts, policy, dreams).
2147
- Promise.resolve(require('../commands/rsi').run(process.argv.slice(3)))
2150
+ Promise.resolve().then(() => require('../commands/rsi').run(process.argv.slice(3)))
2148
2151
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2149
2152
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2150
2153
  } else if (command === 'orb') {
2151
- Promise.resolve(orbCmd(process.argv.slice(3)))
2154
+ Promise.resolve().then(() => orbCmd(process.argv.slice(3)))
2152
2155
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2153
2156
  .catch((err) => { console.error(`\nError: ${err.message || err}`); process.exit(1); });
2154
2157
  } else if (command === 'radar' || command === 'ctop') {
2155
2158
  const radarArgs = command === 'ctop' ? ['--agents', ...process.argv.slice(3)] : process.argv.slice(3);
2156
- Promise.resolve(require('../commands/radar').radarCommand(radarArgs))
2159
+ Promise.resolve().then(() => require('../commands/radar').radarCommand(radarArgs))
2157
2160
  .then((code) => process.exit(code || 0))
2158
2161
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2159
2162
  } else if (command === 'stream') {
2160
- Promise.resolve(require('../commands/stream').streamCommand(process.argv.slice(3)))
2163
+ Promise.resolve().then(() => require('../commands/stream').streamCommand(process.argv.slice(3)))
2161
2164
  .then((code) => process.exit(code || 0))
2162
2165
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2163
2166
  } else if (command === 'truth') {
2164
2167
  // Truth: one table rolling up mission state, tasks, feature proof receipts, and loop heartbeats.
2165
- Promise.resolve(require('../commands/truth').truthCommand(process.argv.slice(3)))
2168
+ Promise.resolve().then(() => require('../commands/truth').truthCommand(process.argv.slice(3)))
2166
2169
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2167
2170
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2168
2171
  } else if (command === 'codex-goal') {
2169
- Promise.resolve(require('../commands/codex-goal').codexGoalCommand(process.argv.slice(3)))
2172
+ Promise.resolve().then(() => require('../commands/codex-goal').codexGoalCommand(process.argv.slice(3)))
2170
2173
  .then(() => process.exit(process.exitCode || 0))
2171
2174
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2172
2175
  } else if (command === 'aeo') {
2173
2176
  // AEO: AI Engine Optimization, credit-metered citation drafting against the customer workspace.
2174
- Promise.resolve(require('../commands/aeo').run(process.argv.slice(3)))
2177
+ Promise.resolve().then(() => require('../commands/aeo').run(process.argv.slice(3)))
2175
2178
  .then(() => process.exit(0))
2176
2179
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2177
2180
  } else if (command === 'design') {
2178
2181
  // Design: extract a site's design system, check brand adherence, search brands.
2179
- Promise.resolve(require('../commands/design').run(process.argv.slice(3)))
2182
+ Promise.resolve().then(() => require('../commands/design').run(process.argv.slice(3)))
2180
2183
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2181
2184
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2182
2185
  } else if (command === 'mcp') {
@@ -2192,12 +2195,12 @@ if (command === 'guide') {
2192
2195
  }
2193
2196
  } else if (command === 'improve') {
2194
2197
  // Improve: one paid RL tick via POST /api/improve (deducts credits), local autopilot fallback.
2195
- Promise.resolve(require('../commands/improve').run(process.argv.slice(3)))
2198
+ Promise.resolve().then(() => require('../commands/improve').run(process.argv.slice(3)))
2196
2199
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2197
2200
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2198
2201
  } else if (command === 'study') {
2199
2202
  // Study: on-demand learning feed ingest + local server + browser open.
2200
- Promise.resolve(require('../commands/study').run(process.argv.slice(3)))
2203
+ Promise.resolve().then(() => require('../commands/study').run(process.argv.slice(3)))
2201
2204
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2202
2205
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2203
2206
  } else if (command === 'rainmaker') {
@@ -2211,16 +2214,16 @@ if (command === 'guide') {
2211
2214
  {
2212
2215
  const gate = requireAccountBound(process.argv.slice(3));
2213
2216
  if (!gate.ok) process.exit(refuseAccountGlobal());
2214
- Promise.resolve(require('../commands/avail').availCommand(gate.args))
2217
+ Promise.resolve().then(() => require('../commands/avail').availCommand(gate.args))
2215
2218
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2216
2219
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2217
2220
  }
2218
2221
  } else if (command === 'scoreboard') {
2219
- Promise.resolve(require('../commands/scoreboard').scoreboardCommand(process.argv.slice(3)))
2222
+ Promise.resolve().then(() => require('../commands/scoreboard').scoreboardCommand(process.argv.slice(3)))
2220
2223
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2221
2224
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2222
2225
  } else if (command === 'meet') {
2223
- Promise.resolve(require('../commands/meet').meetCommand(process.argv.slice(3)))
2226
+ Promise.resolve().then(() => require('../commands/meet').meetCommand(process.argv.slice(3)))
2224
2227
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2225
2228
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2226
2229
  } else if (command === 'brain') {
@@ -2333,14 +2336,14 @@ if (command === 'guide') {
2333
2336
  process.exit(result.ok ? 0 : 1);
2334
2337
  }
2335
2338
  if (isBusinessSync) {
2336
- Promise.resolve(require('../commands/business-sync').businessSync(process.argv.slice(3)))
2339
+ Promise.resolve().then(() => require('../commands/business-sync').businessSync(process.argv.slice(3)))
2337
2340
  .then(() => process.exit(0))
2338
2341
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2339
2342
  } else if (process.argv.includes('--all')) {
2340
2343
  const dryRun = process.argv.includes('--dry-run');
2341
2344
  const yes = process.argv.includes('--yes') || process.argv.includes('-y');
2342
2345
  const force = process.argv.includes('--force') || yes;
2343
- Promise.resolve(syncAllCmd({ dryRun, force, yes }))
2346
+ Promise.resolve().then(() => syncAllCmd({ dryRun, force, yes }))
2344
2347
  .then(() => process.exit(0))
2345
2348
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
2346
2349
  } else {
@@ -2467,47 +2470,47 @@ if (command === 'guide') {
2467
2470
  }
2468
2471
  require('../commands/auth').accountsCmd(args);
2469
2472
  } else if (command === 'balance') {
2470
- Promise.resolve(require('../commands/balance').balanceCommand(process.argv.slice(3)))
2473
+ Promise.resolve().then(() => require('../commands/balance').balanceCommand(process.argv.slice(3)))
2471
2474
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2472
2475
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2473
2476
  } else if (command === 'usage') {
2474
- Promise.resolve(require('../commands/usage').usageCommand(process.argv.slice(3)))
2477
+ Promise.resolve().then(() => require('../commands/usage').usageCommand(process.argv.slice(3)))
2475
2478
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2476
2479
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2477
2480
  } else if (command === 'agent-client') {
2478
2481
  // Owner side of agent self-login: create, list, revoke, rotate agent clients.
2479
- Promise.resolve(require('../commands/agent-client').agentClientCommand(process.argv.slice(3)))
2482
+ Promise.resolve().then(() => require('../commands/agent-client').agentClientCommand(process.argv.slice(3)))
2480
2483
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2481
2484
  .catch((err) => { console.error(require('../utils/agent-client').scrub(err && err.message, [])); process.exit(1); });
2482
2485
  } else if (command === 'api-key') {
2483
- Promise.resolve(require('../commands/api-key').apiKeyCommand(process.argv.slice(3)))
2486
+ Promise.resolve().then(() => require('../commands/api-key').apiKeyCommand(process.argv.slice(3)))
2484
2487
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2485
2488
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2486
2489
  } else if (command === 'topup') {
2487
- Promise.resolve(require('../commands/topup').topupCommand(process.argv.slice(3)))
2490
+ Promise.resolve().then(() => require('../commands/topup').topupCommand(process.argv.slice(3)))
2488
2491
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2489
2492
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2490
2493
  } else if (command === 'buy') {
2491
2494
  // Buy: quote, then hand the person the approval step. Never charges.
2492
- Promise.resolve(require('../commands/buy').buyCommand(process.argv.slice(3)))
2495
+ Promise.resolve().then(() => require('../commands/buy').buyCommand(process.argv.slice(3)))
2493
2496
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2494
2497
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2495
2498
  } else if (command === 'hire') {
2496
2499
  // One-call hire: member + inbox + allowance + overnight loop (POST /business/{id}/hire).
2497
- Promise.resolve(require('../commands/hire').hireCommand(process.argv.slice(3)))
2500
+ Promise.resolve().then(() => require('../commands/hire').hireCommand(process.argv.slice(3)))
2498
2501
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2499
2502
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2500
2503
  } else if (command === 'hires') {
2501
- Promise.resolve(require('../commands/hire').hiresCommand(process.argv.slice(3)))
2504
+ Promise.resolve().then(() => require('../commands/hire').hiresCommand(process.argv.slice(3)))
2502
2505
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2503
2506
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2504
2507
  } else if (command === 'mail') {
2505
2508
  // Agent inboxes (@atrismail.com), not Gmail. Send asks first unless --yes.
2506
- Promise.resolve(require('../commands/mail').mailCommand(process.argv.slice(3)))
2509
+ Promise.resolve().then(() => require('../commands/mail').mailCommand(process.argv.slice(3)))
2507
2510
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2508
2511
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2509
2512
  } else if (command === 'transactions') {
2510
- Promise.resolve(require('../commands/transactions').transactionsCommand(process.argv.slice(3)))
2513
+ Promise.resolve().then(() => require('../commands/transactions').transactionsCommand(process.argv.slice(3)))
2511
2514
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2512
2515
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ')); process.exit(1); });
2513
2516
  } else if (command === '_resolve') {
@@ -2765,7 +2768,7 @@ if (command === 'guide') {
2765
2768
  process.exit(1);
2766
2769
  });
2767
2770
  } else {
2768
- Promise.resolve(require('../commands/autopilot-front').autopilotFront(args))
2771
+ Promise.resolve().then(() => require('../commands/autopilot-front').autopilotFront(args))
2769
2772
  .then((code) => process.exit(code || 0))
2770
2773
  .catch((error) => {
2771
2774
  console.error(`✗ Autopilot failed: ${error.message || error}`);
@@ -2780,14 +2783,14 @@ if (command === 'guide') {
2780
2783
  process.exit(1);
2781
2784
  });
2782
2785
  } else if (command === 'next') {
2783
- Promise.resolve(require('../commands/next').nextCommand(process.argv.slice(3)))
2786
+ Promise.resolve().then(() => require('../commands/next').nextCommand(process.argv.slice(3)))
2784
2787
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2785
2788
  .catch((error) => {
2786
2789
  console.error(`✗ Error: ${error.message || error}`);
2787
2790
  process.exit(1);
2788
2791
  });
2789
2792
  } else if (command === 'dream') {
2790
- Promise.resolve(require('../commands/dream').dreamCommand(process.argv.slice(3)))
2793
+ Promise.resolve().then(() => require('../commands/dream').dreamCommand(process.argv.slice(3)))
2791
2794
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
2792
2795
  .catch((error) => {
2793
2796
  console.log('No dreams tonight: could not finish dream');
@@ -2891,17 +2894,17 @@ if (command === 'guide') {
2891
2894
  const json = process.argv.includes('--json');
2892
2895
  require('../commands/clean').cleanAtris({ dryRun, json });
2893
2896
  } else if (command === 'harvest') {
2894
- Promise.resolve(require('../commands/harvest').harvestCommand(process.argv.slice(3)))
2897
+ Promise.resolve().then(() => require('../commands/harvest').harvestCommand(process.argv.slice(3)))
2895
2898
  .catch((err) => {
2896
2899
  console.error(err.message || err);
2897
2900
  process.exit(1);
2898
2901
  });
2899
2902
  } else if (command === 'doctor') {
2900
- Promise.resolve(require('../commands/doctor').doctorCommand(process.argv.slice(3)))
2903
+ Promise.resolve().then(() => require('../commands/doctor').doctorCommand(process.argv.slice(3)))
2901
2904
  .then((code) => { process.exitCode = typeof code === 'number' ? code : 0; })
2902
2905
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exitCode = 1; });
2903
2906
  } else if (command === 'doc-health') {
2904
- Promise.resolve(require('../commands/doc-health').docHealthCommand(process.argv.slice(3)))
2907
+ Promise.resolve().then(() => require('../commands/doc-health').docHealthCommand(process.argv.slice(3)))
2905
2908
  .then((code) => { process.exitCode = typeof code === 'number' ? code : 0; })
2906
2909
  .catch((err) => { console.error(err.message || err); process.exitCode = 1; });
2907
2910
  } else if (command === 'verify') {
@@ -2986,7 +2989,7 @@ if (command === 'guide') {
2986
2989
  .then((status) => process.exit(status === 1 ? 1 : 0))
2987
2990
  .catch((err) => { console.error(`✗ Error: ${err.message || err}`); process.exit(1); });
2988
2991
  } else if (command === 'ci') {
2989
- Promise.resolve(require('../commands/ci').ciCommand(process.argv.slice(3)))
2992
+ Promise.resolve().then(() => require('../commands/ci').ciCommand(process.argv.slice(3)))
2990
2993
  .then((status) => process.exit(status || 0))
2991
2994
  .catch((err) => { console.error(String(err.message || err).replace(/\s+/g, ' ').toLowerCase()); process.exit(1); });
2992
2995
  } else if (command === 'github') {
@@ -3093,7 +3096,7 @@ if (command === 'guide') {
3093
3096
  // path so `atris apps --json` stays machine-readable for agents.
3094
3097
  const subcommand = process.argv[3];
3095
3098
  const args = process.argv.slice(4);
3096
- Promise.resolve(require('../commands/apps').appsCommand(subcommand, ...args))
3099
+ Promise.resolve().then(() => require('../commands/apps').appsCommand(subcommand, ...args))
3097
3100
  .then(() => process.exit(0))
3098
3101
  .catch((err) => { console.error(`✗ Error: ${err.message || err}`); process.exit(1); });
3099
3102
  } else if (command === 'learn') {
@@ -3105,7 +3108,7 @@ if (command === 'guide') {
3105
3108
  const args = process.argv.slice(4);
3106
3109
  require('../commands/lesson')(subcommand, ...args);
3107
3110
  } else if (command === 'taste') {
3108
- Promise.resolve(require('../commands/taste').tasteCommand(process.argv.slice(3)))
3111
+ Promise.resolve().then(() => require('../commands/taste').tasteCommand(process.argv.slice(3)))
3109
3112
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3110
3113
  .catch((err) => { console.error(`taste could not continue: ${err.message || err}.`); process.exit(1); });
3111
3114
  } else if (command === 'teach') {
@@ -3121,7 +3124,7 @@ if (command === 'guide') {
3121
3124
  } else if (command === 'member') {
3122
3125
  const subcommand = process.argv[3];
3123
3126
  const args = process.argv.slice(4);
3124
- Promise.resolve(require('../commands/member').memberCommand(subcommand, ...args))
3127
+ Promise.resolve().then(() => require('../commands/member').memberCommand(subcommand, ...args))
3125
3128
  .then(() => process.exit(process.exitCode || 0))
3126
3129
  .catch((err) => { console.error(`✗ Error: ${err.message || err}`); process.exit(1); });
3127
3130
  } else if (command === 'app') {
@@ -3254,7 +3257,7 @@ if (command === 'guide') {
3254
3257
  showLoopHelp();
3255
3258
  process.exit(0);
3256
3259
  }
3257
- Promise.resolve(require('../commands/loop-front').loopFront(args))
3260
+ Promise.resolve().then(() => require('../commands/loop-front').loopFront(args))
3258
3261
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3259
3262
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3260
3263
  } else if (command === 'clean-workspace' || command === 'cw') {
@@ -3273,7 +3276,7 @@ if (command === 'guide') {
3273
3276
  } else if (command === 'compile') {
3274
3277
  const subcommand = process.argv[3];
3275
3278
  const args = process.argv.slice(4);
3276
- Promise.resolve(require('../commands/compile').compileCommand(subcommand, ...args))
3279
+ Promise.resolve().then(() => require('../commands/compile').compileCommand(subcommand, ...args))
3277
3280
  .then(() => process.exit(process.exitCode || 0))
3278
3281
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3279
3282
  } else if (command === 'engine' || command === 'engines') {
@@ -3283,12 +3286,12 @@ if (command === 'guide') {
3283
3286
  // return value may be a promise or a plain number; Promise.resolve handles
3284
3287
  // both (mirrors the `compile` command dispatch just above).
3285
3288
  const engineArgs = command === 'engines' && process.argv.length <= 3 ? [] : process.argv.slice(3);
3286
- Promise.resolve(require('../commands/engine').engineCommand(engineArgs))
3289
+ Promise.resolve().then(() => require('../commands/engine').engineCommand(engineArgs))
3287
3290
  .then((code) => exitAfterStdoutDrain(typeof code === 'number' ? code : 0))
3288
3291
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); exitAfterStdoutDrain(1); });
3289
3292
  } else if (command === 'link') {
3290
3293
  // Link: ask the roster's engine what two things could become together.
3291
- Promise.resolve(require('../commands/link').linkCommand(process.argv.slice(3)))
3294
+ Promise.resolve().then(() => require('../commands/link').linkCommand(process.argv.slice(3)))
3292
3295
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3293
3296
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3294
3297
  } else if (command === 'playbook') {
@@ -3302,64 +3305,64 @@ if (command === 'guide') {
3302
3305
  catch (err) { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); }
3303
3306
  } else if (command === 'slop') {
3304
3307
  // Slop: deterministic frontend-slop detector (no LLM). Exit 1 = slop found, for CI + the autopilot gate.
3305
- Promise.resolve(require('../commands/slop').slopCommand(process.argv.slice(3)))
3308
+ Promise.resolve().then(() => require('../commands/slop').slopCommand(process.argv.slice(3)))
3306
3309
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3307
3310
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3308
3311
  } else if (command === 'voice') {
3309
- Promise.resolve(require('../commands/voice').voiceCommand(process.argv.slice(3)))
3312
+ Promise.resolve().then(() => require('../commands/voice').voiceCommand(process.argv.slice(3)))
3310
3313
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3311
3314
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3312
3315
  } else if (command === 'write') {
3313
3316
  // Write: guided writing sessions, human types every word, atris structures + reviews (plan-do-review for prose).
3314
- Promise.resolve(require('../commands/write').writeCommand(process.argv.slice(3)))
3317
+ Promise.resolve().then(() => require('../commands/write').writeCommand(process.argv.slice(3)))
3315
3318
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3316
3319
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3317
3320
  } else if (command === 'strings') {
3318
3321
  // Strings: content design system from live code (no LLM). Extracts UI strings, flags variants,
3319
3322
  // enforces preferred terms at the gate. Exit 1 = variants/banned terms found, for CI + the gate.
3320
- Promise.resolve(require('../commands/strings').stringsCommand(process.argv.slice(3)))
3323
+ Promise.resolve().then(() => require('../commands/strings').stringsCommand(process.argv.slice(3)))
3321
3324
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3322
3325
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3323
3326
  } else if (command === 'security-review' || command === 'secure') {
3324
3327
  // Security review: deterministic secrets/PII/code-risk scan (no LLM). Exit 1 = HIGH finding,
3325
3328
  // for the autopilot/mission/CI gate + a SOC 2 evidence artifact via --json.
3326
- Promise.resolve(require('../commands/security-review').securityReviewCommand(process.argv.slice(3)))
3329
+ Promise.resolve().then(() => require('../commands/security-review').securityReviewCommand(process.argv.slice(3)))
3327
3330
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3328
3331
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3329
3332
  } else if (command === 'signup') {
3330
3333
  // Signup: one-call seedless agent signup → writes the active profile (install→signup→play seam).
3331
- Promise.resolve(require('../commands/signup').signupCommand(process.argv.slice(3)))
3334
+ Promise.resolve().then(() => require('../commands/signup').signupCommand(process.argv.slice(3)))
3332
3335
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3333
3336
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3334
3337
  } else if (command === 'moves') {
3335
3338
  // Moves: your 3 next moves, approve one into the loop, kill, or skip.
3336
- Promise.resolve(require('../commands/moves').movesCommand(process.argv.slice(3)))
3339
+ Promise.resolve().then(() => require('../commands/moves').movesCommand(process.argv.slice(3)))
3337
3340
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3338
3341
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3339
3342
  } else if (command === 'unknowns') {
3340
3343
  // Unknowns: blindspot pass from local territory context into the SQLite ledger.
3341
- Promise.resolve(require('../commands/unknowns').unknownsCommand(process.argv.slice(3)))
3344
+ Promise.resolve().then(() => require('../commands/unknowns').unknownsCommand(process.argv.slice(3)))
3342
3345
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3343
3346
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3344
3347
  } else if (command === 'feed') {
3345
3348
  // Feed: read and post the business group feed, receipts and state changes only.
3346
3349
  // Sets exitCode instead of process.exit() so large --json output flushes fully.
3347
- Promise.resolve(require('../commands/feed').feedCommand(process.argv.slice(3)))
3350
+ Promise.resolve().then(() => require('../commands/feed').feedCommand(process.argv.slice(3)))
3348
3351
  .then((code) => { process.exitCode = typeof code === 'number' ? code : 0; })
3349
3352
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exitCode = 1; });
3350
3353
  } else if (command === 'clarity') {
3351
3354
  // Clarity: interview yourself once; agents read how you work so you stop repeating it.
3352
- Promise.resolve(require('../commands/clarity').clarityCommand(process.argv.slice(3)))
3355
+ Promise.resolve().then(() => require('../commands/clarity').clarityCommand(process.argv.slice(3)))
3353
3356
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3354
3357
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3355
3358
  } else if (command === 'interview') {
3356
3359
  // Interview: the interlinked 1-on-1, live interview that extracts judgment into a member file.
3357
- Promise.resolve(require('../commands/interview').interviewCommand(process.argv.slice(3)))
3360
+ Promise.resolve().then(() => require('../commands/interview').interviewCommand(process.argv.slice(3)))
3358
3361
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3359
3362
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3360
3363
  } else if (command === 'deck') {
3361
3364
  // Deck: premium Google Slides from a plain content spec, via the Atris deck engine (anti-slop design system).
3362
- Promise.resolve(require('../commands/deck').run(process.argv.slice(3)))
3365
+ Promise.resolve().then(() => require('../commands/deck').run(process.argv.slice(3)))
3363
3366
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3364
3367
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3365
3368
  } else if (command === 'site') {
@@ -3371,32 +3374,32 @@ if (command === 'guide') {
3371
3374
  && !raw.includes('--dry-run');
3372
3375
  const gate = deployWrite ? requireAccountBound(raw) : { ok: true, args: raw };
3373
3376
  if (!gate.ok) process.exit(refuseAccountGlobal());
3374
- Promise.resolve(require('../commands/site').run(gate.args))
3377
+ Promise.resolve().then(() => require('../commands/site').run(gate.args))
3375
3378
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3376
3379
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3377
3380
  }
3378
3381
  } else if (command === 'theme') {
3379
3382
  // Theme: brand themes (.atris/theme.json) for the whole design system (deck/html/site).
3380
- Promise.resolve(require('../commands/theme').run(process.argv.slice(3)))
3383
+ Promise.resolve().then(() => require('../commands/theme').run(process.argv.slice(3)))
3381
3384
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3382
3385
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3383
3386
  } else if (command === 'card') {
3384
3387
  // Card: one line of text into an on-brand image (uses your theme + the design system).
3385
- Promise.resolve(require('../commands/card').run(process.argv.slice(3)))
3388
+ Promise.resolve().then(() => require('../commands/card').run(process.argv.slice(3)))
3386
3389
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3387
3390
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3388
3391
  } else if (command === 'brief') {
3389
3392
  // Brief: one-glance operator surface for landings, waits, and next moves.
3390
- Promise.resolve(require('../commands/brief').run(process.argv.slice(3)))
3393
+ Promise.resolve().then(() => require('../commands/brief').run(process.argv.slice(3)))
3391
3394
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3392
3395
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3393
3396
  } else if (command === 'pack') {
3394
- Promise.resolve(require('../commands/pack').run(process.argv.slice(3)))
3397
+ Promise.resolve().then(() => require('../commands/pack').run(process.argv.slice(3)))
3395
3398
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3396
3399
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3397
3400
  } else if (command === 'reel') {
3398
3401
  // Reel: one line of text into a short on-brand video (an animated card; frames via Chrome + ffmpeg).
3399
- Promise.resolve(require('../commands/reel').run(process.argv.slice(3)))
3402
+ Promise.resolve().then(() => require('../commands/reel').run(process.argv.slice(3)))
3400
3403
  .then((code) => process.exit(typeof code === 'number' ? code : 0))
3401
3404
  .catch((err) => { console.error(`\n✗ Error: ${err.message || err}`); process.exit(1); });
3402
3405
  } else if (command === 'tree') {
package/commands/aeo.js CHANGED
@@ -243,7 +243,7 @@ async function aeoInit(args) {
243
243
  if (!biz.workspaceId) { console.error(`Business "${slug}" has no workspace.`); process.exit(1); }
244
244
 
245
245
  const awake = await ensureAwake(creds.token, biz.businessId);
246
- if (!awake) { console.error(' EC2 computer did not become ready in time.'); process.exit(1); }
246
+ if (!awake) { console.error(` The cloud computer for "${slug}" did not wake up in time. Wait a minute, then run the same command again.`); process.exit(1); }
247
247
 
248
248
  const result = await apiRequestJson(
249
249
  `/business/${biz.businessId}/workspaces/${biz.workspaceId}/aeo/init`,
@@ -289,7 +289,7 @@ async function aeoDraft(args) {
289
289
  if (!biz.workspaceId) { console.error(`Business "${slug}" has no workspace.`); process.exit(1); }
290
290
 
291
291
  const awake = await ensureAwake(creds.token, biz.businessId);
292
- if (!awake) { console.error(' EC2 computer did not become ready in time.'); process.exit(1); }
292
+ if (!awake) { console.error(` The cloud computer for "${slug}" did not wake up in time. Wait a minute, then run the same command again.`); process.exit(1); }
293
293
 
294
294
  const body = { topic };
295
295
  if (opts.slug) body.slug = opts.slug;