atris 3.60.0 → 3.62.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 (41) hide show
  1. package/README.md +37 -5
  2. package/atris/skills/engines/SKILL.md +9 -9
  3. package/bin/atris.js +1 -0
  4. package/commands/autoland.js +36 -5
  5. package/commands/autopilot.js +105 -6
  6. package/commands/engine.js +96 -21
  7. package/commands/host.js +56 -4
  8. package/commands/land.js +129 -8
  9. package/commands/member.js +33 -8
  10. package/commands/mission.js +112 -3
  11. package/commands/one-lap.js +14 -10
  12. package/commands/stream.js +56 -22
  13. package/commands/team.js +82 -10
  14. package/commands/worktree.js +39 -0
  15. package/commands/youtube.js +36 -26
  16. package/lib/engine-ask.js +112 -9
  17. package/lib/engine-registry.js +283 -39
  18. package/lib/fleet.js +444 -26
  19. package/lib/functional-owner.js +15 -6
  20. package/lib/host.js +311 -175
  21. package/lib/member-engine.js +11 -1
  22. package/lib/member-park.js +138 -0
  23. package/lib/member-scaffold.js +37 -0
  24. package/lib/roster-markdown.js +1 -1
  25. package/lib/roster-prep.js +289 -0
  26. package/lib/roster-runs.js +389 -0
  27. package/lib/roster-suggest.js +145 -0
  28. package/lib/router-brain.js +111 -3
  29. package/lib/self-drive.js +26 -2
  30. package/lib/state-detection.js +3 -3
  31. package/lib/task-db.js +38 -3
  32. package/lib/team-lineup.js +7 -2
  33. package/lib/todo.js +1 -1
  34. package/lib/wish-audit.js +1 -1
  35. package/package.json +1 -1
  36. package/scripts/det/cpu-hotspots.js +216 -0
  37. package/scripts/det/ytnotes +105 -19
  38. package/scripts/det/ytquote-repair.js +18 -4
  39. package/templates/members/host/MEMBER.md +5 -3
  40. package/templates/members/host/MISSION.md +1 -1
  41. package/templates/members/host/skills/host/SKILL.md +61 -12
@@ -3,6 +3,7 @@
3
3
  const fs = require('fs');
4
4
  const path = require('path');
5
5
  const escapeRegExp = require('./escape-regexp');
6
+ const { isMemberParked } = require('./member-park');
6
7
 
7
8
  const ENGINE_OWNER_IDS = new Set([
8
9
  'atris-2-fast',
@@ -87,11 +88,17 @@ function listWorkspaceMemberSlugs(root) {
87
88
  }
88
89
  }
89
90
 
90
- function firstAvailableFunctionalOwner(candidates, existingMembers) {
91
+ // Members owner inference may pick: every member minus parked ones. An
92
+ // explicit --owner still reaches a parked member.
93
+ function assignableMemberSlugs(root, existingMembers) {
94
+ return new Set([...existingMembers].filter(slug => !isMemberParked(root || process.cwd(), slug)));
95
+ }
96
+
97
+ function firstAvailableFunctionalOwner(candidates, existingMembers, assignable = existingMembers) {
91
98
  for (const candidate of candidates) {
92
99
  const owner = normalizeOwnerSlug(candidate);
93
100
  if (!owner) continue;
94
- if (existingMembers.size === 0 || existingMembers.has(owner)) return owner;
101
+ if (existingMembers.size === 0 || assignable.has(owner)) return owner;
95
102
  }
96
103
  return null;
97
104
  }
@@ -120,6 +127,7 @@ function proposedMemberSlugFromTask({ title, tag }) {
120
127
  function resolveFunctionalOwner({ requestedOwner, title, tag, note, goal, root, fallbackOwners } = {}) {
121
128
  const requested = normalizeOwnerSlug(requestedOwner);
122
129
  const existingMembers = listWorkspaceMemberSlugs(root);
130
+ const assignable = assignableMemberSlugs(root, existingMembers);
123
131
  const highSignalText = [title, note, goal].filter(Boolean).join(' ').toLowerCase();
124
132
  const tagText = tag && tag !== true ? String(tag).toLowerCase() : '';
125
133
  const text = [highSignalText, tagText].filter(Boolean).join(' ');
@@ -144,7 +152,8 @@ function resolveFunctionalOwner({ requestedOwner, title, tag, note, goal, root,
144
152
 
145
153
  const exact = firstAvailableFunctionalOwner(
146
154
  FUNCTIONAL_MEMBER_TOPICS.filter(topic => text.includes(topic.owner)).map(topic => topic.owner),
147
- existingMembers
155
+ existingMembers,
156
+ assignable
148
157
  );
149
158
  if (exact) {
150
159
  const remapped = Boolean(requested && isEngineOwner(requested) && requested !== exact);
@@ -170,7 +179,7 @@ function resolveFunctionalOwner({ requestedOwner, title, tag, note, goal, root,
170
179
  }))
171
180
  .filter(row => row.score > 0)
172
181
  .sort((a, b) => b.score - a.score);
173
- const inferred = firstAvailableFunctionalOwner(scored.map(row => row.owner), existingMembers);
182
+ const inferred = firstAvailableFunctionalOwner(scored.map(row => row.owner), existingMembers, assignable);
174
183
  if (inferred) {
175
184
  const remapped = Boolean(requested && isEngineOwner(requested) && requested !== inferred);
176
185
  return {
@@ -184,8 +193,8 @@ function resolveFunctionalOwner({ requestedOwner, title, tag, note, goal, root,
184
193
  };
185
194
  }
186
195
 
187
- const fallback = firstAvailableFunctionalOwner(fallbackOwners || ['architect', 'task-planner', 'mission-lead', 'validator'], existingMembers)
188
- || Array.from(existingMembers).find(owner => !isEngineOwner(owner))
196
+ const fallback = firstAvailableFunctionalOwner(fallbackOwners || ['architect', 'task-planner', 'mission-lead', 'validator'], existingMembers, assignable)
197
+ || Array.from(assignable).find(owner => !isEngineOwner(owner))
189
198
  || 'architect';
190
199
  const remapped = Boolean(requested && requested !== fallback);
191
200
  return {