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.
- package/README.md +12 -1
- package/atris/skills/clawhub/member-runtime/SKILL.md +9 -9
- package/atris/skills/create-member/SKILL.md +16 -13
- package/atris/skills/design/SKILL.md +27 -4
- package/atris/skills/engines/SKILL.md +57 -13
- package/atris/skills/x-search/SKILL.md +13 -5
- package/atris/skills/youtube/SKILL.md +39 -8
- package/atris/team/brainstormer/MEMBER.md +2 -2
- package/atris/team/executor/MEMBER.md +3 -3
- package/atris/team/launcher/MEMBER.md +4 -4
- package/atris/team/navigator/MEMBER.md +3 -3
- package/atris/team/researcher/MEMBER.md +2 -2
- package/atris/team/validator/MEMBER.md +1 -1
- package/atris.md +14 -0
- package/ax +157 -24
- package/bin/atris.js +79 -31
- package/commands/aeo.js +4 -4
- package/commands/agents.js +1 -1
- package/commands/align.js +12 -12
- package/commands/analytics.js +3 -3
- package/commands/app.js +5 -5
- package/commands/ask.js +175 -0
- package/commands/auth.js +7 -7
- package/commands/autoland.js +29 -5
- package/commands/autopilot-front.js +6 -6
- package/commands/autopilot.js +90 -90
- package/commands/avail.js +5 -5
- package/commands/bench.js +63 -1
- package/commands/browse.js +2 -2
- package/commands/business.js +12 -12
- package/commands/card.js +2 -2
- package/commands/clean.js +13 -13
- package/commands/close.js +297 -15
- package/commands/compile.js +13 -13
- package/commands/computer.js +94 -27
- package/commands/console.js +5 -5
- package/commands/decide.js +1 -1
- package/commands/deck.js +9 -9
- package/commands/drive.js +4 -4
- package/commands/engine.js +173 -19
- package/commands/errors.js +3 -3
- package/commands/experiments.js +18 -1
- package/commands/feed.js +2 -2
- package/commands/feedback.js +4 -4
- package/commands/fleet.js +12 -12
- package/commands/game.js +1 -1
- package/commands/guide.js +49 -0
- package/commands/improve.js +19 -17
- package/commands/init.js +67 -19
- package/commands/interview.js +7 -7
- package/commands/land.js +40 -15
- package/commands/learn.js +12 -12
- package/commands/lesson.js +2 -2
- package/commands/log.js +1 -1
- package/commands/loops.js +4 -4
- package/commands/member.js +75 -50
- package/commands/mission.js +97 -98
- package/commands/one-lap.js +1 -1
- package/commands/pack.js +74 -8
- package/commands/plugin.js +6 -6
- package/commands/probe.js +9 -9
- package/commands/pull.js +35 -35
- package/commands/pulse.js +1 -1
- package/commands/push.js +21 -21
- package/commands/rainmaker.js +1 -1
- package/commands/recap.js +7 -7
- package/commands/reel.js +2 -2
- package/commands/release.js +3 -3
- package/commands/report.js +1 -1
- package/commands/review.js +5 -5
- package/commands/revisions.js +1 -1
- package/commands/run.js +1 -1
- package/commands/scout.js +3 -3
- package/commands/security-review.js +7 -7
- package/commands/serve.js +9 -9
- package/commands/setup.js +1 -1
- package/commands/sign.js +4 -4
- package/commands/signup.js +4 -4
- package/commands/site.js +8 -3
- package/commands/skill.js +6 -6
- package/commands/slop.js +18 -18
- package/commands/social.js +3 -3
- package/commands/soul.js +14 -14
- package/commands/spaceship.js +1 -1
- package/commands/status.js +2 -2
- package/commands/strings.js +13 -13
- package/commands/study.js +4 -4
- package/commands/sync.js +8 -8
- package/commands/task.js +50 -25
- package/commands/teach.js +2 -2
- package/commands/team.js +1 -1
- package/commands/theme.js +2 -2
- package/commands/tree.js +34 -0
- package/commands/truth.js +7 -7
- package/commands/verify.js +12 -12
- package/commands/visualize.js +2 -2
- package/commands/workflow.js +97 -40
- package/commands/worktree.js +57 -1
- package/commands/write.js +9 -9
- package/commands/x-search.js +304 -15
- package/commands/xp.js +6 -3
- package/commands/youtube.js +916 -65
- package/lib/accept-verify-gate.js +3 -3
- package/lib/activity-stream.js +1 -1
- package/lib/apply-gate.js +13 -0
- package/lib/auto-accept-certified.js +28 -12
- package/lib/autoland.js +6 -6
- package/lib/bench/engines.js +59 -8
- package/lib/bench/report.js +1 -1
- package/lib/bench/runner.js +204 -5
- package/lib/bench/tree-render.js +76 -0
- package/lib/card.js +1 -1
- package/lib/chat-log-scan.js +1 -1
- package/lib/claude-boot-block.js +2 -0
- package/lib/deck-compose.js +1 -1
- package/lib/deck-history.js +2 -2
- package/lib/deck-layout.js +1 -1
- package/lib/deck-review.js +5 -5
- package/lib/deck-schema.js +1 -1
- package/lib/default-verifier.js +1 -1
- package/lib/developer-api.js +3 -0
- package/lib/engine-ask.js +66 -9
- package/lib/engine-registry.js +15 -2
- package/lib/file-ops.js +1 -1
- package/lib/fleet.js +71 -35
- package/lib/html-render.js +1 -1
- package/lib/intents.js +172 -0
- package/lib/journal.js +1 -1
- package/lib/known-commands.js +2 -2
- package/lib/land-green.js +364 -0
- package/lib/lesson-contradiction.js +2 -2
- package/lib/lesson-preflight.js +1 -1
- package/lib/manifest.js +5 -5
- package/lib/member-alive.js +9 -5
- package/lib/memory-view.js +3 -3
- package/lib/mission-protected-lane.js +1 -1
- package/lib/mission-root.js +2 -2
- package/lib/orb-context.js +10 -10
- package/lib/pack-capabilities.js +861 -3
- package/lib/permission-grants.js +2 -2
- package/lib/policy-lessons.js +6 -6
- package/lib/pulse.js +8 -8
- package/lib/receipt-evidence.js +1 -1
- package/lib/reel.js +1 -1
- package/lib/review-integrity.js +1 -1
- package/lib/runner-command.js +35 -5
- package/lib/scorecard.js +4 -4
- package/lib/security-scan.js +5 -5
- package/lib/self-drive.js +1 -1
- package/lib/site-publish.js +372 -0
- package/lib/site.js +1 -1
- package/lib/slides-deck.js +2 -2
- package/lib/state-detection.js +2 -2
- package/lib/sync-telemetry.js +2 -2
- package/lib/task-db.js +17 -10
- package/lib/task-explanation.js +1 -1
- package/lib/task-proof.js +2 -2
- package/lib/task-receipt.js +3 -3
- package/lib/theme.js +12 -12
- package/lib/todo-fallback.js +3 -3
- package/lib/todo-sections.js +1 -1
- package/lib/tree-hash.js +79 -0
- package/lib/usage.js +1 -1
- package/lib/wish-delegate.js +1 -1
- package/lib/workspace-safety.js +4 -4
- package/lib/workspace-scaffold.js +3 -3
- package/package.json +1 -1
- package/scripts/det/concierge-bakeoff.sh +26 -0
- package/scripts/det/ytquote-repair.js +0 -1
- package/scripts/det/ytrail-race.js +0 -5
- package/scripts/member-operate.mjs +52 -14
- package/scripts/outbound-artifact-gate.js +0 -3
- package/utils/auth.js +0 -3
- package/utils/config.js +0 -1
- package/scripts/det/checklist-score.js +0 -191
package/lib/member-alive.js
CHANGED
|
@@ -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
|
|
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
|
|
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 ||
|
|
227
|
+
tick.receipt_path = tick.operate.receipt_path || null;
|
|
224
228
|
tick.finished_at = stampIso();
|
|
225
229
|
return tick;
|
|
226
230
|
}
|
package/lib/memory-view.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Memory view
|
|
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
|
|
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*[
|
|
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
|
|
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.
|
package/lib/mission-root.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
package/lib/orb-context.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Orb context
|
|
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)
|
|
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"
|
|
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>)
|
|
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
|
|
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
|
|
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..."
|
|
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
|
|
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",
|