atris 3.57.3 → 3.58.5

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 (175) hide show
  1. package/README.md +12 -1
  2. package/atris/skills/clawhub/member-runtime/SKILL.md +9 -9
  3. package/atris/skills/create-member/SKILL.md +16 -13
  4. package/atris/skills/design/SKILL.md +27 -4
  5. package/atris/skills/engines/SKILL.md +57 -13
  6. package/atris/skills/x-search/SKILL.md +13 -5
  7. package/atris/skills/youtube/SKILL.md +39 -8
  8. package/atris/team/brainstormer/MEMBER.md +2 -2
  9. package/atris/team/executor/MEMBER.md +3 -3
  10. package/atris/team/launcher/MEMBER.md +4 -4
  11. package/atris/team/navigator/MEMBER.md +3 -3
  12. package/atris/team/researcher/MEMBER.md +2 -2
  13. package/atris/team/validator/MEMBER.md +1 -1
  14. package/atris.md +14 -0
  15. package/ax +157 -24
  16. package/bin/atris.js +79 -31
  17. package/commands/aeo.js +4 -4
  18. package/commands/agents.js +1 -1
  19. package/commands/align.js +12 -12
  20. package/commands/analytics.js +3 -3
  21. package/commands/app.js +5 -5
  22. package/commands/ask.js +175 -0
  23. package/commands/auth.js +7 -7
  24. package/commands/autoland.js +29 -5
  25. package/commands/autopilot-front.js +6 -6
  26. package/commands/autopilot.js +90 -90
  27. package/commands/avail.js +5 -5
  28. package/commands/bench.js +63 -1
  29. package/commands/browse.js +2 -2
  30. package/commands/business.js +12 -12
  31. package/commands/card.js +2 -2
  32. package/commands/clean.js +13 -13
  33. package/commands/close.js +297 -15
  34. package/commands/compile.js +13 -13
  35. package/commands/computer.js +94 -27
  36. package/commands/console.js +5 -5
  37. package/commands/decide.js +1 -1
  38. package/commands/deck.js +9 -9
  39. package/commands/drive.js +4 -4
  40. package/commands/engine.js +173 -19
  41. package/commands/errors.js +3 -3
  42. package/commands/experiments.js +18 -1
  43. package/commands/feed.js +2 -2
  44. package/commands/feedback.js +4 -4
  45. package/commands/fleet.js +12 -12
  46. package/commands/game.js +1 -1
  47. package/commands/guide.js +49 -0
  48. package/commands/improve.js +19 -17
  49. package/commands/init.js +67 -19
  50. package/commands/interview.js +7 -7
  51. package/commands/land.js +40 -15
  52. package/commands/learn.js +12 -12
  53. package/commands/lesson.js +2 -2
  54. package/commands/log.js +1 -1
  55. package/commands/loops.js +4 -4
  56. package/commands/member.js +75 -50
  57. package/commands/mission.js +97 -98
  58. package/commands/one-lap.js +1 -1
  59. package/commands/pack.js +74 -8
  60. package/commands/plugin.js +6 -6
  61. package/commands/probe.js +9 -9
  62. package/commands/pull.js +35 -35
  63. package/commands/pulse.js +1 -1
  64. package/commands/push.js +21 -21
  65. package/commands/rainmaker.js +1 -1
  66. package/commands/recap.js +7 -7
  67. package/commands/reel.js +2 -2
  68. package/commands/release.js +3 -3
  69. package/commands/report.js +1 -1
  70. package/commands/review.js +5 -5
  71. package/commands/revisions.js +1 -1
  72. package/commands/run.js +1 -1
  73. package/commands/scout.js +3 -3
  74. package/commands/security-review.js +7 -7
  75. package/commands/serve.js +9 -9
  76. package/commands/setup.js +1 -1
  77. package/commands/sign.js +4 -4
  78. package/commands/signup.js +4 -4
  79. package/commands/site.js +8 -3
  80. package/commands/skill.js +6 -6
  81. package/commands/slop.js +18 -18
  82. package/commands/social.js +3 -3
  83. package/commands/soul.js +14 -14
  84. package/commands/spaceship.js +1 -1
  85. package/commands/status.js +2 -2
  86. package/commands/strings.js +13 -13
  87. package/commands/study.js +4 -4
  88. package/commands/sync.js +8 -8
  89. package/commands/task.js +50 -25
  90. package/commands/teach.js +2 -2
  91. package/commands/team.js +1 -1
  92. package/commands/theme.js +2 -2
  93. package/commands/tree.js +34 -0
  94. package/commands/truth.js +7 -7
  95. package/commands/verify.js +12 -12
  96. package/commands/visualize.js +2 -2
  97. package/commands/workflow.js +97 -40
  98. package/commands/worktree.js +57 -1
  99. package/commands/write.js +9 -9
  100. package/commands/x-search.js +304 -15
  101. package/commands/xp.js +6 -3
  102. package/commands/youtube.js +916 -65
  103. package/lib/accept-verify-gate.js +3 -3
  104. package/lib/activity-stream.js +1 -1
  105. package/lib/apply-gate.js +13 -0
  106. package/lib/auto-accept-certified.js +28 -12
  107. package/lib/autoland.js +6 -6
  108. package/lib/bench/engines.js +59 -8
  109. package/lib/bench/report.js +1 -1
  110. package/lib/bench/runner.js +204 -5
  111. package/lib/bench/tree-render.js +76 -0
  112. package/lib/card.js +1 -1
  113. package/lib/chat-log-scan.js +1 -1
  114. package/lib/claude-boot-block.js +2 -0
  115. package/lib/deck-compose.js +1 -1
  116. package/lib/deck-history.js +2 -2
  117. package/lib/deck-layout.js +1 -1
  118. package/lib/deck-review.js +5 -5
  119. package/lib/deck-schema.js +1 -1
  120. package/lib/default-verifier.js +1 -1
  121. package/lib/developer-api.js +3 -0
  122. package/lib/engine-ask.js +66 -9
  123. package/lib/engine-registry.js +15 -2
  124. package/lib/file-ops.js +1 -1
  125. package/lib/fleet.js +71 -35
  126. package/lib/html-render.js +1 -1
  127. package/lib/intents.js +172 -0
  128. package/lib/journal.js +1 -1
  129. package/lib/known-commands.js +2 -2
  130. package/lib/land-green.js +364 -0
  131. package/lib/lesson-contradiction.js +2 -2
  132. package/lib/lesson-preflight.js +1 -1
  133. package/lib/manifest.js +5 -5
  134. package/lib/member-alive.js +9 -5
  135. package/lib/memory-view.js +3 -3
  136. package/lib/mission-protected-lane.js +1 -1
  137. package/lib/mission-root.js +2 -2
  138. package/lib/orb-context.js +10 -10
  139. package/lib/pack-capabilities.js +861 -3
  140. package/lib/permission-grants.js +2 -2
  141. package/lib/policy-lessons.js +6 -6
  142. package/lib/pulse.js +8 -8
  143. package/lib/receipt-evidence.js +1 -1
  144. package/lib/reel.js +1 -1
  145. package/lib/review-integrity.js +1 -1
  146. package/lib/runner-command.js +35 -5
  147. package/lib/scorecard.js +4 -4
  148. package/lib/security-scan.js +5 -5
  149. package/lib/self-drive.js +1 -1
  150. package/lib/site-publish.js +372 -0
  151. package/lib/site.js +1 -1
  152. package/lib/slides-deck.js +2 -2
  153. package/lib/state-detection.js +2 -2
  154. package/lib/sync-telemetry.js +2 -2
  155. package/lib/task-db.js +17 -10
  156. package/lib/task-explanation.js +1 -1
  157. package/lib/task-proof.js +2 -2
  158. package/lib/task-receipt.js +3 -3
  159. package/lib/theme.js +12 -12
  160. package/lib/todo-fallback.js +3 -3
  161. package/lib/todo-sections.js +1 -1
  162. package/lib/tree-hash.js +79 -0
  163. package/lib/usage.js +1 -1
  164. package/lib/wish-delegate.js +1 -1
  165. package/lib/workspace-safety.js +4 -4
  166. package/lib/workspace-scaffold.js +3 -3
  167. package/package.json +1 -1
  168. package/scripts/det/concierge-bakeoff.sh +26 -0
  169. package/scripts/det/ytquote-repair.js +0 -1
  170. package/scripts/det/ytrail-race.js +0 -5
  171. package/scripts/member-operate.mjs +52 -14
  172. package/scripts/outbound-artifact-gate.js +0 -3
  173. package/utils/auth.js +0 -3
  174. package/utils/config.js +0 -1
  175. package/scripts/det/checklist-score.js +0 -191
@@ -6,7 +6,7 @@ const { spawnSync } = require('child_process');
6
6
 
7
7
  const MEMBER_OPERATE_PROGRESS_PREFIX = 'ATRIS_MEMBER_OPERATE_PROGRESS\t';
8
8
 
9
- // Wake decisions where the member should NOT run operate work this tick it is waiting on a
9
+ // Wake decisions where the member should NOT run operate work this tick: it is waiting on a
10
10
  // human (ask), on a pending review or clean scope (wait), or has no active goal yet (stop).
11
11
  const NON_OPERATE_DECISIONS = new Set(['ask', 'wait', 'stop']);
12
12
 
@@ -65,6 +65,7 @@ function resolveMemberOperateScript(cwd) {
65
65
  const candidates = [
66
66
  path.join(cwd, 'scripts', 'member-operate.mjs'),
67
67
  path.join(cwd, 'scripts', 'member-operate.js'),
68
+ path.join(__dirname, '..', 'scripts', 'member-operate.mjs'),
68
69
  ];
69
70
  for (const candidate of candidates) {
70
71
  if (fs.existsSync(candidate)) return candidate;
@@ -87,6 +88,7 @@ function runMemberOperateScript(scriptPath, member, opts) {
87
88
  if (opts.agent) args.push('--agent', String(opts.agent));
88
89
  if (opts.model) args.push('--model', String(opts.model));
89
90
  if (opts.noPrime) args.push('--no-prime');
91
+ if (opts.sharedCheckout) args.push('--shared-checkout');
90
92
  // Inherit stderr so member-operate progress lines reach the parent alive/loop process live.
91
93
  const result = spawnSync(process.execPath, args, {
92
94
  cwd: opts.cwd || process.cwd(),
@@ -188,7 +190,7 @@ function runAliveTick(name, opts = {}) {
188
190
  return tick;
189
191
  }
190
192
 
191
- emitAliveProgress({ kind: 'phase', text: `Running ${name} tick streaming live below.` });
193
+ emitAliveProgress({ kind: 'phase', text: `Running ${name} tick, streaming live below.` });
192
194
  tick.operate = runMemberOperateScript(operateScript, name, {
193
195
  cwd,
194
196
  execute: true,
@@ -197,6 +199,7 @@ function runAliveTick(name, opts = {}) {
197
199
  agent: opts.agent || null,
198
200
  model: opts.model || null,
199
201
  noPrime: true,
202
+ sharedCheckout: opts.sharedCheckout,
200
203
  });
201
204
  tick.needs_user = tick.needs_user || tick.operate.needs_user === true;
202
205
 
@@ -210,17 +213,18 @@ function runAliveTick(name, opts = {}) {
210
213
  const operateOk = tick.operate.ok !== false;
211
214
  const acceptOk = tick.auto_accept.ok !== false;
212
215
  tick.ok = operateOk && acceptOk;
216
+ const planned = tick.ok && tick.operate.payload?.status === 'planned';
213
217
  tick.status = tick.needs_user
214
218
  ? 'needs_user'
215
219
  : tick.ok
216
- ? 'completed'
220
+ ? planned ? 'planned' : 'completed'
217
221
  : 'failed';
218
222
  tick.reason = tick.ok
219
- ? 'alive_tick_complete'
223
+ ? planned ? tick.operate.reason : 'alive_tick_complete'
220
224
  : tick.operate.reason || tick.auto_accept.json?.summary
221
225
  ? 'partial_failure'
222
226
  : 'alive_tick_failed';
223
- tick.receipt_path = tick.operate.receipt_path || wakeJson.receipt_path || null;
227
+ tick.receipt_path = tick.operate.receipt_path || null;
224
228
  tick.finished_at = stampIso();
225
229
  return tick;
226
230
  }
@@ -1,4 +1,4 @@
1
- // Memory view another way to look at memory updates. Reads the workspace's
1
+ // Memory view: another way to look at memory updates. Reads the workspace's
2
2
  // compounding memory (lessons.md, learnings.jsonl, task projection) and builds a
3
3
  // content spec rendered as a beautiful HTML page by lib/html-render.
4
4
  //
@@ -9,13 +9,13 @@
9
9
  const fs = require('fs');
10
10
  const path = require('path');
11
11
 
12
- // "- **[2026-06-18] some-id** pass text..." -> { date, id, status, text, resolved }
12
+ // "- **[2026-06-18] some-id**, pass, text..." -> { date, id, status, text, resolved }
13
13
  // A leading "[resolved]" marker (written when a lesson's detector passes) is
14
14
  // stripped from the text and surfaced as `resolved` so the view can retire it.
15
15
  function parseLessons(text) {
16
16
  const out = [];
17
17
  for (const line of String(text || '').split('\n')) {
18
- const m = line.match(/^-\s*\*\*\[([^\]]+)\]\s*([^*]+?)\*\*\s*[—:-]*\s*(pass|fail)?\s*[—:-]*\s*(.*)$/i);
18
+ const m = line.match(/^-\s*\*\*\[([^\]]+)\]\s*([^*]+?)\*\*\s*[\u2014:-]*\s*(pass|fail)?\s*[\u2014:-]*\s*(.*)$/i);
19
19
  if (!m) continue;
20
20
  let body = m[4].trim();
21
21
  const resolved = /\[resolved\]/i.test(body);
@@ -51,7 +51,7 @@ function changedPathsFromDiff(diff) {
51
51
 
52
52
  // Prose is not a protected surface. Docs, judge cards, wikis, journals and run
53
53
  // receipts routinely *describe* CSP or force-dynamic without changing any
54
- // behaviour replaying this guard over 60 real commits, 5 of 6 hits were
54
+ // behaviour: replaying this guard over 60 real commits, 5 of 6 hits were
55
55
  // markdown that merely mentioned the words. A guard that pauses on every judge
56
56
  // card gets switched off, which is worse than no guard. Content signals
57
57
  // therefore apply to code only; PATH signals still apply to every file.
@@ -6,7 +6,7 @@ const { spawnSync } = require('child_process');
6
6
  // The mission store lives at <workspace>/.atris/state. Historically every
7
7
  // mission entry point defaulted its root to process.cwd(), so running any
8
8
  // `atris mission ...` verb from a subdirectory (e.g. atris/features/food-ordering)
9
- // silently created a NESTED .atris there a second, split-brain mission store
9
+ // silently created a NESTED .atris there: a second, split-brain mission store
10
10
  // the fleet never reads. Resolve to the workspace root so mission state always
11
11
  // lands there, whichever subdir the caller happened to be in.
12
12
  //
@@ -14,7 +14,7 @@ const { spawnSync } = require('child_process');
14
14
  // (lib/task-db findWorkspaceRoot): a bound customer sub-workspace spine
15
15
  // (.atris/business.json | atris/atris.md) wins, else the git toplevel, else the
16
16
  // caller's cwd. Sharing one resolver keeps mission state and task state in the
17
- // same root previously mission used only the git toplevel, so a mission
17
+ // same root. previously mission used only the git toplevel, so a mission
18
18
  // started inside a bound sub-workspace split away from that workspace's task
19
19
  // state. A git worktree reports its own toplevel (its .git marker), which is
20
20
  // the correct per-worktree store, so --worktree missions are unaffected. Walk-up
@@ -1,4 +1,4 @@
1
- // Orb context deterministic greeting + suggestion synthesis for the orb surface.
1
+ // Orb context: deterministic greeting + suggestion synthesis for the orb surface.
2
2
  // Pure synthesis lives in buildOrbContext (unit-testable, no fs); collectOrbContext
3
3
  // does the read-only fs aggregation from a project root. No model calls anywhere:
4
4
  // 0ms-to-greeting is the contract (atris/features/orb-desktop/PLAN.md).
@@ -65,7 +65,7 @@ function normalizeTasks(tasks) {
65
65
  }
66
66
 
67
67
  // Known suggestion action prefixes. Stripped repeatedly (front-anchored) so that
68
- // "review: review: X" or "pick up pick up X" both collapse to the bare title
68
+ // "review: review: X" or "pick up pick up X" both collapse to the bare title.
69
69
  // used both to keep labels single-prefixed and to compare titles across sources.
70
70
  // "atrisbox" is included because Atrisbox threads are titled "Atrisbox: <label>",
71
71
  // which otherwise shields inner accumulated prefixes from stripping (seen live
@@ -85,12 +85,12 @@ function stripActionPrefixes(value) {
85
85
  }
86
86
 
87
87
  // Lowercase, prefix-stripped, whitespace-collapsed form used only for equality/
88
- // prefix comparison across sources (tasks vs threads) never shown to the user.
88
+ // prefix comparison across sources (tasks vs threads), never shown to the user.
89
89
  function normalizeForMatch(value) {
90
90
  return stripActionPrefixes(String(value || '').toLowerCase().replace(/\s+/g, ' ').trim());
91
91
  }
92
92
 
93
- // True when two titles are "the same work" exact match, or one is a truncated
93
+ // True when two titles are "the same work": exact match, or one is a truncated
94
94
  // prefix of the other (titles get cut at different lengths per source, so a
95
95
  // straight equality check would miss the common case). Guarded by a minimum
96
96
  // needle length so short titles ("fix it") don't false-positive against unrelated
@@ -106,7 +106,7 @@ function titlesOverlap(a, b) {
106
106
  }
107
107
 
108
108
  // Background Atrisbox taps write a launch-receipt thread (desk_<project>_
109
- // atrisbox_bg_<slug>) — it's proof a turn ran, not a resumable conversation.
109
+ // atrisbox_bg_<slug>), proof a turn ran, not a resumable conversation.
110
110
  // They self-archive on delivery (App.tsx sendAtrisboxMessage) and main.js
111
111
  // sweeps stragglers, but excluding them from warm eligibility here too is
112
112
  // cheap (a string check, no I/O) and keeps the count honest even for threads
@@ -127,7 +127,7 @@ function normalizeThreads(threads) {
127
127
  .sort((a, b) => b.updatedAt - a.updatedAt);
128
128
  }
129
129
 
130
- // Dedupe by "same work" (titlesOverlap) keeping the newest of each cluster
130
+ // Dedupe by "same work" (titlesOverlap) keeping the newest of each cluster,
131
131
  // used before counting warm threads so the greeting number reflects distinct
132
132
  // resumable work, not the same thread title repeated under different ids.
133
133
  function dedupeByTitle(threads) {
@@ -218,7 +218,7 @@ function buildOrbContext({ nowMd = '', tasks = [], threads = [], memberLoops = [
218
218
  const suggestions = [];
219
219
  // Titles already spoken for by a suggestion, used to dedupe across sources
220
220
  // (review/resume/continue are built independently but can point at the same
221
- // underlying work e.g. a task's warm thread title vs the task's own title).
221
+ // underlying work, e.g. a task's warm thread title vs the task's own title).
222
222
  const usedTitles = [];
223
223
 
224
224
  function pushSuggestion(suggestion, title = '') {
@@ -268,7 +268,7 @@ function buildOrbContext({ nowMd = '', tasks = [], threads = [], memberLoops = [
268
268
  });
269
269
  }
270
270
 
271
- // Explicitly blocked/stalled statuses are their own lane distinct from the
271
+ // Explicitly blocked/stalled statuses are their own lane, distinct from the
272
272
  // stale-doing "finish" lane below, which infers staleness from the clock.
273
273
  const blockedTask = cleanTasks
274
274
  .filter((t) => t.status === 'blocked' || t.status === 'stalled')
@@ -310,7 +310,7 @@ function buildOrbContext({ nowMd = '', tasks = [], threads = [], memberLoops = [
310
310
  for (const thread of warmThreads) {
311
311
  if (usedTitles.some((title) => titlesOverlap(title, thread.title))) continue;
312
312
  // Thread titles inherit message text, so a picked-up thread can arrive as
313
- // "pick up X: pick up X..." strip the accumulated prefixes before reusing.
313
+ // "pick up X: pick up X...", strip the accumulated prefixes before reusing.
314
314
  const threadTitle = cleanTitle(stripActionPrefixes(String(thread.title || '')), 40);
315
315
  if (threadTitle.length < 3) continue;
316
316
  resumeThread = thread;
@@ -369,7 +369,7 @@ function buildOrbContext({ nowMd = '', tasks = [], threads = [], memberLoops = [
369
369
 
370
370
  // These stay at the tail even when the backlog is full, so orientation and
371
371
  // planning never disappear behind the deeper task-fed pool.
372
- // 'status' is answered locally by the view from gmSnapshot no model call.
372
+ // 'status' is answered locally by the view from gmSnapshot, no model call.
373
373
  const staticSuggestions = [{
374
374
  id: 'status',
375
375
  label: "what's moving",