atris 3.34.0 → 3.36.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.
- package/AGENTS.md +35 -0
- package/FOR_AGENTS.md +5 -3
- package/README.md +5 -3
- package/atris/GETTING_STARTED.md +1 -1
- package/atris/atris.md +3 -0
- package/atris/policies/day-loop-voice.md +102 -0
- package/atris/policies/outbound-artifact-gate.md +2 -0
- package/atris/skills/design/SKILL.md +56 -32
- package/atris/skills/endgame/SKILL.md +12 -6
- package/atris/skills/engines/SKILL.md +35 -8
- package/atris/skills/fable-method/SKILL.md +66 -0
- package/atris/skills/improve/SKILL.md +65 -45
- package/atris/skills/render-cli/SKILL.md +88 -0
- package/atris/skills/youtube/SKILL.md +10 -1
- package/atris.md +6 -2
- package/ax +617 -31
- package/bin/atris.js +719 -266
- package/commands/activate.js +194 -88
- package/commands/aeo.js +52 -0
- package/commands/agents.js +166 -0
- package/commands/autoland.js +718 -72
- package/commands/autopilot-front.js +20 -2
- package/commands/autopilot.js +118 -2
- package/commands/avail.js +407 -0
- package/commands/bench.js +188 -0
- package/commands/brain.js +3 -0
- package/commands/brief.js +651 -0
- package/commands/business-sync.js +192 -6
- package/commands/business.js +91 -8
- package/commands/clean.js +50 -24
- package/commands/close.js +1083 -0
- package/commands/cloud.js +245 -0
- package/commands/codex-goal.js +26 -2
- package/commands/compile.js +292 -1
- package/commands/computer.js +150 -3
- package/commands/dream.js +365 -0
- package/commands/drill.js +371 -0
- package/commands/drive.js +187 -0
- package/commands/engine.js +1061 -29
- package/commands/experiments.js +28 -0
- package/commands/feed.js +202 -0
- package/commands/feedback.js +34 -12
- package/commands/fleet-report.js +206 -0
- package/commands/github.js +38 -0
- package/commands/gm.js +285 -3
- package/commands/goal.js +247 -0
- package/commands/improve.js +642 -26
- package/commands/init.js +83 -43
- package/commands/integrations.js +39 -11
- package/commands/interview.js +209 -0
- package/commands/land.js +253 -52
- package/commands/lesson.js +112 -1
- package/commands/lifecycle.js +39 -3
- package/commands/linear.js +38 -0
- package/commands/log.js +84 -1
- package/commands/loops.js +220 -16
- package/commands/meet.js +220 -0
- package/commands/member.js +899 -66
- package/commands/mission.js +3512 -332
- package/commands/next.js +137 -0
- package/commands/now.js +240 -21
- package/commands/one-lap.js +776 -0
- package/commands/orb.js +314 -0
- package/commands/pack-craft.js +179 -0
- package/commands/pack.js +823 -0
- package/commands/play.js +3 -2
- package/commands/probe.js +30 -3
- package/commands/pulse.js +241 -46
- package/commands/push.js +260 -82
- package/commands/radar.js +259 -14
- package/commands/rainmaker.js +49 -0
- package/commands/report.js +415 -0
- package/commands/scout.js +147 -0
- package/commands/search.js +363 -0
- package/commands/serve.js +54 -0
- package/commands/skill.js +47 -3
- package/commands/slop.js +50 -2
- package/commands/soul.js +1 -1
- package/commands/status.js +50 -5
- package/commands/stream.js +861 -0
- package/commands/stripe.js +38 -0
- package/commands/study.js +693 -0
- package/commands/supabase.js +39 -0
- package/commands/sync.js +67 -54
- package/commands/task.js +2275 -182
- package/commands/team.js +73 -0
- package/commands/truth.js +29 -3
- package/commands/unknowns.js +627 -0
- package/commands/update.js +44 -0
- package/commands/vercel.js +38 -0
- package/commands/verify.js +96 -0
- package/commands/watch.js +303 -0
- package/commands/wish.js +500 -0
- package/commands/workflow.js +11 -5
- package/commands/worktree.js +299 -20
- package/commands/write.js +399 -0
- package/commands/xp.js +29 -11
- package/lib/auto-accept-certified.js +391 -43
- package/lib/autoland.js +353 -52
- package/lib/ax-auto-lane.js +79 -0
- package/lib/bench/context.js +147 -0
- package/lib/bench/engines.js +141 -0
- package/lib/bench/report.js +140 -0
- package/lib/bench/runner.js +512 -0
- package/lib/brief-ledger.js +350 -0
- package/lib/cloud-mission.js +259 -0
- package/lib/codex-flight.js +154 -0
- package/lib/default-runner.js +45 -0
- package/lib/default-verifier.js +70 -0
- package/lib/engine-registry.js +232 -0
- package/lib/experiments/daily.js +640 -0
- package/lib/fleet.js +2431 -38
- package/lib/improve-vitals-html.js +171 -0
- package/lib/known-commands.js +58 -0
- package/lib/loop-doctor.js +416 -0
- package/lib/member-switches.js +144 -0
- package/lib/memory-view.js +14 -5
- package/lib/mission-room.js +1 -0
- package/lib/mission-root.js +52 -0
- package/lib/mission-runtime-loop.js +7 -0
- package/lib/next-moves.js +327 -10
- package/lib/official-cli-integration.js +174 -0
- package/lib/one-lap-validator.js +60 -0
- package/lib/orb-context.js +477 -0
- package/lib/orb-scorecard.js +224 -0
- package/lib/outbound-send-gate.js +165 -0
- package/lib/permission-grants.js +293 -0
- package/lib/policy-lessons.js +52 -1
- package/lib/pulse.js +277 -3
- package/lib/receipt-block.js +168 -0
- package/lib/receipt-evidence.js +65 -4
- package/lib/review-integrity.js +147 -0
- package/lib/router-brain.js +352 -0
- package/lib/runner-command.js +33 -0
- package/lib/self-drive.js +258 -0
- package/lib/short-name.js +103 -0
- package/lib/spawn-env.js +18 -0
- package/lib/state-detection.js +56 -1
- package/lib/sync-status.js +59 -0
- package/lib/task-db.js +319 -27
- package/lib/task-proof.js +43 -1
- package/lib/task-receipt.js +93 -0
- package/lib/team-presence.js +260 -0
- package/lib/tool-result-encode.js +7 -0
- package/lib/trust-tiers.js +90 -0
- package/lib/usage.js +107 -0
- package/lib/voice-gate.js +163 -0
- package/lib/wish-audit.js +1368 -0
- package/lib/wish-delegate.js +1840 -0
- package/lib/wish-design.js +110 -0
- package/lib/wish-stats.js +183 -0
- package/lib/wish-store.js +354 -0
- package/lib/zip.js +221 -0
- package/package.json +3 -1
- package/templates/loops/atris/loops/LOOPS.md +55 -0
- package/templates/loops/atris/loops/TICK.md +24 -0
- package/templates/loops/atris/loops/feedback.md +22 -0
- package/templates/loops/atris/loops/quality.md +22 -0
- package/templates/loops/atris/wiki/systems/loops.md +41 -0
- package/utils/api.js +5 -1
- package/utils/auth.js +57 -21
- package/utils/update-check.js +27 -6
- package/atris/learnings.jsonl +0 -1
package/commands/team.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const taskDb = require('../lib/task-db');
|
|
4
|
+
const { buildTeamPresence, DEFAULT_FRESHNESS_WINDOW_MS, renderTeamPresence } = require('../lib/team-presence');
|
|
5
|
+
const { listMissions, listWorktreeRollupMissions } = require('./mission');
|
|
6
|
+
const { collectSnapshot, collectStreamEvents, repoRoot } = require('./stream');
|
|
7
|
+
|
|
8
|
+
function collectTasks(root, deps = {}) {
|
|
9
|
+
if (Array.isArray(deps.tasks)) return deps.tasks;
|
|
10
|
+
const dbModule = deps.taskDb || taskDb;
|
|
11
|
+
const db = dbModule.open();
|
|
12
|
+
return dbModule.taskProjection(db, { workspaceRoot: root, limit: 500 }).tasks || [];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function collectMissions(root, deps = {}) {
|
|
16
|
+
if (Array.isArray(deps.missions)) return deps.missions;
|
|
17
|
+
const local = listMissions(root);
|
|
18
|
+
const rolled = listWorktreeRollupMissions(root);
|
|
19
|
+
const byId = new Map();
|
|
20
|
+
for (const mission of [...local, ...rolled]) {
|
|
21
|
+
const key = String(mission?.id || '');
|
|
22
|
+
if (key && !byId.has(key)) byId.set(key, mission);
|
|
23
|
+
}
|
|
24
|
+
return [...byId.values()];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function collectTeamPresence(deps = {}) {
|
|
28
|
+
const root = deps.root || repoRoot(deps.cwd || process.cwd());
|
|
29
|
+
const nowMs = typeof deps.now === 'function' ? deps.now() : Date.now();
|
|
30
|
+
const freshnessWindowMs = deps.freshnessWindowMs || DEFAULT_FRESHNESS_WINDOW_MS;
|
|
31
|
+
const stream = deps.stream || collectSnapshot({ root, deps: deps.streamDeps });
|
|
32
|
+
const streamEvents = deps.streamEvents || collectStreamEvents({
|
|
33
|
+
root,
|
|
34
|
+
sinceMs: nowMs - freshnessWindowMs,
|
|
35
|
+
nowMs,
|
|
36
|
+
deps: deps.streamDeps,
|
|
37
|
+
});
|
|
38
|
+
return buildTeamPresence({
|
|
39
|
+
nowMs,
|
|
40
|
+
freshnessWindowMs,
|
|
41
|
+
stream,
|
|
42
|
+
streamEvents,
|
|
43
|
+
missions: collectMissions(root, deps),
|
|
44
|
+
tasks: collectTasks(root, deps),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function helpText() {
|
|
49
|
+
return [
|
|
50
|
+
'atris team presence - show who is awake and what they are doing',
|
|
51
|
+
'',
|
|
52
|
+
'usage: atris team presence [--json]',
|
|
53
|
+
].join('\n');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function teamCommand(args = [], deps = {}) {
|
|
57
|
+
if (args.includes('--help') || args.includes('-h') || args[0] === 'help') {
|
|
58
|
+
(deps.write || process.stdout.write.bind(process.stdout))(`${helpText()}\n`);
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
if (args[0] !== 'presence' || args.some((arg, index) => index > 0 && arg !== '--json')) {
|
|
62
|
+
(deps.error || process.stderr.write.bind(process.stderr))('usage: atris team presence [--json]\n');
|
|
63
|
+
return 2;
|
|
64
|
+
}
|
|
65
|
+
const presence = deps.presence || collectTeamPresence(deps);
|
|
66
|
+
const output = args.includes('--json')
|
|
67
|
+
? JSON.stringify(presence, null, 2)
|
|
68
|
+
: renderTeamPresence(presence);
|
|
69
|
+
(deps.write || process.stdout.write.bind(process.stdout))(`${output}\n`);
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = { collectMissions, collectTasks, collectTeamPresence, teamCommand };
|
package/commands/truth.js
CHANGED
|
@@ -107,9 +107,34 @@ function taskScopeLine(scope) {
|
|
|
107
107
|
return `${taskScopeLabel(scope)} (${scope.workspace_root})`;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
const PARKED_DAYS = 30;
|
|
111
|
+
|
|
112
|
+
// One git call: every feature dir touched in the last PARKED_DAYS.
|
|
113
|
+
// An unproven feature nobody has edited in a month is a parked idea
|
|
114
|
+
// packet, not work-in-progress — counting it as "unproven" buries the
|
|
115
|
+
// handful of live lanes that actually need a proof receipt.
|
|
116
|
+
function recentlyTouchedFeatureDirs(cwd) {
|
|
117
|
+
try {
|
|
118
|
+
const out = execFileSync(
|
|
119
|
+
'git',
|
|
120
|
+
['log', `--since=${PARKED_DAYS}.days`, '--format=', '--name-only', '--', 'atris/features'],
|
|
121
|
+
{ cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] },
|
|
122
|
+
);
|
|
123
|
+
const dirs = new Set();
|
|
124
|
+
for (const line of out.split('\n')) {
|
|
125
|
+
const m = line.match(/^atris\/features\/([^/]+)\//);
|
|
126
|
+
if (m) dirs.add(m[1]);
|
|
127
|
+
}
|
|
128
|
+
return dirs;
|
|
129
|
+
} catch {
|
|
130
|
+
return null; // no git history to judge by: nothing reads as parked
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
110
134
|
function loadFeatures(cwd) {
|
|
111
135
|
const dir = path.join(cwd, 'atris', 'features');
|
|
112
136
|
if (!fs.existsSync(dir)) return [];
|
|
137
|
+
const recent = recentlyTouchedFeatureDirs(cwd);
|
|
113
138
|
const out = [];
|
|
114
139
|
for (const name of fs.readdirSync(dir)) {
|
|
115
140
|
if (name.startsWith('_')) continue;
|
|
@@ -134,6 +159,7 @@ function loadFeatures(cwd) {
|
|
|
134
159
|
if (/blocked/i.test(status || '')) verdict = 'blocked';
|
|
135
160
|
else if (proofAgeDays != null && proofAgeDays <= STALE_DAYS) verdict = 'proven';
|
|
136
161
|
else if (proofAgeDays != null) verdict = 'stale';
|
|
162
|
+
else if (recent && !recent.has(name)) verdict = 'parked';
|
|
137
163
|
else verdict = 'unproven';
|
|
138
164
|
out.push({ lane: name, status: status || '-', verdict, proofAgeDays });
|
|
139
165
|
}
|
|
@@ -199,7 +225,7 @@ function truthCommand(args = []) {
|
|
|
199
225
|
|
|
200
226
|
const line = (s) => console.log(s);
|
|
201
227
|
if (summary) {
|
|
202
|
-
line(`truth [${taskScopeLabel(scope)}]: features ${featureTally.proven || 0} proven / ${featureTally.stale || 0} stale / ${featureTally.blocked || 0} blocked / ${featureTally.unproven || 0} unproven · loops ${loopTally.proven || 0} live / ${(loopTally.stale || 0) + (loopTally['never-ran'] || 0)} stale / ${loopTally.blocked || 0} failing · missions ${missions.length} active`);
|
|
228
|
+
line(`truth [${taskScopeLabel(scope)}]: features ${featureTally.proven || 0} proven / ${featureTally.stale || 0} stale / ${featureTally.blocked || 0} blocked / ${featureTally.unproven || 0} unproven / ${featureTally.parked || 0} parked · loops ${loopTally.proven || 0} live / ${(loopTally.stale || 0) + (loopTally['never-ran'] || 0)} stale / ${loopTally.blocked || 0} failing · missions ${missions.length} active`);
|
|
203
229
|
return 0;
|
|
204
230
|
}
|
|
205
231
|
|
|
@@ -214,7 +240,7 @@ function truthCommand(args = []) {
|
|
|
214
240
|
}
|
|
215
241
|
|
|
216
242
|
line(`\nFeature lanes (${features.length}):`);
|
|
217
|
-
const order = { blocked: 0, stale: 1, unproven: 2, proven: 3 };
|
|
243
|
+
const order = { blocked: 0, stale: 1, unproven: 2, proven: 3, parked: 4 };
|
|
218
244
|
for (const f of features.sort((a, b) => (order[a.verdict] ?? 9) - (order[b.verdict] ?? 9))) {
|
|
219
245
|
line(` ${f.verdict.padEnd(9)} ${fmtAge(f.proofAgeDays).padStart(6)} ${f.lane}`);
|
|
220
246
|
}
|
|
@@ -224,7 +250,7 @@ function truthCommand(args = []) {
|
|
|
224
250
|
line(` ${h.verdict.padEnd(9)} ${fmtAge(h.lastRunAgeDays).padStart(6)} ${h.id}${h.fails ? ` fails=${h.fails}` : ''}`);
|
|
225
251
|
}
|
|
226
252
|
|
|
227
|
-
line(`\nVerdict key: proven = receipt within ${STALE_DAYS}d · stale = receipt older · unproven = no receipt
|
|
253
|
+
line(`\nVerdict key: proven = receipt within ${STALE_DAYS}d · stale = receipt older · unproven = no receipt, edited within ${PARKED_DAYS}d · parked = no receipt, untouched ${PARKED_DAYS}d+ · blocked = failing now`);
|
|
228
254
|
return 0;
|
|
229
255
|
}
|
|
230
256
|
|