akm-cli 0.10.26101001-alpha → 0.10.26101002-alpha

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
@@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.10.26101002] - 2026-10-10
10
+
11
+ ### Changed
12
+
13
+ - **Triage accepts up to 200 proposals per run by default, up from 25.** The consolidate pair pass stages about 90
14
+ pairs a night on a real stash, so a lower cap let the review queue grow every night. `maxAcceptsPerRun` still bounds
15
+ a run, and `akm proposal drain` uses the same default.
16
+ - **`akm improve <scope>` warns when the scope matches no asset.** A type scope that matches nothing in the stash
17
+ (`akm improve typo`, `improve skills`, `improve memorys`) prints one warning on stderr naming the scope and, for a
18
+ near-miss of a real type, the likely intended one. The exit code and the empty plan are unchanged, and a valid scope
19
+ with nothing eligible does not warn.
20
+
9
21
  ## [0.10.26101001] - 2026-10-10
10
22
 
11
23
  ### Added
package/STABILITY.md CHANGED
@@ -446,7 +446,7 @@ review-first config correctly shows `queue`.
446
446
 
447
447
  A deterministic-only `promote` (triage with judgment off) is **not** a gated
448
448
  lane (#1143): the `default` strategy runs it without the opt-in, bounded by
449
- `maxAcceptsPerRun` (25), through the same deterministic gates as
449
+ `maxAcceptsPerRun` (200), through the same deterministic gates as
450
450
  `akm proposal drain --promote`. Only a promote that turns the judgment tier on
451
451
  needs `experimental.improveAutonomy`.
452
452
 
@@ -12,7 +12,7 @@
12
12
  "extract": { "enabled": false, "triage": { "enabled": true, "minScore": 2 } },
13
13
  "validation": { "enabled": true },
14
14
  "proactiveMaintenance": { "enabled": true, "dueDays": 30, "maxPerRun": 15 },
15
- "triage": { "enabled": true, "applyMode": "promote", "maxAcceptsPerRun": 25 }
15
+ "triage": { "enabled": true, "applyMode": "promote", "maxAcceptsPerRun": 200 }
16
16
  },
17
17
  "sync": { "enabled": true, "push": true }
18
18
  }
@@ -4,6 +4,7 @@
4
4
  /** The refs an improve run may consider, read from the index, and the small predicates over them. */
5
5
  import fs from "node:fs";
6
6
  import path from "node:path";
7
+ import { closestMatch } from "../../cli/unknown-flags.js";
7
8
  import { parseBundleRef } from "../../core/asset/asset-ref.js";
8
9
  import { parseFrontmatter } from "../../core/asset/frontmatter.js";
9
10
  import { conceptIdFromTypeName, parseRefInput, resolveRef, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
@@ -11,6 +12,8 @@ import { loadConfig } from "../../core/config/config.js";
11
12
  import { ConfigError, NotFoundError, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
12
13
  import { isPathAbsent } from "../../core/path-access.js";
13
14
  import { getDbPath } from "../../core/paths.js";
15
+ import { KNOWN_TYPES } from "../../core/recognition-util.js";
16
+ import { warn } from "../../core/warn.js";
14
17
  import { deriveInstallations, deriveWritableBundleIds } from "../../indexer/installations.js";
15
18
  import { resolveSourceEntries } from "../../indexer/search/search-source.js";
16
19
  import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
@@ -210,7 +213,11 @@ async function collectEligibleRefsFromIndex(scope, stashDir, improveProfile, rea
210
213
  indexSnapshot: ready,
211
214
  };
212
215
  }
213
- const entries = getAllEntries(db, scope.mode === "type" ? scope.value : undefined).filter((indexed) => isCandidateBundle(indexed.bundleId));
216
+ const scoped = getAllEntries(db, scope.mode === "type" ? scope.value : undefined);
217
+ if (scope.mode === "type" && scope.value && scope.value !== "any" && scoped.length === 0) {
218
+ warnUnmatchedTypeScope(scope.value, getAllEntries(db));
219
+ }
220
+ const entries = scoped.filter((indexed) => isCandidateBundle(indexed.bundleId));
214
221
  const planned = new Map();
215
222
  const strategyFiltered = new Map();
216
223
  let memoryEligible = 0;
@@ -262,6 +269,12 @@ async function collectEligibleRefsFromIndex(scope, stashDir, improveProfile, rea
262
269
  closeDatabase(db);
263
270
  }
264
271
  }
272
+ /** A type scope that matches no indexed asset: warn on stderr, naming the nearest real type. */
273
+ function warnUnmatchedTypeScope(value, indexed) {
274
+ const types = [...new Set([...KNOWN_TYPES, ...indexed.map((entry) => entry.entry.type)])];
275
+ const suggestion = closestMatch(value, types, Math.max(1, Math.floor(value.length / 3)));
276
+ warn(`Scope "${value}" matches no asset in the stash.${suggestion ? ` Did you mean \`${suggestion}\`?` : ""}`);
277
+ }
265
278
  /** The parent memory a `--scope <memory ref>` cleanup is restricted to. */
266
279
  export function memoryCleanupParentRef(scope, stashDir) {
267
280
  if (scope.mode !== "ref" || !scope.value)
@@ -654,7 +654,7 @@ function buildResultExecutionPlan(run, preparation, collected, dryRun) {
654
654
  enabled: scope.mode !== "ref" && resolvedPlan.processes.triage.enabled,
655
655
  configuredMode: configuredTriage?.applyMode ?? "queue",
656
656
  mode: improveProfile.processes?.triage?.applyMode ?? "queue",
657
- maxAcceptsPerRun: configuredTriage?.maxAcceptsPerRun ?? 25,
657
+ maxAcceptsPerRun: configuredTriage?.maxAcceptsPerRun ?? 200,
658
658
  },
659
659
  });
660
660
  }
@@ -674,7 +674,7 @@ async function runTriagePrePass(run) {
674
674
  ...(options.target ? { target: options.target } : {}),
675
675
  config: options.config,
676
676
  applyMode: triageConfig?.applyMode ?? "queue",
677
- maxAccepts: triageConfig?.maxAcceptsPerRun ?? 25,
677
+ maxAccepts: triageConfig?.maxAcceptsPerRun ?? 200,
678
678
  dryRun: false,
679
679
  excludeIds: new Set(),
680
680
  judgment: resolvedPlan.triageJudgment,
@@ -403,7 +403,7 @@ const proposalDrainCommand = defineJsonCommand({
403
403
  const applyMode = args.promote === true ? "promote" : (triageConfig?.applyMode ?? "queue");
404
404
  const maxAccepts = parsePositiveIntFlag(args["max-accepts"], "--max-accepts") ??
405
405
  triageConfig?.maxAcceptsPerRun ??
406
- 25;
406
+ 200;
407
407
  const rawOlderThan = parsePositiveIntFlag(args["older-than"], "--older-than");
408
408
  const olderThanMs = rawOlderThan !== undefined ? rawOlderThan * 86_400_000 : undefined;
409
409
  // Promotion in promote mode is destructive (commits to git, no batch revert).
@@ -31467,7 +31467,7 @@ var default_default = {
31467
31467
  extract: { enabled: false, triage: { enabled: true, minScore: 2 } },
31468
31468
  validation: { enabled: true },
31469
31469
  proactiveMaintenance: { enabled: true, dueDays: 30, maxPerRun: 15 },
31470
- triage: { enabled: true, applyMode: "promote", maxAcceptsPerRun: 25 }
31470
+ triage: { enabled: true, applyMode: "promote", maxAcceptsPerRun: 200 }
31471
31471
  },
31472
31472
  sync: { enabled: true, push: true }
31473
31473
  };
@@ -30795,7 +30795,7 @@ var default_default = {
30795
30795
  extract: { enabled: false, triage: { enabled: true, minScore: 2 } },
30796
30796
  validation: { enabled: true },
30797
30797
  proactiveMaintenance: { enabled: true, dueDays: 30, maxPerRun: 15 },
30798
- triage: { enabled: true, applyMode: "promote", maxAcceptsPerRun: 25 }
30798
+ triage: { enabled: true, applyMode: "promote", maxAcceptsPerRun: 200 }
30799
30799
  },
30800
30800
  sync: { enabled: true, push: true }
30801
30801
  };
@@ -373,7 +373,7 @@ lane only when its judgment tier is on; see below):
373
373
 
374
374
  A deterministic-only `promote` (triage with judgment off) is not gated (#1143):
375
375
  the `default` strategy drains the queue through the deterministic gates, up to
376
- `maxAcceptsPerRun` (25) per run, with no opt-in. The nightly eval's baseline is
376
+ `maxAcceptsPerRun` (200) per run, with no opt-in. The nightly eval's baseline is
377
377
  exactly this path (`proposal drain --promote` without judgment): 0.91 (terra) and
378
378
  0.89 (qwen) of items solved, 0 to 1 harmed.
379
379
 
@@ -2627,6 +2627,9 @@ ref-scoped improvement. It owns the memory-cleanup and lesson-distillation
2627
2627
  flow. A qualified scope such as `team//skills/code-review` selects that bundle;
2628
2628
  a different explicit `--bundle` is a usage error.
2629
2629
 
2630
+ A type scope that matches no asset in the stash (a misspelt type, say) prints a warning on stderr, with the
2631
+ nearest real type when one is close, and plans nothing; the exit code stays 0.
2632
+
2630
2633
  A run improves one bundle, the one it writes to, and plans only that bundle's
2631
2634
  assets: an asset that lives in another bundle is left alone even when that
2632
2635
  bundle is writable, and a bare ref scope (`akm improve skills/x`) resolves
@@ -497,7 +497,7 @@ guidance. When enabled, engine selection is judgment → triage → strategy →
497
497
  `defaults.llmEngine`, and resolution fails closed if none is available.
498
498
 
499
499
  The `default` strategy runs triage in `promote` mode with judgment off and
500
- `maxAcceptsPerRun: 25` (#1143), so the proposal backlog drains through the
500
+ `maxAcceptsPerRun: 200` (#1143), so the proposal backlog drains through the
501
501
  deterministic gates without `experimental.improveAutonomy`. Turning judgment on
502
502
  in a promote strategy is what that opt-in gates.
503
503
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akm-cli",
3
- "version": "0.10.26101001-alpha",
3
+ "version": "0.10.26101002-alpha",
4
4
  "type": "module",
5
5
  "description": "akm (Agent Knowledge Manager) — a portable, local-first capability library for AI agents. Discover, load, share, and improve reusable skills, scripts, workflows, and knowledge across any shell-capable coding agent, including Claude Code, OpenCode, and Cursor.",
6
6
  "keywords": [