@phnx-labs/agents-cli 1.22.32 → 1.22.33

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.22.33
4
+
5
+ - **Release tags are annotated with the folded changelog notes.** `scripts/release.sh` now creates `v<version>` as an annotated tag whose message is `Release <version>` plus the body of `.changelog/<version>.md` (the same notes that already become the release PR body). Agents keep writing one fragment under `.changelog/next/`; there is no separate tag-description channel. The already-published missing-tag recovery path uses the same helper with `--force`. Source: `apps/cli/scripts/release.sh`.
6
+
7
+ `agents sessions --routines` once again opens the routine picker across every working directory instead of an empty current-repository session browser.
8
+
3
9
  ## 1.22.32
4
10
 
5
11
  - **Routines validate execution context before activation and fire once per schedule slot (RUSH-2290).** A routine selects one execution `project` plus a portable `cwd`; add/edit save proven blockers paused, durable slot and active-run claims prevent duplicate or overlapping launches, and every blocked/skipped/pre-spawn attempt remains visible without requiring a session transcript. Source: `apps/cli/src/lib/routine-context.ts`, `apps/cli/src/lib/routine-readiness.ts`, `apps/cli/src/lib/runner.ts`.
package/dist/bin/agents CHANGED
Binary file
@@ -18,7 +18,7 @@ import { discoverSessions } from '../lib/session/discover.js';
18
18
  import { gatherRemoteList } from '../lib/session/remote-list.js';
19
19
  import { resolveVersionAliasLoose } from '../lib/versions.js';
20
20
  import { AGENTS } from '../lib/agents.js';
21
- import { enrichTeamOrigins, safeTeamText } from '../lib/session/team-filter.js';
21
+ import { enrichTeamOrigins, safeTeamText, shouldShowTeamSessions } from '../lib/session/team-filter.js';
22
22
  import { listBookmarks, toggleBookmark } from '../lib/session/bookmarks.js';
23
23
  import { machineId, normalizeHost } from '../lib/session/sync/config.js';
24
24
  import { buildPreview } from './sessions-picker.js';
@@ -280,7 +280,7 @@ async function fetchRawPool(f, self, local, hosts, fixedFilters = false) {
280
280
  origin: f.routine ? 'routine' : undefined,
281
281
  skill: f.skill,
282
282
  plugin: f.plugin,
283
- excludeTeamOrigin: !f.teams,
283
+ excludeTeamOrigin: !shouldShowTeamSessions(f),
284
284
  // A team filter reaches back past the usual browse window, so the pool it
285
285
  // draws from has to as well — otherwise the newest 500 rows decide which
286
286
  // teams exist.
@@ -33,7 +33,7 @@ import { stringWidth, truncateToWidth, padToWidth, terminalWidth } from '../lib/
33
33
  import { inferSessionState } from '../lib/session/state.js';
34
34
  import { discoverSessions, queryIndexedSessions, countSessionsInScope, resolveSessionById, isCompleteSessionId, looksLikeSessionId, searchContentIndex, getSessionRoots, scopeToManaged } from '../lib/session/discover.js';
35
35
  import { findSessionsById, querySessions, getSessionById } from '../lib/session/db.js';
36
- import { filterTeamSessions, safeTeamText, groupSessionsByTeam, NO_TEAM_GROUP_KEY, } from '../lib/session/team-filter.js';
36
+ import { filterTeamSessions, shouldShowTeamSessions, safeTeamText, groupSessionsByTeam, NO_TEAM_GROUP_KEY, } from '../lib/session/team-filter.js';
37
37
  import { parseSession } from '../lib/session/parse.js';
38
38
  import { runRemoteSessions, buildForwardedArgs, ensureWholeIndex } from '../lib/session/remote.js';
39
39
  import { formatRelativeTime, formatCompactAge, sessionAgeParts } from '../lib/session/relative-time.js';
@@ -1520,6 +1520,11 @@ export function hasNoBrowserDisqualifyingFlags(options, query) {
1520
1520
  !options.skill &&
1521
1521
  !options.plugin &&
1522
1522
  !options.sort &&
1523
+ // --routine without a name owns a two-stage picker (routine -> run ->
1524
+ // session), and a named routine owns the run-grouped overview. The generic
1525
+ // browser can only flatten routine sessions into its ordinary row list, so
1526
+ // routing this flag there silently bypasses both routine-specific views.
1527
+ !options.routine &&
1523
1528
  !options.artifacts &&
1524
1529
  options.artifact === undefined &&
1525
1530
  // --cloud lists a provider's tasks, not the transcript index, and
@@ -2293,6 +2298,11 @@ limitSource) {
2293
2298
  // silently returns nothing for any team older than that — so the flag widens its
2294
2299
  // own scope, the way --all does, unless the caller set an explicit --limit.
2295
2300
  const wantsWholeTeam = !!options.inTeam;
2301
+ // A routine is not tied to the shell's cwd: its archived sessions retain the
2302
+ // working directory in which the scheduled agent actually ran. Scope the
2303
+ // routine catalog across directories so invoking it from ~/.agents/.system,
2304
+ // a project repo, or $HOME yields the same routine history.
2305
+ const wantsWholeRoutine = !!options.routine;
2296
2306
  // `--limit` has a commander default, so an untouched flag still arrives as a
2297
2307
  // string and truthiness can't tell it from a typed one. Commander records where
2298
2308
  // each value came from, which is the only signal that distinguishes an explicit
@@ -2301,7 +2311,7 @@ limitSource) {
2301
2311
  const userSetLimit = limitSource === 'cli' || limitSource === 'env';
2302
2312
  const limit = wantsOverview
2303
2313
  ? OVERVIEW_POOL_LIMIT
2304
- : parseInt(userSetLimit ? options.limit : wantsWholeTeam ? String(WHOLE_TEAM_POOL_LIMIT) : DEFAULT_LIMIT, 10);
2314
+ : parseInt(userSetLimit ? options.limit : wantsWholeTeam || wantsWholeRoutine ? String(WHOLE_TEAM_POOL_LIMIT) : DEFAULT_LIMIT, 10);
2305
2315
  if (toolEvidenceMode && (!Number.isSafeInteger(limit) || limit < 1 || limit > TOOL_QUERY_MAX_RESULT_SESSIONS)) {
2306
2316
  console.error(chalk.red(`Tool search --limit must be from 1 to ${TOOL_QUERY_MAX_RESULT_SESSIONS}.`));
2307
2317
  process.exitCode = 1;
@@ -2311,7 +2321,7 @@ limitSource) {
2311
2321
  // --since still narrows. Non-overview keeps the prior interactive-30d default.
2312
2322
  const since = wantsOverview
2313
2323
  ? options.since
2314
- : (options.since ?? (isInteractive && !options.all && !wantsWholeTeam ? '30d' : undefined));
2324
+ : (options.since ?? (isInteractive && !options.all && !wantsWholeTeam && !wantsWholeRoutine ? '30d' : undefined));
2315
2325
  const toolSpansDevices = toolEvidenceMode
2316
2326
  && (options.fleet || (options.host?.length ?? 0) > 0);
2317
2327
  const toolSortError = toolSearchFleetSortError(options.sort, toolSpansDevices);
@@ -2335,12 +2345,12 @@ limitSource) {
2335
2345
  // --in-team spans directories by construction: a team's teammates run in
2336
2346
  // their own worktrees, so scoping to the current cwd hides most of the
2337
2347
  // lineage the flag exists to show.
2338
- all: pathFilter ? undefined : options.all || wantsWholeTeam || toolSpansDevices,
2348
+ all: pathFilter ? undefined : options.all || wantsWholeTeam || wantsWholeRoutine || toolSpansDevices,
2339
2349
  cwd: process.cwd(),
2340
2350
  // Default overview scopes to the current repo SUBTREE (prefix match), so a
2341
2351
  // monorepo shows its sub-projects grouped instead of collapsing to the one
2342
2352
  // exact-cwd project. `--all` clears the prefix and spans the whole index.
2343
- cwdPrefix: pathFilter ?? (wantsOverview && !options.all && !wantsWholeTeam && !toolSpansDevices ? process.cwd() : undefined),
2353
+ cwdPrefix: pathFilter ?? (wantsOverview && !options.all && !wantsWholeTeam && !wantsWholeRoutine && !toolSpansDevices ? process.cwd() : undefined),
2344
2354
  project: options.project,
2345
2355
  since,
2346
2356
  until: options.until,
@@ -2373,7 +2383,7 @@ limitSource) {
2373
2383
  const readOptions = {
2374
2384
  ...scope,
2375
2385
  limit,
2376
- excludeTeamOrigin: !options.teams,
2386
+ excludeTeamOrigin: !shouldShowTeamSessions(options),
2377
2387
  onProgress: tracker.onProgress,
2378
2388
  includeUnmanaged: options.unmanaged,
2379
2389
  onHiddenUnmanaged: (n) => { hiddenUnmanaged = n; },
@@ -2390,7 +2400,7 @@ limitSource) {
2390
2400
  // meta.json in ~/.agents/teams/agents whose is_team_origin flag was
2391
2401
  // never set (legacy rows). Keep the in-memory pass so those are still
2392
2402
  // enriched/hidden.
2393
- const { visible: visibleSessions } = filterTeamSessions(sessions, !!options.teams);
2403
+ const { visible: visibleSessions } = filterTeamSessions(sessions, shouldShowTeamSessions(options));
2394
2404
  sessions = visibleSessions;
2395
2405
  // --in-team spans both ends of the lineage, so it can't be one SQL predicate:
2396
2406
  // the orchestrator matches on the scan-derived `spawnedTeam` column, while a
@@ -2458,7 +2468,7 @@ limitSource) {
2458
2468
  }
2459
2469
  // Under --in-team the visible list is one team, so the whole-index team-origin
2460
2470
  // count would be a non-sequitur next to it.
2461
- const hiddenCount = options.teams || options.inTeam
2471
+ const hiddenCount = shouldShowTeamSessions(options) || options.inTeam
2462
2472
  ? 0
2463
2473
  : countSessionsInScope({ ...scope, onlyTeamOrigin: true });
2464
2474
  // A typed routine scope must apply before smart ID routing. Otherwise an ID
@@ -4607,9 +4617,9 @@ export function registerSessionsCommands(program) {
4607
4617
  # teammate row [<team>/<handle>]. --in-team narrows to one team's lineage.
4608
4618
  agents sessions --in-team redesign --teams
4609
4619
 
4610
- # Show routine-run sessions and open one by routine run id
4611
- agents sessions --routine --all
4612
- agents sessions --routine nightly-review --all
4620
+ # Pick a routine across every directory, then open one of its run sessions
4621
+ agents sessions --routine
4622
+ agents sessions --routine nightly-review
4613
4623
  agents sessions 2026-07-21T10-30-00-000Z
4614
4624
 
4615
4625
  # Export for analysis
@@ -4657,7 +4667,7 @@ export function registerSessionsCommands(program) {
4657
4667
  - --first and --last are mutually exclusive.
4658
4668
  - A filter flag (--include/--exclude/--first/--last) without --markdown/--json defaults to --markdown output.
4659
4669
  - --cloud sources from Rush Cloud captured runs instead of local disk.
4660
- - --routine [name] shows transcripts archived from routine runs. On a TTY, omit the name to pick a routine; a name accepts exact, substring, or unambiguous typo matches. --routines is an alias. Routine rows also resolve by run id.
4670
+ - --routine [name] spans every directory and shows transcripts archived from routine runs. On a TTY, omit the name to pick a routine; a name accepts exact, substring, or unambiguous typo matches. --routines is an alias. Routine rows also resolve by run id.
4661
4671
  - Without --teams, team-spawned sessions are hidden by default.
4662
4672
  `,
4663
4673
  });
@@ -44,6 +44,17 @@ export interface FilterResult {
44
44
  visible: SessionMeta[];
45
45
  hiddenCount: number;
46
46
  }
47
+ /**
48
+ * Whether a listing scope must retain team-origin sessions.
49
+ *
50
+ * A routine owns every session produced during its run, including teammates and
51
+ * SDK-launched children. Requiring callers to add `--teams` would make a routine
52
+ * catalog incomplete and can make team-heavy routines appear to have no runs.
53
+ */
54
+ export declare function shouldShowTeamSessions(filters: {
55
+ teams?: boolean;
56
+ routine?: boolean | string;
57
+ }): boolean;
47
58
  /**
48
59
  * Split `sessions` into visible and hidden (team-origin) groups.
49
60
  * When `showTeams` is true every session is visible and `teamOrigin` is
@@ -142,6 +142,16 @@ export function enrichTeamOrigins(sessions) {
142
142
  return origin ? { ...session, teamOrigin: origin } : session;
143
143
  });
144
144
  }
145
+ /**
146
+ * Whether a listing scope must retain team-origin sessions.
147
+ *
148
+ * A routine owns every session produced during its run, including teammates and
149
+ * SDK-launched children. Requiring callers to add `--teams` would make a routine
150
+ * catalog incomplete and can make team-heavy routines appear to have no runs.
151
+ */
152
+ export function shouldShowTeamSessions(filters) {
153
+ return !!filters.teams || !!filters.routine;
154
+ }
145
155
  /**
146
156
  * Split `sessions` into visible and hidden (team-origin) groups.
147
157
  * When `showTeams` is true every session is visible and `teamOrigin` is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phnx-labs/agents-cli",
3
- "version": "1.22.32",
3
+ "version": "1.22.33",
4
4
  "description": "One CLI for all your AI coding agents - versions, config, cloud dispatch, sessions, and teams (now with first-class Grok Build CLI support)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",