@on-par/factory-cli 0.9.17-next.1 → 0.9.17-next.11

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 (70) hide show
  1. package/dist/cli/doctor-agent-memory.d.ts +5 -0
  2. package/dist/cli/doctor-agent-memory.d.ts.map +1 -0
  3. package/dist/cli/doctor-agent-memory.js +19 -0
  4. package/dist/cli/doctor-agent-memory.js.map +1 -0
  5. package/dist/cli/doctor-failover-providers.d.ts +8 -0
  6. package/dist/cli/doctor-failover-providers.d.ts.map +1 -0
  7. package/dist/cli/doctor-failover-providers.js +76 -0
  8. package/dist/cli/doctor-failover-providers.js.map +1 -0
  9. package/dist/cli/doctor.d.ts.map +1 -1
  10. package/dist/cli/doctor.js +4 -1
  11. package/dist/cli/doctor.js.map +1 -1
  12. package/dist/cli/index.d.ts +6 -3
  13. package/dist/cli/index.d.ts.map +1 -1
  14. package/dist/cli/index.js +27 -36
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/json-contract.d.ts +87 -0
  17. package/dist/cli/json-contract.d.ts.map +1 -1
  18. package/dist/cli/json-contract.js +65 -0
  19. package/dist/cli/json-contract.js.map +1 -1
  20. package/dist/cli/kpi-sweep.js +1 -1
  21. package/dist/cli/kpi-sweep.js.map +1 -1
  22. package/dist/cli/lane-pause.d.ts +7 -0
  23. package/dist/cli/lane-pause.d.ts.map +1 -1
  24. package/dist/cli/lane-pause.js +26 -0
  25. package/dist/cli/lane-pause.js.map +1 -1
  26. package/dist/cli/model-override-messages.d.ts +3 -1
  27. package/dist/cli/model-override-messages.d.ts.map +1 -1
  28. package/dist/cli/model-override-messages.js +12 -0
  29. package/dist/cli/model-override-messages.js.map +1 -1
  30. package/dist/cli/orphan-draft-sweep.d.ts +6 -0
  31. package/dist/cli/orphan-draft-sweep.d.ts.map +1 -0
  32. package/dist/cli/orphan-draft-sweep.js +24 -0
  33. package/dist/cli/orphan-draft-sweep.js.map +1 -0
  34. package/dist/cli/program-queue.d.ts.map +1 -1
  35. package/dist/cli/program-queue.js +5 -3
  36. package/dist/cli/program-queue.js.map +1 -1
  37. package/dist/cli/queue-startup.d.ts +79 -0
  38. package/dist/cli/queue-startup.d.ts.map +1 -1
  39. package/dist/cli/queue-startup.js +8 -0
  40. package/dist/cli/queue-startup.js.map +1 -1
  41. package/dist/cli/ready-check.d.ts +55 -14
  42. package/dist/cli/ready-check.d.ts.map +1 -1
  43. package/dist/cli/ready-check.js +121 -53
  44. package/dist/cli/ready-check.js.map +1 -1
  45. package/dist/cli/repo-router.d.ts +2 -0
  46. package/dist/cli/repo-router.d.ts.map +1 -1
  47. package/dist/cli/repo-router.js +5 -0
  48. package/dist/cli/repo-router.js.map +1 -1
  49. package/dist/cli/run-lane.d.ts.map +1 -1
  50. package/dist/cli/run-lane.js +13 -1
  51. package/dist/cli/run-lane.js.map +1 -1
  52. package/dist/cli/run.d.ts +1 -0
  53. package/dist/cli/run.d.ts.map +1 -1
  54. package/dist/cli/run.js +7 -1
  55. package/dist/cli/run.js.map +1 -1
  56. package/dist/cli/ship-steps.d.ts.map +1 -1
  57. package/dist/cli/ship-steps.js +5 -0
  58. package/dist/cli/ship-steps.js.map +1 -1
  59. package/dist/cli/ship.js +3 -2
  60. package/dist/cli/ship.js.map +1 -1
  61. package/dist/cli/status.js +1 -1
  62. package/dist/cli/status.js.map +1 -1
  63. package/dist/cli/usage-json.d.ts +11 -2
  64. package/dist/cli/usage-json.d.ts.map +1 -1
  65. package/dist/cli/usage-json.js +20 -2
  66. package/dist/cli/usage-json.js.map +1 -1
  67. package/package.json +4 -4
  68. package/schemas/check.schema.json +305 -0
  69. package/schemas/logs-line.schema.json +5 -0
  70. package/schemas/usage.schema.json +6 -1
package/dist/cli/index.js CHANGED
@@ -8,11 +8,11 @@ import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:pat
8
8
  import { promisify, styleText } from 'node:util';
9
9
  import { LaneEnvironmentPauseError } from './lane-environment-pause-error.js';
10
10
  import { INVALID_BRANCH_PREFIX_MESSAGE, resolveBranchPrefixOption } from './branch-prefix.js';
11
- import { sweepLaneClaims, warnQueueDiagnostics } from './queue-startup.js';
11
+ import { startupSweeps, warnQueueDiagnostics } from './queue-startup.js';
12
12
  import { proposeTriageQueue } from './triage-open-prs.js';
13
13
  import { makeQueuePreflightOps, preflightQueuedIssue, } from './queue-preflight.js';
14
14
  import { acquirePortLease, aggregateCosts, appendKpiHistoryLine, applyRepoConfig, buildPhase, checkPhase, clearProxyState, computeHealthKpis, ConstitutionLoader, createDefaultWorkSourceRegistry, createLogger, createLaneProxy, defaultFindPortListeners, describeEffectiveConfig, detectPostMergeDefects, diagnoseModels, probeDeclaredHarnesses, estimateTrailingSpend, fetchDefectSources, fetchSubscriptionUsage, formatUsageReport, getConstitutionsDir, getFactoryPaths, GITHUB_ISSUE_SOURCE, hasUnresolvedPark, InvalidArtifactsDirError, InvalidWorkRequestInputError, InvalidWorkspaceError, isCommandAvailable, isProxyRunning, kpiBranchPrefixes, kpisToHistoryRecord, laneBaseUrl, laneEnv, laneHostLabel, loadFactoryConfigForRepo, loadModelsConfig, loadRepoConfig, loadRoutesConfig, LOCAL_BRIEF_SOURCE, joinClassifierOutcomes, mergeClassifierOutcomes, parseClassifierOutcomes, summarizeClassifierOutcomes, formatClassifierReport, mergedPrRefs, ModelRegistry, ModelRouter, parkReasonFor, parseKpiHistory, parseQueue, planPhase, readEvents, readPortLeases, readQueue, readUsage, reapOrphanProcesses, reconstructKpiEvents, recordLeasePgid, releasePortLease, renderKpiReport, renderKpiTrend, resolveDefectWindowDays, parseSizeGateMode, parseMaxSlices, SIZE_GATE_MODES, resolveEffectiveModelPins, resolveEnvironmentProxy, resolveArtifactsDir, resolveLocalOnlyPolicy, resolveMergePolicy, resolveSkipCI, resolveTimeouts, resolveUsageCap, resolveWatchdogPolicy, runAutoIngest, shipPhase, formatCostTotal, validateQueue, watchUsage, writeLocalRunReport, writeProxyState, } from '@on-par/factory-core';
15
- import { acquirePidFile, createCheckResumeStore, DEFAULT_GARDEN_MAX_CLUSTERS, DEFAULT_GARDEN_SINCE, capGardenClusters, clusterGarden, dedupGardenClusters, filterGardenOnlyNew, filterGardenWindow, markGardenTrackingUnknown, parseGardenDuration, readHarvestEvents, renderGardenJson, renderGardenReport, laneWorktreePath, migrateRepoConfigToYaml, readRepoConfigFile, rewriteRepoConfigFile, REPO_CONFIG_YAML_HEADER, claudeConfigDirOverride, claudeKeychainService, cleanupWorktree, createDaemonLogSink, factoryBranchIssue, factoryBranchPrefixes, createFactorydServer, createRunRuntime, createShipExecutor, createGithubQueue, createLocalSmallDryRun, createOctokitFilingClient, createOctokitGreenPrClient, createOctokitQueueClient, daemonRuntimePaths, defaultRegistryPath, ensureDir, fetchHumanEventSourcesCached, FACTORY_RUNTIME_CONFIG_KEYS, findUnmergedGreenPrs, listStatelessLaneIssues, formatGcReport, gitFetch, listMicroVms, listOrphanContainers, logCost, logEvent, planQueueMigration, pollBlockedParks, readCosts, readGithubQueueSnapshot, reapCleanShipWorktree, reapLaneWorktree, reapOrphanContainers, reapOrphanMicroVm, releaseRuntimeFiles, releaseStaleClaims, resolveBranchPrefix, resolveEffectiveConfig, resolveExperimental, resolveLocalOnly, describeDraftPrPolicy, resolveDraftPrPolicy, resolvePrClassifierPolicy, resolveReviewFloorRules, RunLockHeldError, runOvernightQueue, parseRemoteSlug, setupWorktree, shellEscape, listBuiltInCheckers, sweepWorktrees, watchChecks, withFileLock, withGitLock, withRunLock, writePortFile, buildTriagePrompt, parseTriageCandidates, recordLocalAuthFailure, laneSlug, formatStopMarker, readStopMarker, } from '@on-par/factory-core/internal';
15
+ import { acquirePidFile, createCheckResumeStore, DEFAULT_GARDEN_MAX_CLUSTERS, DEFAULT_GARDEN_SINCE, capGardenClusters, clusterGarden, dedupGardenClusters, filterGardenOnlyNew, filterGardenWindow, markGardenTrackingUnknown, parseGardenDuration, readHarvestEvents, renderGardenJson, renderGardenReport, laneWorktreePath, migrateRepoConfigToYaml, readRepoConfigFile, rewriteRepoConfigFile, REPO_CONFIG_YAML_HEADER, claudeConfigDirOverride, claudeKeychainService, cleanupWorktree, createDaemonLogSink, factoryBranchIssue, factoryBranchPrefixes, createFactorydServer, createRunRuntime, createShipExecutor, createGithubQueue, createLocalSmallDryRun, createOctokitFilingClient, createOctokitGreenPrClient, createOctokitQueueClient, daemonRuntimePaths, defaultRegistryPath, ensureDir, fetchHumanEventSourcesCached, FACTORY_RUNTIME_CONFIG_KEYS, findUnmergedGreenPrs, listStatelessLaneIssues, formatGcReport, gitFetch, listMicroVms, listOrphanContainers, logCost, logEvent, planQueueMigration, pollBlockedParks, readCosts, readGithubQueueSnapshot, reapCleanShipWorktree, reapLaneWorktree, reapOrphanContainers, reapOrphanMicroVm, releaseRuntimeFiles, releaseStaleClaims, resolveBranchPrefix, resolveEffectiveConfig, resolveExperimental, resolveLocalOnly, describeDraftPrPolicy, resolveDraftPrPolicy, resolvePrClassifierPolicy, resolveReviewFloorRules, RunLockHeldError, runOvernightQueue, parseRemoteSlug, setupWorktree, shellEscape, listBuiltInCheckers, sweepWorktrees, watchChecks, withFileLock, withGitLock, withRunLock, writePortFile, buildTriagePrompt, parseTriageCandidates, laneSlug, formatStopMarker, readStopMarker, detectClaudePlan, } from '@on-par/factory-core/internal';
16
16
  import { formatSteerabilityReport } from '@on-par/factory-core/internal';
17
17
  import { runTui } from '@on-par/factory-tui';
18
18
  import { clearSelfUpdateStop } from './self-update-stop.js';
@@ -42,7 +42,7 @@ import { buildRunsJson, parseRunsLimit } from './runs.js';
42
42
  import { buildRunDiffstatJson, NoRunError, parseDiffstatIssue } from './runs-diffstat.js';
43
43
  import { formatUpdateStartupLine, initialUpdateState, readUpdateState, updateStatePath, writeUpdateState, } from './update-state.js';
44
44
  import { buildStopResumeJson } from './stop-resume-json.js';
45
- import { buildUsageJson } from './usage-json.js';
45
+ import { collectUsageJson } from './usage-json.js';
46
46
  import { parseResetIssues, runReset } from './reset.js';
47
47
  import { cmdDaemonLogs, cmdDaemonStart, cmdDaemonStatus, cmdDaemonStop, createAutoUpdateDeps, DaemonCtlError, detectInstall, loadDaemonFileConfig, recoverStaleDrain, resolveFactorydConfig, runAutoUpdateLoop, } from './daemon.js';
48
48
  import { checkForUpdate, cmdSelfUpdateCheck } from './self-update.js';
@@ -56,12 +56,12 @@ import { cmdRisk } from './risk.js';
56
56
  import { buildFeedbackDeps, resolveFeedbackRepo, runFeedback } from './feedback.js';
57
57
  import { ensureFactoryExcluded, writeSampleQueue } from './init-files.js';
58
58
  import { detectChecksForInit } from './detect-checks.js';
59
- import { newRepoRouter } from './repo-router.js';
59
+ import { applyRouterGuards, newRepoRouter } from './repo-router.js';
60
60
  import { cmdLogs } from './logs.js';
61
61
  import { mergeScopeNotice } from './merge-scope.js';
62
62
  import { selectOctokit } from './github-stub.js';
63
63
  import { createFactoryOctokit } from './octokit.js';
64
- import { DeepCheckError, createDeepModelRunner, runIssueCheck } from './ready-check.js';
64
+ import { checkErrorExit, checkReportExit, createDeepModelRunner, runIssueCheck } from './ready-check.js';
65
65
  import { childRunSucceeded, formatChildRunSummary, runChildrenInOrder } from './run-children.js';
66
66
  import { readRunFlagOverrides, recordDraftPrFlag } from './run-flags.js';
67
67
  import { runStalenessGuard } from './staleness.js';
@@ -175,6 +175,7 @@ const DEFAULT_CORE_OPS = {
175
175
  formatUsageReport,
176
176
  watchUsage,
177
177
  fetchSubscriptionUsage,
178
+ detectClaudePlan,
178
179
  diagnoseModels,
179
180
  probeDeclaredHarnesses,
180
181
  writeLocalRunReport,
@@ -194,6 +195,7 @@ function resolveCoreOps(overrides, base = coreOps) {
194
195
  formatUsageReport: overrides.formatUsageReport ?? base.formatUsageReport,
195
196
  watchUsage: overrides.watchUsage ?? base.watchUsage,
196
197
  fetchSubscriptionUsage: overrides.fetchSubscriptionUsage ?? base.fetchSubscriptionUsage,
198
+ detectClaudePlan: overrides.detectClaudePlan ?? base.detectClaudePlan,
197
199
  diagnoseModels: overrides.diagnoseModels ?? base.diagnoseModels,
198
200
  probeDeclaredHarnesses: overrides.probeDeclaredHarnesses ?? base.probeDeclaredHarnesses,
199
201
  writeLocalRunReport: overrides.writeLocalRunReport ?? base.writeLocalRunReport,
@@ -979,20 +981,19 @@ async function cmdCost(opts = {}) {
979
981
  }
980
982
  async function cmdCheck(issueRaw, opts) {
981
983
  const issueNum = parseIssueArg(issueRaw);
982
- const ghRepo = await getGitHubRepo();
983
- const [owner, repoName] = ghRepo.split('/');
984
- let runModel;
985
- if (opts.deep) {
986
- const repoRoot = await getRepoRoot();
987
- runModel = createDeepModelRunner(newRepoRouter(repoRoot, configLoaders, coreOps.ModelRouter), repoRoot);
988
- }
984
+ const [owner, repoName] = (await getGitHubRepo()).split('/');
985
+ const repoRoot = await getRepoRoot();
986
+ const runModel = opts.judge !== false || opts.deep
987
+ ? createDeepModelRunner(newRepoRouter(repoRoot, configLoaders, coreOps.ModelRouter), repoRoot)
988
+ : undefined;
989
989
  let report;
990
990
  try {
991
991
  report = await runIssueCheck(issueNum, opts, {
992
992
  runModel,
993
+ readinessCacheDir: getFactoryPaths(repoRoot).readinessCache,
993
994
  getIssue: async (n) => {
994
995
  const { data } = await getOctokit().rest.issues.get({ owner, repo: repoName, issue_number: n });
995
- return { title: data.title, body: data.body ?? null };
996
+ return { title: data.title, body: data.body ?? null, labels: data.labels };
996
997
  },
997
998
  getIssueState: async (n) => {
998
999
  const { data } = await getOctokit().rest.issues.get({ owner, repo: repoName, issue_number: n });
@@ -1002,16 +1003,14 @@ async function cmdCheck(issueRaw, opts) {
1002
1003
  });
1003
1004
  }
1004
1005
  catch (err) {
1005
- if (err instanceof DeepCheckError)
1006
- throw new CliExitError(`factory: --deep failed — ${err.message}`, 2);
1006
+ const exit = checkErrorExit(err);
1007
+ if (exit)
1008
+ throw new CliExitError(exit.message, exit.code);
1007
1009
  throw err;
1008
1010
  }
1009
- if (report.exitCode === 1) {
1010
- throw new CliExitError(`factory: issue #${issueNum} is not factory-ready — ${report.reasons.join('; ')}`, 1);
1011
- }
1012
- if (report.exitCode === 3) {
1013
- throw new CliExitError(`factory: issue #${issueNum} would split — ${report.size.reason}`, 3);
1014
- }
1011
+ const exit = checkReportExit(report);
1012
+ if (exit)
1013
+ throw new CliExitError(exit.message, exit.code);
1015
1014
  }
1016
1015
  async function currentCommitSha() {
1017
1016
  try {
@@ -1111,7 +1110,7 @@ async function cmdClassifierBacktestEntry(opts) {
1111
1110
  const effective = resolveEffectiveConfig(repoConfig);
1112
1111
  const router = new coreOps.ModelRouter(applyRepoConfig(configLoaders.loadModelsConfig(), repoConfig), configLoaders.loadRoutesConfig(), false, undefined, effective.allowExperimental, effective.localOnly);
1113
1112
  router.setCodexFullAccessTasks?.(configLoaders.loadFactoryConfigForRepo(paths.config).sandbox.codexFullAccessTasks);
1114
- router.setLocalAuthSink?.(recordLocalAuthFailure);
1113
+ applyRouterGuards(router);
1115
1114
  try {
1116
1115
  await cmdClassifierBacktest({ ...opts, branchPrefix }, {
1117
1116
  repoRoot,
@@ -1202,7 +1201,7 @@ async function cmdKpis(opts = {}) {
1202
1201
  const branchPrefix = branchPrefixOrExit(opts.branchPrefix);
1203
1202
  const repoRoot = await getRepoRoot();
1204
1203
  const paths = getFactoryPaths(repoRoot);
1205
- const events = existsSync(paths.events) ? readEvents(paths.events) : [];
1204
+ const events = readEvents(paths.events, { includeSegments: true });
1206
1205
  const costs = existsSync(paths.costs) ? internalOps.readCosts(paths.costs) : [];
1207
1206
  const recon = await reconstructHumanEventsForKpis(events, branchPrefix);
1208
1207
  let allEvents = recon.events;
@@ -1289,16 +1288,7 @@ export async function cmdUsage(deps = {}, opts = {}) {
1289
1288
  throw new CliExitError(`factory: ${err.message}`, 2);
1290
1289
  }
1291
1290
  if (opts.json) {
1292
- const subscription = await ops.fetchSubscriptionUsage();
1293
- let estimate;
1294
- try {
1295
- const spend = ops.estimateTrailingSpend();
1296
- estimate = Number.isFinite(spend) ? spend : null;
1297
- }
1298
- catch {
1299
- estimate = null;
1300
- }
1301
- console.log(JSON.stringify(buildUsageJson(subscription, estimate, knobs.cap)));
1291
+ console.log(JSON.stringify(await collectUsageJson(ops, knobs.cap)));
1302
1292
  return;
1303
1293
  }
1304
1294
  const subscriptionPromise = ops.fetchSubscriptionUsage();
@@ -1371,7 +1361,7 @@ async function cmdTui(opts = {}, runTuiImpl = runTui) {
1371
1361
  const effective = resolveEffectiveConfig(repoConfig);
1372
1362
  const router = new coreOps.ModelRouter(modelsConfig, routesConfig, false, undefined, effective.allowExperimental, effective.localOnly);
1373
1363
  router.setCodexFullAccessTasks?.(configLoaders.loadFactoryConfigForRepo(paths.config).sandbox.codexFullAccessTasks);
1374
- router.setLocalAuthSink?.(recordLocalAuthFailure);
1364
+ applyRouterGuards(router);
1375
1365
  const effectiveConfigLines = describeEffectiveConfig({
1376
1366
  router,
1377
1367
  repo: repoConfig,
@@ -1505,7 +1495,7 @@ export function resolveEnvironmentAcquirer(opts) {
1505
1495
  };
1506
1496
  };
1507
1497
  }
1508
- const sweepStaleLaneClaims = (paths, ghRepo) => sweepLaneClaims(paths, ghRepo, () => (hasGitHubToken() ? getOctokit() : undefined));
1498
+ const { sweepStaleLaneClaims, sweepOrphanDrafts } = startupSweeps(() => (hasGitHubToken() ? getOctokit() : undefined));
1509
1499
  /** The autoGcOnRun-gated worktree sweep every pipeline entry point runs before shipping
1510
1500
  * (`factory run`, and since #1756 the one-shot `factory ship` / `factory run-issue`). Never
1511
1501
  * throws — a GC failure is a warn, never a reason to abort the command. */
@@ -2085,7 +2075,7 @@ async function cmdTriage(opts) {
2085
2075
  const effective = resolveEffectiveConfig(repoConfig);
2086
2076
  const router = new coreOps.ModelRouter(modelsConfig, routesConfig, false, undefined, effective.allowExperimental, effective.localOnly);
2087
2077
  router.setCodexFullAccessTasks?.(configLoaders.loadFactoryConfigForRepo(paths.config).sandbox.codexFullAccessTasks);
2088
- router.setLocalAuthSink?.(recordLocalAuthFailure);
2078
+ applyRouterGuards(router);
2089
2079
  router.skipMissingHarnessClis(coreOps.isCommandAvailable);
2090
2080
  router.setCostSink((entry) => logCost(paths.costs, { ...entry, issue: '-' }));
2091
2081
  let plannerError;
@@ -3090,6 +3080,7 @@ function runRun(opts = {}) {
3090
3080
  withRepoRunLock,
3091
3081
  runAutoWorktreeGc,
3092
3082
  sweepStaleLaneClaims,
3083
+ sweepOrphanDrafts,
3093
3084
  planRunLanes,
3094
3085
  preflightQueuedIssue,
3095
3086
  createQueuePreflightOps,