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.
Files changed (163) hide show
  1. package/AGENTS.md +35 -0
  2. package/FOR_AGENTS.md +5 -3
  3. package/README.md +5 -3
  4. package/atris/GETTING_STARTED.md +1 -1
  5. package/atris/atris.md +3 -0
  6. package/atris/policies/day-loop-voice.md +102 -0
  7. package/atris/policies/outbound-artifact-gate.md +2 -0
  8. package/atris/skills/design/SKILL.md +56 -32
  9. package/atris/skills/endgame/SKILL.md +12 -6
  10. package/atris/skills/engines/SKILL.md +35 -8
  11. package/atris/skills/fable-method/SKILL.md +66 -0
  12. package/atris/skills/improve/SKILL.md +65 -45
  13. package/atris/skills/render-cli/SKILL.md +88 -0
  14. package/atris/skills/youtube/SKILL.md +10 -1
  15. package/atris.md +6 -2
  16. package/ax +617 -31
  17. package/bin/atris.js +719 -266
  18. package/commands/activate.js +194 -88
  19. package/commands/aeo.js +52 -0
  20. package/commands/agents.js +166 -0
  21. package/commands/autoland.js +718 -72
  22. package/commands/autopilot-front.js +20 -2
  23. package/commands/autopilot.js +118 -2
  24. package/commands/avail.js +407 -0
  25. package/commands/bench.js +188 -0
  26. package/commands/brain.js +3 -0
  27. package/commands/brief.js +651 -0
  28. package/commands/business-sync.js +192 -6
  29. package/commands/business.js +91 -8
  30. package/commands/clean.js +50 -24
  31. package/commands/close.js +1083 -0
  32. package/commands/cloud.js +245 -0
  33. package/commands/codex-goal.js +26 -2
  34. package/commands/compile.js +292 -1
  35. package/commands/computer.js +150 -3
  36. package/commands/dream.js +365 -0
  37. package/commands/drill.js +371 -0
  38. package/commands/drive.js +187 -0
  39. package/commands/engine.js +1061 -29
  40. package/commands/experiments.js +28 -0
  41. package/commands/feed.js +202 -0
  42. package/commands/feedback.js +34 -12
  43. package/commands/fleet-report.js +206 -0
  44. package/commands/github.js +38 -0
  45. package/commands/gm.js +285 -3
  46. package/commands/goal.js +247 -0
  47. package/commands/improve.js +642 -26
  48. package/commands/init.js +83 -43
  49. package/commands/integrations.js +39 -11
  50. package/commands/interview.js +209 -0
  51. package/commands/land.js +253 -52
  52. package/commands/lesson.js +112 -1
  53. package/commands/lifecycle.js +39 -3
  54. package/commands/linear.js +38 -0
  55. package/commands/log.js +84 -1
  56. package/commands/loops.js +220 -16
  57. package/commands/meet.js +220 -0
  58. package/commands/member.js +899 -66
  59. package/commands/mission.js +3512 -332
  60. package/commands/next.js +137 -0
  61. package/commands/now.js +240 -21
  62. package/commands/one-lap.js +776 -0
  63. package/commands/orb.js +314 -0
  64. package/commands/pack-craft.js +179 -0
  65. package/commands/pack.js +823 -0
  66. package/commands/play.js +3 -2
  67. package/commands/probe.js +30 -3
  68. package/commands/pulse.js +241 -46
  69. package/commands/push.js +260 -82
  70. package/commands/radar.js +259 -14
  71. package/commands/rainmaker.js +49 -0
  72. package/commands/report.js +415 -0
  73. package/commands/scout.js +147 -0
  74. package/commands/search.js +363 -0
  75. package/commands/serve.js +54 -0
  76. package/commands/skill.js +47 -3
  77. package/commands/slop.js +50 -2
  78. package/commands/soul.js +1 -1
  79. package/commands/status.js +50 -5
  80. package/commands/stream.js +861 -0
  81. package/commands/stripe.js +38 -0
  82. package/commands/study.js +693 -0
  83. package/commands/supabase.js +39 -0
  84. package/commands/sync.js +67 -54
  85. package/commands/task.js +2275 -182
  86. package/commands/team.js +73 -0
  87. package/commands/truth.js +29 -3
  88. package/commands/unknowns.js +627 -0
  89. package/commands/update.js +44 -0
  90. package/commands/vercel.js +38 -0
  91. package/commands/verify.js +96 -0
  92. package/commands/watch.js +303 -0
  93. package/commands/wish.js +500 -0
  94. package/commands/workflow.js +11 -5
  95. package/commands/worktree.js +299 -20
  96. package/commands/write.js +399 -0
  97. package/commands/xp.js +29 -11
  98. package/lib/auto-accept-certified.js +391 -43
  99. package/lib/autoland.js +353 -52
  100. package/lib/ax-auto-lane.js +79 -0
  101. package/lib/bench/context.js +147 -0
  102. package/lib/bench/engines.js +141 -0
  103. package/lib/bench/report.js +140 -0
  104. package/lib/bench/runner.js +512 -0
  105. package/lib/brief-ledger.js +350 -0
  106. package/lib/cloud-mission.js +259 -0
  107. package/lib/codex-flight.js +154 -0
  108. package/lib/default-runner.js +45 -0
  109. package/lib/default-verifier.js +70 -0
  110. package/lib/engine-registry.js +232 -0
  111. package/lib/experiments/daily.js +640 -0
  112. package/lib/fleet.js +2431 -38
  113. package/lib/improve-vitals-html.js +171 -0
  114. package/lib/known-commands.js +58 -0
  115. package/lib/loop-doctor.js +416 -0
  116. package/lib/member-switches.js +144 -0
  117. package/lib/memory-view.js +14 -5
  118. package/lib/mission-room.js +1 -0
  119. package/lib/mission-root.js +52 -0
  120. package/lib/mission-runtime-loop.js +7 -0
  121. package/lib/next-moves.js +327 -10
  122. package/lib/official-cli-integration.js +174 -0
  123. package/lib/one-lap-validator.js +60 -0
  124. package/lib/orb-context.js +477 -0
  125. package/lib/orb-scorecard.js +224 -0
  126. package/lib/outbound-send-gate.js +165 -0
  127. package/lib/permission-grants.js +293 -0
  128. package/lib/policy-lessons.js +52 -1
  129. package/lib/pulse.js +277 -3
  130. package/lib/receipt-block.js +168 -0
  131. package/lib/receipt-evidence.js +65 -4
  132. package/lib/review-integrity.js +147 -0
  133. package/lib/router-brain.js +352 -0
  134. package/lib/runner-command.js +33 -0
  135. package/lib/self-drive.js +258 -0
  136. package/lib/short-name.js +103 -0
  137. package/lib/spawn-env.js +18 -0
  138. package/lib/state-detection.js +56 -1
  139. package/lib/sync-status.js +59 -0
  140. package/lib/task-db.js +319 -27
  141. package/lib/task-proof.js +43 -1
  142. package/lib/task-receipt.js +93 -0
  143. package/lib/team-presence.js +260 -0
  144. package/lib/tool-result-encode.js +7 -0
  145. package/lib/trust-tiers.js +90 -0
  146. package/lib/usage.js +107 -0
  147. package/lib/voice-gate.js +163 -0
  148. package/lib/wish-audit.js +1368 -0
  149. package/lib/wish-delegate.js +1840 -0
  150. package/lib/wish-design.js +110 -0
  151. package/lib/wish-stats.js +183 -0
  152. package/lib/wish-store.js +354 -0
  153. package/lib/zip.js +221 -0
  154. package/package.json +3 -1
  155. package/templates/loops/atris/loops/LOOPS.md +55 -0
  156. package/templates/loops/atris/loops/TICK.md +24 -0
  157. package/templates/loops/atris/loops/feedback.md +22 -0
  158. package/templates/loops/atris/loops/quality.md +22 -0
  159. package/templates/loops/atris/wiki/systems/loops.md +41 -0
  160. package/utils/api.js +5 -1
  161. package/utils/auth.js +57 -21
  162. package/utils/update-check.js +27 -6
  163. package/atris/learnings.jsonl +0 -1
@@ -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 ever · blocked = failing now`);
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