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
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
dejargon,
|
|
5
|
+
hasAgentJargon,
|
|
6
|
+
operatorReady,
|
|
7
|
+
voicePatterns,
|
|
8
|
+
} = require('./autoland');
|
|
9
|
+
|
|
10
|
+
const EM_DASH = /\u2014/;
|
|
11
|
+
const NUMBER_WORDS = [
|
|
12
|
+
'no', 'one', 'two', 'three', 'four', 'five', 'six',
|
|
13
|
+
'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve',
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
function numberWord(n) {
|
|
17
|
+
return NUMBER_WORDS[n] || String(n);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function globalPattern(pattern) {
|
|
21
|
+
const flags = pattern.flags.includes('g') ? pattern.flags : `${pattern.flags}g`;
|
|
22
|
+
return new RegExp(pattern.source, flags);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function findingsFor(text, pattern, rule, why) {
|
|
26
|
+
const findings = [];
|
|
27
|
+
for (const match of String(text || '').matchAll(globalPattern(pattern))) {
|
|
28
|
+
findings.push({ rule, why, snippet: match[0] });
|
|
29
|
+
}
|
|
30
|
+
return findings;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function scanText(text) {
|
|
34
|
+
const value = String(text || '');
|
|
35
|
+
const findings = findingsFor(value, EM_DASH, 'em-dash', 'use plain punctuation');
|
|
36
|
+
if (hasAgentJargon(value)) {
|
|
37
|
+
findings.push(...findingsFor(
|
|
38
|
+
value,
|
|
39
|
+
voicePatterns.agentJargon,
|
|
40
|
+
'agent-jargon',
|
|
41
|
+
'replace internal syntax with plain words',
|
|
42
|
+
));
|
|
43
|
+
}
|
|
44
|
+
findings.push(...findingsFor(
|
|
45
|
+
value,
|
|
46
|
+
voicePatterns.rawUlid,
|
|
47
|
+
'raw-ulid',
|
|
48
|
+
'name the item instead of showing its database id',
|
|
49
|
+
));
|
|
50
|
+
findings.push(...findingsFor(
|
|
51
|
+
value,
|
|
52
|
+
voicePatterns.filePath,
|
|
53
|
+
'file-path',
|
|
54
|
+
'describe the proof instead of exposing an internal file location',
|
|
55
|
+
));
|
|
56
|
+
findings.push(...findingsFor(
|
|
57
|
+
value,
|
|
58
|
+
voicePatterns.shellCommand,
|
|
59
|
+
'shell-command',
|
|
60
|
+
'turn command syntax into a human action',
|
|
61
|
+
));
|
|
62
|
+
return findings;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function cleanEmDashes(text) {
|
|
66
|
+
return String(text || '')
|
|
67
|
+
.replace(/\s*\u2014\s*/g, ', ')
|
|
68
|
+
.replace(/^,\s*/, '')
|
|
69
|
+
.replace(/,\s*$/, '.')
|
|
70
|
+
.replace(/([.!?])\s*,\s*/g, '$1 ')
|
|
71
|
+
.replace(/,\s*([,.;:!?])/g, '$1');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function cleanAfterRemoval(text) {
|
|
75
|
+
return String(text || '')
|
|
76
|
+
.replace(/\(\s*\)/g, '')
|
|
77
|
+
.replace(/\s+([,.;:!?])/g, '$1')
|
|
78
|
+
.replace(/([:;,])\s*([.!?])/g, '$2')
|
|
79
|
+
.replace(/\s{2,}/g, ' ')
|
|
80
|
+
.trim();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function titleCanReplaceId(title) {
|
|
84
|
+
const value = String(title || '').trim();
|
|
85
|
+
return Boolean(value) && (operatorReady(value) || !hasAgentJargon(value));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function gateForHuman(text, opts = {}) {
|
|
89
|
+
let cleaned = cleanEmDashes(text);
|
|
90
|
+
cleaned = dejargon(cleaned, { preserveTickets: true });
|
|
91
|
+
if (titleCanReplaceId(opts.title)) {
|
|
92
|
+
cleaned = cleaned.replace(globalPattern(voicePatterns.rawUlid), '');
|
|
93
|
+
}
|
|
94
|
+
cleaned = cleanAfterRemoval(cleaned);
|
|
95
|
+
const issues = scanText(cleaned);
|
|
96
|
+
return { ok: issues.length === 0, text: cleaned, issues };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const LANDING_PARTICIPLE_WHY = {
|
|
100
|
+
avoiding: 'it avoids',
|
|
101
|
+
cutting: 'it cuts',
|
|
102
|
+
eliminating: 'it eliminates',
|
|
103
|
+
giving: 'it gives',
|
|
104
|
+
keeping: 'it keeps',
|
|
105
|
+
making: 'it makes',
|
|
106
|
+
preventing: 'it prevents',
|
|
107
|
+
reducing: 'it reduces',
|
|
108
|
+
removing: 'it removes',
|
|
109
|
+
saving: 'it saves',
|
|
110
|
+
stopping: 'it stops',
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// A landing sentence written for a human already carries its own why
|
|
114
|
+
// ("..., so operators keep deciding instead of waiting"). Split that clause
|
|
115
|
+
// out so "why it matters" quotes the work instead of a canned line; return
|
|
116
|
+
// null when the sentence has no real why.
|
|
117
|
+
function landingWhyClause(sentence) {
|
|
118
|
+
const text = String(sentence || '').replace(/\s+/g, ' ').trim();
|
|
119
|
+
const finish = (change, why) => {
|
|
120
|
+
const cleanChange = String(change || '').replace(/[,;:]+$/, '').trim();
|
|
121
|
+
const cleanWhy = String(why || '').trim();
|
|
122
|
+
if (!cleanChange || !cleanWhy) return null;
|
|
123
|
+
return {
|
|
124
|
+
change: /[.!?]$/.test(cleanChange) ? cleanChange : `${cleanChange}.`,
|
|
125
|
+
why: /[.!?]$/.test(cleanWhy) ? cleanWhy : `${cleanWhy}.`,
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
const connective = text.match(/^(.{12,}?),?\s+(?:so(?:\s+that)?|because|which means)\s+(.{8,}?)[.!?]?$/i);
|
|
129
|
+
if (connective) return finish(connective[1], connective[2]);
|
|
130
|
+
const participles = Object.keys(LANDING_PARTICIPLE_WHY).join('|');
|
|
131
|
+
const participial = text.match(new RegExp(`^(.{12,}?),\\s+(${participles})\\s+(.{4,}?)[.!?]?$`, 'i'));
|
|
132
|
+
if (participial) {
|
|
133
|
+
return finish(participial[1], `${LANDING_PARTICIPLE_WHY[participial[2].toLowerCase()]} ${participial[3]}`);
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Canned reasons older composers wrote into durable receipts. Treat them as
|
|
139
|
+
// absent so the reader sees the work's own why or nothing at all.
|
|
140
|
+
const RETIRED_FILLER_REASON = new RegExp([
|
|
141
|
+
'^It makes the result understandable before a human accepts or rejects it\\.$',
|
|
142
|
+
'^It proves the workflow works in the place people actually use it\\.$',
|
|
143
|
+
'^It turns the mission into a concrete result a human can accept, reject, or run again\\.$',
|
|
144
|
+
'^It turns the task title into a concrete result the human can approve\\.$',
|
|
145
|
+
'^It gives the human a repeatable check before approval\\.$',
|
|
146
|
+
'^It keeps real-world side effects behind a clear human decision\\.$',
|
|
147
|
+
'^It keeps private data out of the fast human decision screen\\.$',
|
|
148
|
+
'^It lets the operator see the next command without hunting\\.$',
|
|
149
|
+
'^It stops old approvals from running after their context has gone stale\\.$',
|
|
150
|
+
'^This makes the work easier to judge\\.$',
|
|
151
|
+
].join('|'));
|
|
152
|
+
|
|
153
|
+
function isRetiredFillerReason(text) {
|
|
154
|
+
return RETIRED_FILLER_REASON.test(String(text || '').replace(/\s+/g, ' ').trim());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
module.exports = {
|
|
158
|
+
gateForHuman,
|
|
159
|
+
isRetiredFillerReason,
|
|
160
|
+
landingWhyClause,
|
|
161
|
+
numberWord,
|
|
162
|
+
scanText,
|
|
163
|
+
};
|