atris 3.52.0 → 3.55.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.
Files changed (131) hide show
  1. package/FOR_AGENTS.md +7 -0
  2. package/README.md +1 -1
  3. package/atris/policies/ANTISLOP.md +2 -1
  4. package/atris/skills/copy-editor/SKILL.md +2 -1
  5. package/atris/skills/design/SKILL.md +1 -1
  6. package/atris/skills/engines/SKILL.md +8 -7
  7. package/atris/skills/x-search/SKILL.md +24 -22
  8. package/atris/skills/youtube/SKILL.md +89 -40
  9. package/atris/team/_template/SOUL.md +40 -0
  10. package/atris/team/validator/MEMBER.md +1 -2
  11. package/ax +592 -91
  12. package/bin/atris +21 -0
  13. package/bin/atris.js +580 -378
  14. package/commands/api-key.js +170 -0
  15. package/commands/auth.js +453 -43
  16. package/commands/autoland.js +3 -1
  17. package/commands/autopilot-front.js +58 -11
  18. package/commands/avail.js +5 -4
  19. package/commands/balance.js +55 -0
  20. package/commands/bench.js +29 -1
  21. package/commands/brain.js +63 -12
  22. package/commands/brainstorm.js +18 -0
  23. package/commands/business.js +149 -1
  24. package/commands/chat-scan.js +17 -4
  25. package/commands/close.js +5 -1
  26. package/commands/computer.js +2 -2
  27. package/commands/doctor.js +174 -0
  28. package/commands/dream.js +7 -0
  29. package/commands/drill.js +34 -2
  30. package/commands/engine.js +47 -35
  31. package/commands/errors.js +58 -8
  32. package/commands/experiments.js +14 -0
  33. package/commands/feedback.js +61 -2
  34. package/commands/fleet-report.js +27 -7
  35. package/commands/fleet.js +98 -11
  36. package/commands/founder.js +60 -21
  37. package/commands/human-missions.js +79 -4
  38. package/commands/improve.js +54 -4
  39. package/commands/init.js +68 -92
  40. package/commands/install.js +40 -0
  41. package/commands/integrations.js +399 -30
  42. package/commands/interview.js +8 -0
  43. package/commands/land.js +48 -17
  44. package/commands/learn.js +29 -4
  45. package/commands/log.js +51 -0
  46. package/commands/member.js +68 -10
  47. package/commands/mission.js +339 -74
  48. package/commands/now.js +25 -6
  49. package/commands/orb.js +97 -2
  50. package/commands/pack.js +83 -9
  51. package/commands/playbook.js +381 -0
  52. package/commands/plugin.js +16 -0
  53. package/commands/radar.js +96 -40
  54. package/commands/recap.js +128 -21
  55. package/commands/release.js +102 -2
  56. package/commands/review.js +5 -10
  57. package/commands/revisions.js +55 -0
  58. package/commands/run-front.js +12 -4
  59. package/commands/scout.js +12 -1
  60. package/commands/search.js +123 -28
  61. package/commands/sign.js +2 -2
  62. package/commands/signup.js +12 -3
  63. package/commands/site-deploy.js +17 -4
  64. package/commands/site.js +2 -2
  65. package/commands/skill-eval.js +289 -0
  66. package/commands/skill.js +56 -6
  67. package/commands/social.js +603 -0
  68. package/commands/spaceship.js +69 -6
  69. package/commands/stream.js +8 -1
  70. package/commands/study.js +32 -19
  71. package/commands/sync.js +28 -22
  72. package/commands/task.js +418 -60
  73. package/commands/teach.js +72 -63
  74. package/commands/terminal.js +25 -9
  75. package/commands/topup.js +88 -0
  76. package/commands/truth.js +52 -6
  77. package/commands/usage.js +91 -0
  78. package/commands/verify.js +3 -2
  79. package/commands/version.js +3 -1
  80. package/commands/voice.js +5 -1
  81. package/commands/who.js +69 -11
  82. package/commands/wiki.js +7 -4
  83. package/commands/wish.js +76 -5
  84. package/commands/workflow.js +327 -145
  85. package/commands/worktree.js +1 -0
  86. package/commands/write.js +5 -0
  87. package/commands/x-search.js +340 -0
  88. package/commands/xp.js +5 -1
  89. package/commands/youtube.js +551 -33
  90. package/lib/account-bound.js +47 -0
  91. package/lib/auto-accept-certified.js +10 -2
  92. package/lib/auto-lessons.js +186 -0
  93. package/lib/autoland.js +4 -2
  94. package/lib/chat-log-scan.js +7 -4
  95. package/lib/cli-json.js +77 -0
  96. package/lib/cli-scope.js +26 -0
  97. package/lib/codex-flight.js +1 -0
  98. package/lib/conductor-artifacts.js +1 -1
  99. package/lib/context-gatherer.js +11 -0
  100. package/lib/developer-api.js +116 -0
  101. package/lib/engine-ask.js +11 -3
  102. package/lib/engine-registry.js +32 -7
  103. package/lib/feedback-triage.js +274 -0
  104. package/lib/first-minute.js +398 -0
  105. package/lib/fleet.js +115 -34
  106. package/lib/functional-owner.js +22 -0
  107. package/lib/known-commands.js +31 -5
  108. package/lib/member-scaffold.js +197 -0
  109. package/lib/mission-ledger-compact.js +127 -0
  110. package/lib/mission-root.js +4 -2
  111. package/lib/mission-runtime-loop.js +30 -2
  112. package/lib/next-moves.js +34 -34
  113. package/lib/noninteractive.js +88 -0
  114. package/lib/permission-grants.js +10 -1
  115. package/lib/policy-lessons.js +4 -1
  116. package/lib/revision-metric.js +279 -0
  117. package/lib/runner-command.js +5 -4
  118. package/lib/scratch-root.js +48 -0
  119. package/lib/skill-eval-gate.js +249 -0
  120. package/lib/task-db.js +22 -2
  121. package/lib/task-proof.js +75 -9
  122. package/lib/task-receipt.js +5 -1
  123. package/lib/verifier-quality.js +69 -0
  124. package/lib/wish-audit.js +2 -2
  125. package/lib/wish-delegate.js +10 -1
  126. package/lib/workspace-scaffold.js +270 -0
  127. package/package.json +4 -2
  128. package/scripts/det/checklist-score.js +191 -0
  129. package/scripts/det/ytsearch +31 -0
  130. package/scripts/outbound-artifact-gate.js +227 -0
  131. package/utils/update-check.js +15 -0
package/commands/wiki.js CHANGED
@@ -158,7 +158,8 @@ async function runChat(business, prompt, token) {
158
158
  }
159
159
  }
160
160
 
161
- function printLocalPrompt(title, prompt, wikiRoot, details = []) {
161
+ function printLocalPrompt(title, prompt, wikiRoot, details = [], modeLabel = 'PROMPT ONLY') {
162
+ console.log(modeLabel);
162
163
  console.log('');
163
164
  console.log(title);
164
165
  console.log(`Target: ${wikiRoot}`);
@@ -185,16 +186,17 @@ function printWikiHelp(scope = null) {
185
186
  console.log('Usage: atris wiki ingest [--private|--cloud] [business] <path>');
186
187
  console.log('');
187
188
  console.log('Stage source files into the local wiki context pack.');
189
+ console.log('This command stages files then prints a coding-agent prompt (ACTION TAKEN + PROMPT).');
188
190
  } else if (normalized === 'query') {
189
191
  console.log('Usage: atris query "question"');
190
192
  console.log('Usage: atris wiki query [--private|--cloud] [business] "question"');
191
193
  console.log('');
192
- console.log('Build a local or cloud wiki query prompt.');
194
+ console.log('Build a local or cloud wiki query prompt (PROMPT ONLY).');
193
195
  } else if (normalized === 'lint') {
194
196
  console.log('Usage: atris lint');
195
197
  console.log('Usage: atris wiki lint [--private|--cloud] [business]');
196
198
  console.log('');
197
- console.log('Build a local or cloud wiki lint prompt.');
199
+ console.log('Build a local or cloud wiki lint prompt (PROMPT ONLY).');
198
200
  } else if (normalized === 'consolidate') {
199
201
  console.log('Usage: atris wiki consolidate [--private]');
200
202
  console.log('');
@@ -327,7 +329,7 @@ async function wikiIngest(mode, slug, sourceValue) {
327
329
  `Pack: ${staged.packPath}`,
328
330
  `Manifest: ${staged.manifestPath}`,
329
331
  `Sources: ${staged.promptSource}`,
330
- ]);
332
+ ], 'ACTION TAKEN');
331
333
  return;
332
334
  }
333
335
 
@@ -586,6 +588,7 @@ async function wikiCommand(subcommand, ...args) {
586
588
  console.error('Cloud loop is not implemented yet. Run local `atris loop` first.');
587
589
  process.exit(1);
588
590
  }
591
+ console.log('ACTION TAKEN');
589
592
  const { loopAtris } = require('./loop');
590
593
  await loopAtris(cleanArgs);
591
594
  break;
package/commands/wish.js CHANGED
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ const { isFreshWorkspace, speakFirstMinute } = require('../lib/first-minute');
3
4
  const {
4
5
  analyzeWishParts,
5
6
  auditWish,
@@ -42,6 +43,23 @@ const { enqueueCloudMission, VALID_CLOUD_LANES } = require('../lib/cloud-mission
42
43
  const { printWishStats } = require('../lib/wish-stats');
43
44
  const { parseVerifyCommand } = require('../lib/auto-accept-certified');
44
45
 
46
+ const WISH_DESK_VERBS = new Set([
47
+ 'show', 'close', 'status', 'get', 'list', 'ls', 'board',
48
+ 'rewards', 'stats', 'improve', 'lessons', 'again',
49
+ 'answer', 'grant', 'review', 'say',
50
+ ]);
51
+
52
+ function printWishReceptionist(root = process.cwd()) {
53
+ const fresh = isFreshWorkspace(root);
54
+ const code = speakFirstMinute({ root, fresh });
55
+ if (!fresh) printReviewNudges(root);
56
+ return code;
57
+ }
58
+
59
+ function isWishDeskVerb(token) {
60
+ return WISH_DESK_VERBS.has(String(token || '').trim());
61
+ }
62
+
45
63
  function showHelp() {
46
64
  console.log('');
47
65
  console.log('Usage: atris wish "<plain sentence>" [--engine <id>] [--verify "<cmd>"] [--as builder] [--metric "<name><op><target>"] [--json] [--no-mission]');
@@ -52,6 +70,7 @@ function showHelp() {
52
70
  console.log(' atris wish board');
53
71
  console.log(' atris wish answer "<your answer>" [--engine <id>] [--json] [--no-mission]');
54
72
  console.log(' atris wish grant <n> "<answer>" [--engine <id>] [--json] [--no-mission]');
73
+ console.log(' atris wish grant <n> "<answer>" --cloud [--lane fast|pro|max] [--agent <id>]');
55
74
  console.log(' atris wish say "<note>" [wish-id]');
56
75
  console.log(' atris wish close <n|id> [<n|id> ...]');
57
76
  console.log(' atris wish again <id> "<tweak text>" [--engine <id>]');
@@ -283,6 +302,46 @@ async function runCloudWish(text, root, options, deps = {}) {
283
302
  }
284
303
  }
285
304
 
305
+ // A granted wish already has a number and an id, so the cloud receipt updates
306
+ // that row instead of opening a second one.
307
+ async function runCloudWishGrant(wish, text, root, options, deps = {}) {
308
+ try {
309
+ const mission = await enqueueCloudMission({
310
+ text,
311
+ lane: options.lane,
312
+ ...(options.agentId ? { agentId: options.agentId } : {}),
313
+ }, deps);
314
+ const ts = deps.ts || stampIso();
315
+ const record = {
316
+ id: wish.id,
317
+ n: wish.n || undefined,
318
+ ts,
319
+ text: wish.text,
320
+ status: 'delegated',
321
+ dispatched_at: ts,
322
+ cloud: true,
323
+ task_id: mission.task_id,
324
+ lane: mission.lane || options.lane,
325
+ answers: wish.answers || undefined,
326
+ parent_id: wish.parent_id || undefined,
327
+ decomposed_part: wish.decomposed_part || undefined,
328
+ };
329
+ appendWishRecord(root, record);
330
+ const log = deps.log || console.log;
331
+ if (options.asJson) {
332
+ log(JSON.stringify({ ok: true, action: 'cloud_wish_granted', mission, wish: record }, null, 2));
333
+ return 0;
334
+ }
335
+ log('i answered the question and sent the wish to cloud work, and we know it is queued because the cloud accepted it.');
336
+ log(`task_id: ${record.task_id}`);
337
+ log(`watch: atris mission status --cloud ${record.task_id} --watch`);
338
+ return 0;
339
+ } catch (error) {
340
+ (deps.error || console.error)(error.message || String(error));
341
+ return error.exitCode || 1;
342
+ }
343
+ }
344
+
286
345
  function resolveVerifyOption(options) {
287
346
  if (options.verifyMissing) return 'wish --verify needs a command.';
288
347
  if (!options.verifyRaw) return null;
@@ -355,15 +414,18 @@ function printLessons(root) {
355
414
 
356
415
  function wishCommand(args = [], deps = {}) {
357
416
  const first = String(args[0] || '').trim();
358
- if (!first) {
359
- showHelp();
360
- printReviewNudges(process.cwd());
361
- return 2;
362
- }
363
417
  if (first === '--help' || first === '-h' || first === 'help') {
364
418
  showHelp();
365
419
  return 0;
366
420
  }
421
+ const root = process.cwd();
422
+ // Empty folder talks like bare atris. A leftover sentence is not a
423
+ // wish desk. After init, a plain sentence still files. A cloud wish
424
+ // runs remotely and needs no local workspace, so it skips the gate.
425
+ const wantsCloud = args.includes('--cloud');
426
+ if (!first || (isFreshWorkspace(root) && !isWishDeskVerb(first) && !wantsCloud)) {
427
+ return printWishReceptionist(root);
428
+ }
367
429
  if (first === 'show') {
368
430
  return printWishShow(process.cwd(), args[1]);
369
431
  }
@@ -417,6 +479,15 @@ function wishCommand(args = [], deps = {}) {
417
479
  }
418
480
  if (first === 'grant') {
419
481
  const options = wishOptions(args);
482
+ if (options.cloud) {
483
+ const optionError = cloudWishOptionError(args, options);
484
+ if (optionError) {
485
+ (deps.error || console.error)(optionError);
486
+ return 2;
487
+ }
488
+ options.cloudDispatch = (answeredWish, auditText, root) =>
489
+ runCloudWishGrant(answeredWish, auditText, root, options, deps);
490
+ }
420
491
  return grantWish(options.positionals, process.cwd(), options);
421
492
  }
422
493
  if (first === 'review') {