@on-par/factory-cli 0.9.7-next.9 → 0.9.7

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/dist/cli/index.js CHANGED
@@ -8,7 +8,7 @@ import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:pat
8
8
  import { promisify, styleText } from 'node:util';
9
9
  import { INVALID_BRANCH_PREFIX_MESSAGE, resolveBranchPrefixOption } from './branch-prefix.js';
10
10
  import { acquirePortLease, aggregateCosts, appendKpiHistoryLine, applyRepoConfig, buildPhase, checkPhase, clearProxyState, computeHealthKpis, ConstitutionLoader, createDefaultWorkSourceRegistry, createLogger, createLaneProxy, defaultFindPortListeners, describeEffectiveConfig, detectPostMergeDefects, diagnoseModels, probeDeclaredHarnesses, estimateTrailingSpend, fetchDefectSources, fetchHumanEventSources, 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, resolveSandboxPolicy, resolveSkipCI, resolveTimeouts, resolveUsageCap, resolveWatchdogPolicy, runAutoIngest, shipPhase, formatCostTotal, validateQueue, watchUsage, writeLocalRunReport, writeProxyState, } from '@on-par/factory-core';
11
- import { acquirePidFile, createCheckResumeStore, findSlicePlanComment, upsertSlicePlanComment, withSliceState, DEFAULT_GARDEN_MAX_CLUSTERS, DEFAULT_GARDEN_SINCE, capGardenClusters, clusterGarden, dedupGardenClusters, filterGardenOnlyNew, filterGardenWindow, markGardenTrackingUnknown, parseGardenDuration, readHarvestEvents, renderGardenJson, renderGardenReport, laneWorktreePath, migrateRepoConfigToYaml, REPO_CONFIG_YAML_HEADER, claudeConfigDirOverride, claudeKeychainService, cleanupWorktree, createDaemonLogSink, factoryBranchIssue, factoryBranchPrefixes, createFactorydServer, createRunRuntime, createShipExecutor, createGithubQueue, createLocalSmallDryRun, createOctokitFilingClient, createOctokitGreenPrClient, createOctokitQueueClient, daemonRuntimePaths, defaultRegistryPath, ensureDir, FACTORY_RUNTIME_CONFIG_KEYS, findUnmergedGreenPrs, formatGcReport, gitFetch, listMicroVms, listOrphanContainers, logCost, logEvent, planQueueMigration, readCosts, readGithubQueueSnapshot, reapLaneWorktree, reapOrphanContainers, reapOrphanMicroVm, releaseRuntimeFiles, releaseStaleClaims, resolveBranchPrefix, resolveEffectiveConfig, worktreeSandboxFor, resolveExperimental, resolveLocalOnly, resolvePrClassifierPolicy, resolveReviewFloorRules, RunLockHeldError, runOvernightQueue, parseRemoteSlug, setupWorktree, shellEscape, listBuiltInCheckers, sweepWorktrees, watchChecks, withFileLock, withGitLock, withRunLock, writePortFile, buildTriagePrompt, normalizeTriageQueue, parseTriageCandidates, recordLocalAuthFailure, } from '@on-par/factory-core/internal';
11
+ import { acquirePidFile, createCheckResumeStore, findSlicePlanComment, upsertSlicePlanComment, withSliceState, DEFAULT_GARDEN_MAX_CLUSTERS, DEFAULT_GARDEN_SINCE, capGardenClusters, clusterGarden, dedupGardenClusters, filterGardenOnlyNew, filterGardenWindow, markGardenTrackingUnknown, parseGardenDuration, readHarvestEvents, renderGardenJson, renderGardenReport, laneWorktreePath, migrateRepoConfigToYaml, REPO_CONFIG_YAML_HEADER, claudeConfigDirOverride, claudeKeychainService, cleanupWorktree, createDaemonLogSink, factoryBranchIssue, factoryBranchPrefixes, createFactorydServer, createRunRuntime, createShipExecutor, createGithubQueue, createLocalSmallDryRun, createOctokitFilingClient, createOctokitGreenPrClient, createOctokitQueueClient, daemonRuntimePaths, defaultRegistryPath, ensureDir, FACTORY_RUNTIME_CONFIG_KEYS, findUnmergedGreenPrs, formatGcReport, gitFetch, listMicroVms, listOrphanContainers, logCost, logEvent, planQueueMigration, pollBlockedParks, readCosts, readGithubQueueSnapshot, reapLaneWorktree, reapOrphanContainers, reapOrphanMicroVm, releaseRuntimeFiles, releaseStaleClaims, resolveBranchPrefix, resolveEffectiveConfig, worktreeSandboxFor, resolveExperimental, resolveLocalOnly, resolvePrClassifierPolicy, resolveReviewFloorRules, RunLockHeldError, runOvernightQueue, parseRemoteSlug, setupWorktree, shellEscape, listBuiltInCheckers, sweepWorktrees, watchChecks, withFileLock, withGitLock, withRunLock, writePortFile, buildTriagePrompt, normalizeTriageQueue, parseTriageCandidates, recordLocalAuthFailure, } from '@on-par/factory-core/internal';
12
12
  import { runTui } from '@on-par/factory-tui';
13
13
  import { admissionStateReaderFor, runQueueReconcile } from './admission.js';
14
14
  import { cmdClassifierBacktest, ClassifierBacktestInputError, } from './classifier-backtest.js';
@@ -25,7 +25,7 @@ import { buildProgram } from './program.js';
25
25
  import { buildCostJson } from './cost-json.js';
26
26
  import { buildQueueAddJson } from './queue-add-json.js';
27
27
  import { buildQueueListJson } from './queue-list.js';
28
- import { runUnpark, UnparkError } from './unpark.js';
28
+ import { appendUnparkEvent, runUnpark, UnparkError } from './unpark.js';
29
29
  import { buildRunsJson, parseRunsLimit } from './runs.js';
30
30
  import { buildRunDiffstatJson, NoRunError, parseDiffstatIssue } from './runs-diffstat.js';
31
31
  import { formatUpdateStartupLine, initialUpdateState, readUpdateState, updateStatePath, writeUpdateState, } from './update-state.js';
@@ -97,6 +97,7 @@ const DEFAULT_INTERNAL_OPS = {
97
97
  readCosts,
98
98
  sweepWorktrees,
99
99
  releaseStaleClaims,
100
+ pollBlockedParks,
100
101
  findUnmergedGreenPrs,
101
102
  listOrphanContainers,
102
103
  reapOrphanContainers,
@@ -114,6 +115,7 @@ function resolveInternalOps(overrides, base = internalOps) {
114
115
  readCosts: overrides.readCosts ?? base.readCosts,
115
116
  sweepWorktrees: overrides.sweepWorktrees ?? base.sweepWorktrees,
116
117
  releaseStaleClaims: overrides.releaseStaleClaims ?? base.releaseStaleClaims,
118
+ pollBlockedParks: overrides.pollBlockedParks ?? base.pollBlockedParks,
117
119
  findUnmergedGreenPrs: overrides.findUnmergedGreenPrs ?? base.findUnmergedGreenPrs,
118
120
  listOrphanContainers: overrides.listOrphanContainers ?? base.listOrphanContainers,
119
121
  reapOrphanContainers: overrides.reapOrphanContainers ?? base.reapOrphanContainers,
@@ -554,13 +556,13 @@ export class CliExitError extends Error {
554
556
  this.name = 'CliExitError';
555
557
  }
556
558
  }
557
- /** Parse a CLI <issue> argument. Throws CliExitError(2) before any git/GitHub work runs. */
559
+ /** Parse a CLI <issue> argument; rejects unsafe integers (#2836), also used by reset. Throws CliExitError(2) before any git/GitHub work runs. */
558
560
  export function parseIssueArg(raw) {
559
- const trimmed = raw.trim();
560
- if (!/^\d+$/.test(trimmed) || Number(trimmed) < 1) {
561
+ const n = /^\d+$/.test(raw.trim()) ? Number(raw) : NaN;
562
+ if (!Number.isSafeInteger(n) || n < 1) {
561
563
  throw new CliExitError(`factory: invalid issue argument '${raw}' — expected a positive integer issue number`, 2);
562
564
  }
563
- return Number(trimmed);
565
+ return n;
564
566
  }
565
567
  /** Run `factory feedback` and print the filed issue; validation errors become exit-2 CliExitErrors. */
566
568
  export async function runFeedbackCommand(prUrl, opts, deps, log = console.log) {
@@ -1898,7 +1900,7 @@ export async function cmdWorktreeGc(opts) {
1898
1900
  export async function cmdReset(issues, opts) {
1899
1901
  let nums;
1900
1902
  try {
1901
- nums = parseResetIssues(issues);
1903
+ nums = parseResetIssues(issues.map((raw) => String(parseIssueArg(raw))));
1902
1904
  }
1903
1905
  catch (err) {
1904
1906
  throw new CliExitError(err.message, 2);
@@ -2147,16 +2149,6 @@ async function recordQueueAdded(lane, results) {
2147
2149
  console.error(styleText('yellow', `factory: queue add event not recorded — ${errorDetail(err)}`));
2148
2150
  }
2149
2151
  }
2150
- /** Append one `issue_unparked` event; the silent sink keeps stdout untouched. */
2151
- async function recordIssueUnparked(result) {
2152
- try {
2153
- const eventsFile = getFactoryPaths(await getRepoRoot()).events;
2154
- createLogger(eventsFile, { lane: result.lane, issue: result.issue }, { out: { write: () => true } }).info('issue_unparked', `#${result.issue} unparked → ${result.lane} (order ${result.order})`);
2155
- }
2156
- catch (err) {
2157
- console.error(styleText('yellow', `factory: unpark event not recorded — ${errorDetail(err)}`));
2158
- }
2159
- }
2160
2152
  export async function cmdUnpark(issueArg, opts = {}) {
2161
2153
  const issue = parseIssueArg(issueArg);
2162
2154
  let result;
@@ -2174,7 +2166,12 @@ export async function cmdUnpark(issueArg, opts = {}) {
2174
2166
  const code = err instanceof UnparkError ? err.code : 'unpark-failed';
2175
2167
  throw new CliExitError(`factory: unpark #${issue} [${code}] — ${errorDetail(err)}`, 1);
2176
2168
  }
2177
- await recordIssueUnparked(result);
2169
+ try {
2170
+ appendUnparkEvent(result, getFactoryPaths(await getRepoRoot()).events);
2171
+ }
2172
+ catch (err) {
2173
+ console.error(styleText('yellow', `factory: unpark event not recorded — ${errorDetail(err)}`));
2174
+ }
2178
2175
  if (opts.json) {
2179
2176
  console.log(JSON.stringify(result));
2180
2177
  return;