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/meet.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { initAtris } = require('./init');
|
|
6
|
+
const { run: themeCommand } = require('./theme');
|
|
7
|
+
const { parseSimpleFlags, runPlainInterview } = require('./interview');
|
|
8
|
+
const {
|
|
9
|
+
parseTimeToDecimal,
|
|
10
|
+
parseDaysArg,
|
|
11
|
+
buildAvailableHours,
|
|
12
|
+
resolveTimezone,
|
|
13
|
+
} = require('./avail');
|
|
14
|
+
const { getAppBaseUrl } = require('../utils/api');
|
|
15
|
+
|
|
16
|
+
const VALUE_FLAGS = [
|
|
17
|
+
'--name',
|
|
18
|
+
'--want',
|
|
19
|
+
'--currency',
|
|
20
|
+
'--username',
|
|
21
|
+
'--wake',
|
|
22
|
+
'--sleep',
|
|
23
|
+
'--where',
|
|
24
|
+
'--tz',
|
|
25
|
+
'--days',
|
|
26
|
+
'--slot-minutes',
|
|
27
|
+
'--window-days',
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const MEET_FIELDS = [
|
|
31
|
+
{ key: 'name', flag: '--name', question: 'who are you?\n> ' },
|
|
32
|
+
{ key: 'want', flag: '--want', question: 'what do you want to make happen?\n> ' },
|
|
33
|
+
{ key: 'currency', flag: '--currency', question: 'what would count as a win in your world?\n> ' },
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
function showHelp() {
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log('usage: atris meet --name <name> --want <want> --currency <win>');
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log('onboard someone in one sitting, write their first profile, and print their /book link.');
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log('options:');
|
|
43
|
+
console.log(' --name text who they are');
|
|
44
|
+
console.log(' --want text what they want');
|
|
45
|
+
console.log(' --currency text what a win looks like');
|
|
46
|
+
console.log(' --username text booking link name, defaults from --name');
|
|
47
|
+
console.log(' --wake time first bookable time, default 9am');
|
|
48
|
+
console.log(' --sleep time last bookable time, default 5pm');
|
|
49
|
+
console.log(' --days days all, weekdays, weekends, or mon,wed,fri');
|
|
50
|
+
console.log('');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function slugify(value, fallback = 'guest') {
|
|
54
|
+
const slug = String(value || '')
|
|
55
|
+
.toLowerCase()
|
|
56
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
57
|
+
.replace(/^-+|-+$/g, '')
|
|
58
|
+
.slice(0, 48);
|
|
59
|
+
return slug || fallback;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function positiveInt(value, fallback) {
|
|
63
|
+
const n = Number.parseInt(value, 10);
|
|
64
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function withQuietOutput(fn) {
|
|
68
|
+
const originalLog = console.log;
|
|
69
|
+
const originalError = console.error;
|
|
70
|
+
console.log = () => {};
|
|
71
|
+
console.error = () => {};
|
|
72
|
+
try {
|
|
73
|
+
return await fn();
|
|
74
|
+
} finally {
|
|
75
|
+
console.log = originalLog;
|
|
76
|
+
console.error = originalError;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function ensureAtrisWorkspace(root) {
|
|
81
|
+
if (fs.existsSync(path.join(root, 'atris'))) return;
|
|
82
|
+
|
|
83
|
+
const originalArgv = process.argv;
|
|
84
|
+
process.argv = [originalArgv[0], originalArgv[1], 'init', '--yes'];
|
|
85
|
+
const cwd = process.cwd();
|
|
86
|
+
process.chdir(root);
|
|
87
|
+
try {
|
|
88
|
+
initAtris();
|
|
89
|
+
} finally {
|
|
90
|
+
process.chdir(cwd);
|
|
91
|
+
process.argv = originalArgv;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function ensureTheme(root) {
|
|
96
|
+
if (fs.existsSync(path.join(root, '.atris', 'theme.json'))) return 0;
|
|
97
|
+
const cwd = process.cwd();
|
|
98
|
+
process.chdir(root);
|
|
99
|
+
try {
|
|
100
|
+
return await themeCommand(['init']);
|
|
101
|
+
} finally {
|
|
102
|
+
process.chdir(cwd);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function buildBookingProfile(options = {}) {
|
|
107
|
+
const wake = options.wake || '9am';
|
|
108
|
+
const sleep = options.sleep || '5pm';
|
|
109
|
+
const wakeDec = parseTimeToDecimal(wake);
|
|
110
|
+
const sleepDec = parseTimeToDecimal(sleep);
|
|
111
|
+
if (!(wakeDec < sleepDec)) throw new Error('wake must be before sleep on the same day');
|
|
112
|
+
|
|
113
|
+
const days = options.days || 'weekdays';
|
|
114
|
+
const dayIndexes = parseDaysArg(days);
|
|
115
|
+
const timezone = resolveTimezone({ tz: options.tz, where: options.where });
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
days,
|
|
119
|
+
wake,
|
|
120
|
+
sleep,
|
|
121
|
+
settings: {
|
|
122
|
+
timezone,
|
|
123
|
+
available_hours: buildAvailableHours(dayIndexes, wakeDec, sleepDec),
|
|
124
|
+
slot_duration_minutes: positiveInt(options.slotMinutes, 30),
|
|
125
|
+
booking_window_days: positiveInt(options.windowDays, 30),
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function renderProfile({ name, want, currency, link, username, booking }) {
|
|
131
|
+
return [
|
|
132
|
+
'# profile',
|
|
133
|
+
'',
|
|
134
|
+
`name: ${name}`,
|
|
135
|
+
`booking link: ${link}`,
|
|
136
|
+
`currency: ${currency}`,
|
|
137
|
+
'',
|
|
138
|
+
'## first wish',
|
|
139
|
+
'',
|
|
140
|
+
`- said: ${want}`,
|
|
141
|
+
`- win means: ${currency}`,
|
|
142
|
+
'',
|
|
143
|
+
'## booking page',
|
|
144
|
+
'',
|
|
145
|
+
`- username: ${username}`,
|
|
146
|
+
`- days: ${booking.days}`,
|
|
147
|
+
`- hours: ${booking.wake} to ${booking.sleep}`,
|
|
148
|
+
`- timezone: ${booking.settings.timezone}`,
|
|
149
|
+
'',
|
|
150
|
+
].join('\n');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function writeMeetFiles(root, profile) {
|
|
154
|
+
const atrisDir = path.join(root, 'atris');
|
|
155
|
+
fs.mkdirSync(atrisDir, { recursive: true });
|
|
156
|
+
fs.writeFileSync(path.join(atrisDir, 'profile.md'), renderProfile(profile), 'utf8');
|
|
157
|
+
|
|
158
|
+
const localConfigDir = path.join(root, '.atris');
|
|
159
|
+
fs.mkdirSync(localConfigDir, { recursive: true });
|
|
160
|
+
fs.writeFileSync(path.join(localConfigDir, 'booking-settings.json'), JSON.stringify({
|
|
161
|
+
username: profile.username,
|
|
162
|
+
link: profile.link,
|
|
163
|
+
settings: profile.booking.settings,
|
|
164
|
+
}, null, 2) + '\n', 'utf8');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async function meetCommand(args = [], root = process.cwd()) {
|
|
168
|
+
if (args.includes('--help') || args.includes('-h') || args[0] === 'help') {
|
|
169
|
+
showHelp();
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const interview = await runPlainInterview({ args, fields: MEET_FIELDS });
|
|
174
|
+
if (!interview.ok) {
|
|
175
|
+
console.error(`meet needs ${interview.missing.join(', ')} when not running in a terminal.`);
|
|
176
|
+
return 2;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const parsed = parseSimpleFlags(args, VALUE_FLAGS);
|
|
180
|
+
const name = interview.answers.name;
|
|
181
|
+
const want = interview.answers.want;
|
|
182
|
+
const currency = interview.answers.currency;
|
|
183
|
+
const username = slugify(parsed.values['--username'] || name);
|
|
184
|
+
const link = `${getAppBaseUrl()}/book/${username}`;
|
|
185
|
+
|
|
186
|
+
let booking;
|
|
187
|
+
try {
|
|
188
|
+
booking = buildBookingProfile({
|
|
189
|
+
wake: parsed.values['--wake'],
|
|
190
|
+
sleep: parsed.values['--sleep'],
|
|
191
|
+
where: parsed.values['--where'],
|
|
192
|
+
tz: parsed.values['--tz'],
|
|
193
|
+
days: parsed.values['--days'],
|
|
194
|
+
slotMinutes: parsed.values['--slot-minutes'],
|
|
195
|
+
windowDays: parsed.values['--window-days'],
|
|
196
|
+
});
|
|
197
|
+
} catch (err) {
|
|
198
|
+
console.error(err.message || String(err));
|
|
199
|
+
return 1;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
await withQuietOutput(async () => {
|
|
203
|
+
ensureAtrisWorkspace(root);
|
|
204
|
+
const themeCode = await ensureTheme(root);
|
|
205
|
+
if (themeCode) throw new Error('theme setup failed');
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
writeMeetFiles(root, { name, want, currency, username, link, booking });
|
|
209
|
+
|
|
210
|
+
console.log(link);
|
|
211
|
+
console.log(`next: share this link; atris will start turning new conversations into ${currency}.`);
|
|
212
|
+
return 0;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
module.exports = {
|
|
216
|
+
meetCommand,
|
|
217
|
+
slugify,
|
|
218
|
+
buildBookingProfile,
|
|
219
|
+
renderProfile,
|
|
220
|
+
};
|