@pome-sh/cli 0.29.1 → 0.30.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "pome-sh",
3
- "version": "0.29.1",
4
- "git_sha": "c89dc0c40e2f591a46a0802285b043acf5b084bf",
5
- "build_time": "2026-08-26T22:31:38.093Z"
3
+ "version": "0.30.0",
4
+ "git_sha": "179ee2254d787d6197d4928eb55efa88790b102d",
5
+ "build_time": "2026-08-27T09:02:39.186Z"
6
6
  }
@@ -183,7 +183,7 @@ async function checkTwinReachable(_configDir) {
183
183
  });
184
184
  let harness;
185
185
  try {
186
- const { bootTwin } = await import('./twinHarness-CUVRO5IV.js');
186
+ const { bootTwin } = await import('./twinHarness-TSAQYDC5.js');
187
187
  harness = await bootTwin({
188
188
  twin: "github",
189
189
  seedState: void 0,
@@ -253,7 +253,7 @@ async function checkRouting(configDir) {
253
253
  cause: `no POME_*_REST_URL / POME_*_MCP_URL read and no @pome-sh adapter found in the ${scan.filesScanned} source file(s) under ${relative(process.cwd(), configDir) || "."} \u2014 the agent has no path to the twin.`,
254
254
  fix: [
255
255
  'wire the adapter: import { withPome } from "@pome-sh/adapter-claude-sdk"; call withPome() at startup;',
256
- "read the twin base URL from POME_GITHUB_REST_URL (injected by the runner) \u2014 or let your own coding agent wire it with the Gen-2 skills (`npx skills add pome-sh/digital-twins --skill '*'`)."
256
+ "read the twin base URL from POME_GITHUB_REST_URL (injected by the runner) \u2014 or let your own coding agent wire it with the coach skills (`npx skills add pome-sh/digital-twins --skill '*'`)."
257
257
  ].join("\n")
258
258
  };
259
259
  }
@@ -1,5 +1,5 @@
1
- import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-VORBQXJN.js';
2
- import { createRecorder, bootTwin } from './chunk-S6JLWI4S.js';
1
+ import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-LSS7PZGW.js';
2
+ import { createRecorder, bootTwin } from './chunk-WJFRBXL5.js';
3
3
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
4
4
  import { buildEgressAllowlist, readBlockedEgress } from './chunk-CBFKZZBR.js';
5
5
  import { eventSchema } from './chunk-6KJC4BTO.js';
@@ -1,4 +1,4 @@
1
- import { isTwinName, TWIN_REGISTRY, TWIN_NAMES } from './chunk-SRG22BIH.js';
1
+ import { isTwinName, TWIN_REGISTRY, TWIN_NAMES } from './chunk-SDBBGCE7.js';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { parse } from 'yaml';
4
4
 
@@ -1,5 +1,5 @@
1
- import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-VORBQXJN.js';
2
- import { readSeedFileText, parseSeedFileText, soleTwinOf, seedsForTwins } from './chunk-B7PA7UDX.js';
1
+ import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-LSS7PZGW.js';
2
+ import { readSeedFileText, parseSeedFileText, soleTwinOf, seedsForTwins } from './chunk-IHKUFGYW.js';
3
3
  import { readManifest, normalizeManifestTwins } from './chunk-XWGZ5C7Y.js';
4
4
  import { MOUNTED_TWINS, HostedAuthError, HostedDiscardRefusedError, HostedQuotaError, HostedOrchError, HostedTrialError, agentResponseSchema, isMultiTwinSeedEnvelope } from './chunk-OTFDQT3H.js';
5
5
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
@@ -79,7 +79,7 @@ function looksLikeVerdictArtifactBase(parsed) {
79
79
  if (v.source !== "cloud-finalize") return false;
80
80
  if (typeof v.session_id !== "string") return false;
81
81
  if (typeof v.task_name !== "string") return false;
82
- if (typeof v.task_path !== "string" && typeof v.scenario_path !== "string") return false;
82
+ if (typeof v.task_path !== "string") return false;
83
83
  if (v.group_id !== null && typeof v.group_id !== "string") return false;
84
84
  if (typeof v.finalized_at !== "string") return false;
85
85
  if (typeof v.passed !== "boolean") return false;
@@ -770,9 +770,6 @@ async function runSessionCreate(opts) {
770
770
  if (!printedAny) {
771
771
  console.error(`Twin URL: ${session.twin_url}`);
772
772
  }
773
- if (opts.showSecrets) {
774
- console.error("--show-secrets no longer prints secrets. Use --secrets-file <path>.");
775
- }
776
773
  console.error("Secrets redacted.");
777
774
  console.error(`Dashboard: ${DEFAULT_DASHBOARD_URL}/twins/${session.session_id}`);
778
775
  }
@@ -1,6 +1,6 @@
1
1
  import { gmailSeedSchema, defaultSeedState } from './chunk-3T5XN64P.js';
2
2
  import { linearSeedSchema, defaultSeedState as defaultSeedState$1 } from './chunk-Q5NBPR57.js';
3
- import { isTwinName, TWIN_REGISTRY } from './chunk-SRG22BIH.js';
3
+ import { isTwinName, TWIN_REGISTRY } from './chunk-SDBBGCE7.js';
4
4
  import { criterionSchema, normalizeTaskConfigKeys, finalizeResponseSchema, HostedDiscardRefusedError, HostedOrchError, HostedAuthError, HostedQuotaError, submitResultResponseSchema, createEvalSessionResponseSchema, createSessionResponseSchema, sessionPublicSchema } from './chunk-OTFDQT3H.js';
5
5
  import { seedSchema, parseSeed, defaultSeedState as defaultSeedState$2 } from './chunk-HJX25USP.js';
6
6
  import { toTwinHttpEventRow } from './chunk-E665XWYU.js';
@@ -421,7 +421,6 @@ function splitSections(markdown) {
421
421
  return sections;
422
422
  }
423
423
  var CRITERION_LINE_RE = /^[-*]\s+\[(code|model)(?::([a-z][a-z0-9_-]*))?(\s+always-scored)?\]\s+(.+)$/;
424
- var LEGACY_CRITERION_LINE_RE = /^[-*]\s+\[([DP])(?::([a-z][a-z0-9_-]*))?\]\s+(.+)$/;
425
424
  var NEAR_MISS_CRITERION_LINE_RE = /^[-*]\s*\[\s*(code|model)\b[^\]]*\]/;
426
425
  function nearMissCriterionMessage(line) {
427
426
  return `Criterion line "${line}" reaches for a [code]/[model] marker but does not match the criterion grammar ${CRITERION_LINE_RE.source} \u2014 fix the marker (e.g. "[code]", "[code:slack]", "[code:slack always-scored]"); a line this close to a criterion is refused rather than silently dropped as prose.`;
@@ -433,13 +432,6 @@ function parseCriteria(input, twins) {
433
432
  const criteria = [];
434
433
  for (const rawLine of input.split("\n")) {
435
434
  const line = rawLine.trim();
436
- const legacy = line.match(LEGACY_CRITERION_LINE_RE);
437
- if (legacy) {
438
- const legacyMarker = `[${legacy[1]}${legacy[2] ? `:${legacy[2]}` : ""}]`;
439
- throw new Error(
440
- `Criterion "${legacyMarker} ${legacy[3].trim()}" uses a retired marker \u2014 markers were renamed [D]\u2192[code] and [P]\u2192[model] (tags carry over: [D:github]\u2192[code:github]).`
441
- );
442
- }
443
435
  const match = line.match(CRITERION_LINE_RE);
444
436
  if (!match) {
445
437
  if (NEAR_MISS_CRITERION_LINE_RE.test(line)) {
@@ -165,7 +165,7 @@ var TWIN_REGISTRY = {
165
165
  LinearDomain,
166
166
  openLinearTwinDatabase,
167
167
  parseSeed
168
- } = await import('./src-5YCI6VIR.js');
168
+ } = await import('./src-FK536BIR.js');
169
169
  const db = openLinearTwinDatabase(":memory:");
170
170
  const seed = parseSeed(seedState);
171
171
  const domain = new LinearDomain(db);
@@ -363,7 +363,7 @@ var issueState = defineCheck({
363
363
  });
364
364
  var issueHasLabel = defineCheck({
365
365
  id: "linear.issue-has-label",
366
- description: "Resolves the issue, joins its `labelIds` to the workspace label catalog, and asserts the named label is among them \u2014 case-insensitively, as the legacy rule's comparison was. The join is the point: this export carries label IDS where the seed writes names and twin-github writes objects, so one concept has three shapes and only this one is exported. A label id with no catalog row is a partial export and SKIPS rather than failing.",
366
+ description: "Resolves the issue, joins its `labelIds` to the workspace label catalog, and asserts the named label is among them, case-insensitively. The join is the point: this export carries label IDS where the seed writes names and twin-github writes objects, so one concept has three shapes and only this one is exported. A label id with no catalog row is a partial export and SKIPS rather than failing.",
367
367
  template: 'Issue "{title}" in `{team}` has label "{label}"',
368
368
  params: { title: issueTitle, team: teamKey, label: labelName },
369
369
  substrate: "final",
@@ -429,7 +429,7 @@ var issueEstimate = defineCheck({
429
429
  });
430
430
  var issueAssignee = defineCheck({
431
431
  id: "linear.issue-assignee",
432
- description: "Resolves the issue, then its assignee, and matches the given reference against that user's email, name OR displayName \u2014 every spelling the legacy rule accepted. An UNASSIGNED issue is a real FAIL. Declared with no shipped corpus user, carrying a legacy capability forward. This is the check whose `subject` earns its keep: an email reference is destroyed by a team's `PII_PATTERNS`, which the twin's own redactor has no equivalent of, so without the declaration the criterion would silently be unable to fire.",
432
+ description: "Resolves the issue, then its assignee, and matches the given reference against that user's email, name OR displayName. An UNASSIGNED issue is a real FAIL. Declared with no shipped corpus user. This is the check whose `subject` earns its keep: an email reference is destroyed by a team's `PII_PATTERNS`, which the twin's own redactor has no equivalent of, so without the declaration the criterion would silently be unable to fire.",
433
433
  template: 'Issue "{title}" in `{team}` is assigned to `{user}`',
434
434
  params: { title: issueTitle, team: teamKey, user: userRef },
435
435
  substrate: "final",
@@ -1,4 +1,4 @@
1
- import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-SRG22BIH.js';
1
+ import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-SDBBGCE7.js';
2
2
  import { createFileBackedRecorderStore, createRecorderStore } from './chunk-E665XWYU.js';
3
3
 
4
4
  // src/recorder/recorder.ts
@@ -1,12 +1,12 @@
1
1
  import { newGroupId, reassuranceBox, twinReadyLine, trialsHeaderLine, trialLine, summaryLines, evaluatingLine, criterionPhrase } from './chunk-RGZBC7NF.js';
2
2
  import { DemoCapacityError, capacityLabel, parseCapacityMarker, capacityKindFrom } from './chunk-ZX4WNSZ5.js';
3
- import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-ZYQK4PNC.js';
4
- import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-VORBQXJN.js';
3
+ import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-3DHWCIT2.js';
4
+ import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-LSS7PZGW.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import './chunk-3T5XN64P.js';
7
7
  import './chunk-Q5NBPR57.js';
8
- import { bootTwin } from './chunk-S6JLWI4S.js';
9
- import './chunk-SRG22BIH.js';
8
+ import { bootTwin } from './chunk-WJFRBXL5.js';
9
+ import './chunk-SDBBGCE7.js';
10
10
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
11
11
  import { HostedQuotaError, HostedOrchError } from './chunk-OTFDQT3H.js';
12
12
  import './chunk-CBFKZZBR.js';
@@ -1,11 +1,11 @@
1
1
  import { newGroupId, criterionPhrase } from './chunk-RGZBC7NF.js';
2
- import { runTaskHosted, resolveRunAgentIdentity } from './chunk-EFX32JE3.js';
3
- import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-VORBQXJN.js';
4
- import './chunk-B7PA7UDX.js';
2
+ import { runTaskHosted, resolveRunAgentIdentity } from './chunk-KLVIYURL.js';
3
+ import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-LSS7PZGW.js';
4
+ import './chunk-IHKUFGYW.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import './chunk-3T5XN64P.js';
7
7
  import './chunk-Q5NBPR57.js';
8
- import './chunk-SRG22BIH.js';
8
+ import './chunk-SDBBGCE7.js';
9
9
  import './chunk-XWGZ5C7Y.js';
10
10
  import { HostedQuotaError, HostedTrialError } from './chunk-OTFDQT3H.js';
11
11
  import './chunk-HJX25USP.js';
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, SESSION_TWIN_NAMES, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-EFX32JE3.js';
3
- import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-ZYQK4PNC.js';
4
- import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-VORBQXJN.js';
5
- import '../../chunk-B7PA7UDX.js';
2
+ import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, SESSION_TWIN_NAMES, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-KLVIYURL.js';
3
+ import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-3DHWCIT2.js';
4
+ import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-LSS7PZGW.js';
5
+ import '../../chunk-IHKUFGYW.js';
6
6
  import '../../chunk-NW7HGA2K.js';
7
7
  import { GMAIL_CHECKS } from '../../chunk-JM6VS62R.js';
8
8
  import '../../chunk-3T5XN64P.js';
9
- import { LINEAR_CHECKS } from '../../chunk-XBT6ZLBG.js';
9
+ import { LINEAR_CHECKS } from '../../chunk-TSOSDKXP.js';
10
10
  import '../../chunk-Q5NBPR57.js';
11
- import '../../chunk-S6JLWI4S.js';
12
- import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-SRG22BIH.js';
11
+ import '../../chunk-WJFRBXL5.js';
12
+ import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-SDBBGCE7.js';
13
13
  import { readManifest, writeManifest, MANIFEST_JSON, readRequiredManifest, normalizeManifestTwins } from '../../chunk-XWGZ5C7Y.js';
14
14
  import '../../chunk-XDU6TD4O.js';
15
15
  import { MOUNTED_TWINS, deriveAgentSlug, exitCodeFor, HostedUsageError, HostedOrchError, HostedAuthError, HostedQuotaError } from '../../chunk-OTFDQT3H.js';
@@ -19,7 +19,7 @@ import { seedSchema } from '../../chunk-HJX25USP.js';
19
19
  import { SLACK_CHECKS } from '../../chunk-2ZGVDTJC.js';
20
20
  import { oneOf, defineCheck, repoRef, VACUITY_SENTINEL_NUMBER, childStatePath, VACUITY_SENTINEL, statePath, templateSlots, renderCheck, checksDigest, checkPattern, checkNearMissPattern } from '../../chunk-JWJYNAWI.js';
21
21
  import '../../chunk-E665XWYU.js';
22
- import { isLegacyEventRow, eventSchema } from '../../chunk-6KJC4BTO.js';
22
+ import { eventSchema, isLegacyEventRow } from '../../chunk-6KJC4BTO.js';
23
23
  import { redactEvent, redactSecrets } from '../../chunk-SG6ZTIMT.js';
24
24
  import '../../chunk-CF6EIU2U.js';
25
25
  import { Command } from 'commander';
@@ -35,7 +35,6 @@ import { z } from 'zod';
35
35
  import Anthropic from '@anthropic-ai/sdk';
36
36
  import { zodOutputFormat } from '@anthropic-ai/sdk/helpers/zod';
37
37
 
38
- var LEGACY_EVENTS_MESSAGE = "this run was produced by an older CLI version (pre-M0); rerun against current CLI to view";
39
38
  async function readEventsJsonl(runDir) {
40
39
  let raw;
41
40
  try {
@@ -47,9 +46,6 @@ async function readEventsJsonl(runDir) {
47
46
  throw err;
48
47
  }
49
48
  const rows = raw.split("\n").map((line) => line.trim()).filter((line) => line.length > 0).map((line) => JSON.parse(line));
50
- if (rows.some(isLegacyEventRow)) {
51
- return { kind: "legacy" };
52
- }
53
49
  const events = rows.map((row) => eventSchema.parse(row));
54
50
  return { kind: "events", events };
55
51
  }
@@ -409,7 +405,7 @@ var DOCS_TOPICS = [
409
405
  {
410
406
  id: "getting-started",
411
407
  title: "Quickstart",
412
- path: "/getting-started",
408
+ path: "/quickstart/claude-code",
413
409
  keywords: ["install", "quickstart", "setup", "begin"]
414
410
  },
415
411
  {
@@ -424,9 +420,6 @@ var DOCS_TOPICS = [
424
420
  "register",
425
421
  "pome.json",
426
422
  "connect",
427
- // Migrated from the retired skills-setup topic: wiring your own
428
- // agent is now the "bring your own agent" path. ("pome-setup" / "setup"
429
- // already resolve to getting-started via its "setup" keyword.)
430
423
  "wire"
431
424
  ]
432
425
  },
@@ -436,14 +429,6 @@ var DOCS_TOPICS = [
436
429
  path: "/docs/how-pome-works",
437
430
  keywords: ["twins", "scenarios", "runs", "scoring", "artifacts", "loop"]
438
431
  },
439
- // The Gen-1 /setup and /test-with-pome skill pages were dropped from the docs
440
- // nav, and the CLI commands that pointed at them are gone. The two
441
- // topic entries are gone, but their still-live keywords are MIGRATED onto the
442
- // surviving replacement topics so `pome docs <kw>` keeps routing:
443
- // wire → existing-agent; test-with-pome / pome-test → cli-run;
444
- // eval → cli (the CLI reference index — no dedicated eval page exists).
445
- // (setup / pome-setup / register / run scenarios / /setup all already
446
- // resolve via existing substrings — see the tests.)
447
432
  {
448
433
  id: "dashboard",
449
434
  title: "Pome Dashboard",
@@ -453,7 +438,7 @@ var DOCS_TOPICS = [
453
438
  {
454
439
  id: "twins",
455
440
  title: "Twins overview",
456
- path: "/docs/twins/index",
441
+ path: "/docs/twins/coverage",
457
442
  keywords: ["sandbox", "digital twin", "hosted"]
458
443
  },
459
444
  {
@@ -484,10 +469,8 @@ var DOCS_TOPICS = [
484
469
  id: "cli",
485
470
  title: "Command Line Interface",
486
471
  path: "/docs/cli",
487
- // "eval" migrated from the retired skills-test topic: there is no
488
- // dedicated `pome eval` docs page, and it is a distinct workflow from
489
- // `pome inspect`, so it routes to the CLI reference index that documents
490
- // every command rather than to a sibling command's page.
472
+ // No dedicated `pome eval` page exists, and eval is a distinct workflow
473
+ // from `pome inspect`, so "eval" routes to the reference index.
491
474
  keywords: ["commands", "flags", "pome run", "reference", "eval"]
492
475
  },
493
476
  {
@@ -502,26 +485,18 @@ var DOCS_TOPICS = [
502
485
  "artifacts",
503
486
  "default",
504
487
  "demo task",
505
- "run yours",
506
- // Migrated from the retired skills-test topic: running tasks is
507
- // how you test an agent with pome.
508
- "test-with-pome",
509
- "pome-test"
488
+ "run yours"
510
489
  ]
511
490
  },
512
491
  {
513
- id: "cli-session",
514
- title: "pome session",
515
- path: "/docs/cli/session",
516
- keywords: ["session", "hosted", "sandbox", "twin"]
492
+ id: "cli-sandbox",
493
+ title: "pome sandbox",
494
+ path: "/docs/cli/sandbox",
495
+ keywords: ["sandbox", "hosted", "twin"]
517
496
  },
518
497
  {
519
498
  id: "cli-tasks",
520
499
  title: "pome tasks",
521
- // The M4 docs door renamed the docs.pome.sh page from
522
- // /docs/cli/scenarios to /docs/cli/tasks (a redirect keeps the old URL
523
- // alive), so `path` now points at the new route. The "scenarios" keyword
524
- // stays so `pome docs scenarios` still resolves to this topic.
525
500
  path: "/docs/cli/tasks",
526
501
  keywords: ["tasks", "scenarios", "catalog", "copy", "library", "twin"]
527
502
  },
@@ -548,12 +523,6 @@ var DOCS_TOPICS = [
548
523
  title: "Troubleshooting",
549
524
  path: "/docs/troubleshooting",
550
525
  keywords: ["errors", "help", "fix", "debug"]
551
- },
552
- {
553
- id: "changelog",
554
- title: "Changelog",
555
- path: "/changelog",
556
- keywords: ["release", "version", "news"]
557
526
  }
558
527
  ];
559
528
 
@@ -4653,7 +4622,7 @@ var DEFAULT_AGENT_COMMAND = `node ${DEFAULT_AGENT_FILE}`;
4653
4622
  var MANIFEST_SCHEMA_URL = "https://pome.sh/schemas/v1/pome.json";
4654
4623
  var MAX_UNREADABLE_PATHS_SHOWN = 5;
4655
4624
  function readPackageVersion() {
4656
- if ("0.29.1".length > 0) return "0.29.1";
4625
+ if ("0.30.0".length > 0) return "0.30.0";
4657
4626
  try {
4658
4627
  const here = dirname(fileURLToPath(import.meta.url));
4659
4628
  const candidates = [
@@ -4751,12 +4720,6 @@ function createProgram() {
4751
4720
  }
4752
4721
  console.error(postInitMessage);
4753
4722
  });
4754
- program.command("install").allowUnknownOption().allowExcessArguments().description(
4755
- "Retired. Prints the Gen-2 wiring path: `claude mcp add \u2026 pome` + `npx skills add pome-sh/digital-twins --skill '*'`, then the pome-intake / REST-launch preflight."
4756
- ).action(async () => {
4757
- const { runInstall } = await import('../../install-4OATBKG3.js');
4758
- runInstall();
4759
- });
4760
4723
  program.command("login").description("Sign in with Clerk and store a hosted team API key (macOS Keychain or ~/.pome/credentials.json)").option(
4761
4724
  "--api-url <url>",
4762
4725
  "Control-plane base URL.",
@@ -4786,7 +4749,7 @@ function createProgram() {
4786
4749
  "Override docs site origin (default https://docs.pome.sh)"
4787
4750
  ).option(
4788
4751
  "--url",
4789
- "Print docs.pome.sh URLs (default behavior; retained for compatibility).",
4752
+ "Print the URL instead of opening the interactive topic picker.",
4790
4753
  false
4791
4754
  ).description(
4792
4755
  "Navigate canonical narrative docs on docs.pome.sh"
@@ -4920,7 +4883,7 @@ function createProgram() {
4920
4883
  "--api-url <url>",
4921
4884
  "Control-plane URL",
4922
4885
  process.env.POME_API_URL ?? DEFAULT_CONTROL_PLANE_URL
4923
- ).option("--show-secrets", "Deprecated: secrets are never printed; use --secrets-file", false).option(
4886
+ ).option(
4924
4887
  "--secrets-file <path>",
4925
4888
  "Write shell exports containing session secrets to a local file with mode 0600"
4926
4889
  ).option(
@@ -4939,7 +4902,6 @@ function createProgram() {
4939
4902
  await runSessionCreate({
4940
4903
  apiBaseUrl: opts.apiUrl,
4941
4904
  twins: opts.twin ?? [],
4942
- showSecrets: opts.showSecrets,
4943
4905
  format,
4944
4906
  secretsFile: opts.secretsFile,
4945
4907
  seedPath: opts.seed
@@ -5016,7 +4978,7 @@ function createProgram() {
5016
4978
  ).option("--agent <command>", "Agent command to run").option(
5017
4979
  "-n, --trials <count>",
5018
4980
  "Run <count> isolated trials of the task as ONE trial group (integer 1-20; hosted only). Default is the task config's `runs` field (capped at 20). k>1 mints sessions with a shared group id up to your plan's concurrent-twin quota (remaining trials reuse slots as earlier trials finish), runs trials at that concurrency, prints the per-trial verdict table (numeric cloud-judge scores), and exits 0 iff at least one trial completed and every completed trial passed (1: a completed trial failed; 2: nothing completed). k=1 keeps today's single-run behavior exactly."
5019
- ).option("--artifacts-dir <dir>", "Directory for run artifacts", "runs").option("--hosted", "Deprecated: hosted is now the default. Flag is a no-op.").option(
4981
+ ).option("--artifacts-dir <dir>", "Directory for run artifacts", "runs").option(
5020
4982
  "--api-url <url>",
5021
4983
  "Control-plane base URL.",
5022
4984
  process.env.POME_API_URL ?? DEFAULT_CONTROL_PLANE_URL
@@ -5099,13 +5061,6 @@ function createProgram() {
5099
5061
  const agentCommand = resolvedCommand ?? DEFAULT_AGENT_COMMAND;
5100
5062
  let worstExit = 0;
5101
5063
  const useLocal = options.local === true || process.env.POME_LOCAL === "1";
5102
- if (options.hosted && useLocal) {
5103
- console.error(
5104
- "Warning: --hosted is a no-op; running against a local twin (--local / POME_LOCAL=1). Drop it to record runs to the cloud."
5105
- );
5106
- } else if (options.hosted) {
5107
- console.error("Note: --hosted is now the default; the flag is a deprecated no-op and will be removed in a future release.");
5108
- }
5109
5064
  if (trialsFlag !== void 0 && useLocal) {
5110
5065
  console.error(
5111
5066
  "-n/--trials needs the hosted path (verdicts come from the cloud judge); --local runs capture a single trace. Drop --local or -n."
@@ -5114,7 +5069,7 @@ function createProgram() {
5114
5069
  return;
5115
5070
  }
5116
5071
  {
5117
- const { runDoctorChecks } = await import('../../checks-BZ5L2YNC.js');
5072
+ const { runDoctorChecks } = await import('../../checks-P272TU4C.js');
5118
5073
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5119
5074
  const doctorReport = await runDoctorChecks({ mode: useLocal ? "full" : "hosted" });
5120
5075
  if (!doctorReport.ok) {
@@ -5152,7 +5107,7 @@ function createProgram() {
5152
5107
  taskForRuns.config.runs
5153
5108
  );
5154
5109
  if (k > 1) {
5155
- const { runTrialGroup } = await import('../../runTrialGroup-IFRZWVRB.js');
5110
+ const { runTrialGroup } = await import('../../runTrialGroup-DWFSBMQ2.js');
5156
5111
  const fileForRerun = relative(process.cwd(), file);
5157
5112
  const rerunCommand = defaultTask ? options.trials !== void 0 ? `pome run -n ${k}` : "pome run" : `pome run ${fileForRerun && !fileForRerun.startsWith("..") ? fileForRerun : file} -n ${k}`;
5158
5113
  const groupResult = await runTrialGroup({
@@ -5246,7 +5201,7 @@ function createProgram() {
5246
5201
  process.exitCode = 5;
5247
5202
  return;
5248
5203
  }
5249
- const { runDemo } = await import('../../runDemo-NKSDEHRR.js');
5204
+ const { runDemo } = await import('../../runDemo-7AVS4AML.js');
5250
5205
  const result = await runDemo({
5251
5206
  apiBase: opts.apiUrl.replace(/\/$/, ""),
5252
5207
  dashboardBase: process.env.POME_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL,
@@ -5264,7 +5219,7 @@ function createProgram() {
5264
5219
  program.command("doctor").description(
5265
5220
  "Check the agent\u2194twin wiring: pome.json (or pome.yaml) present + valid, the local twin boots + serves, requests routed to the twin (not a hardcoded production host), egress floor active. On failure prints one named cause (file:line where knowable) + one concrete fix and exits non-zero."
5266
5221
  ).action(async () => {
5267
- const { runDoctorChecks } = await import('../../checks-BZ5L2YNC.js');
5222
+ const { runDoctorChecks } = await import('../../checks-P272TU4C.js');
5268
5223
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5269
5224
  const report = await runDoctorChecks();
5270
5225
  for (const line of renderDoctorReport(report, { passNote: true })) console.error(line);
@@ -5298,11 +5253,6 @@ function createProgram() {
5298
5253
  const latest = run === "latest" ? await readLatestRun(options.artifactsDir) : void 0;
5299
5254
  const runDir = latest?.run_dir ?? resolve(run);
5300
5255
  const eventsResult = await readEventsJsonl(runDir);
5301
- if (eventsResult.kind === "legacy") {
5302
- console.error(LEGACY_EVENTS_MESSAGE);
5303
- process.exitCode = 2;
5304
- return;
5305
- }
5306
5256
  const meta = await readMetaSummary(runDir);
5307
5257
  console.log(`Run: ${latest?.run_id ?? run}`);
5308
5258
  console.log(`Directory: ${runDir}`);
@@ -5324,7 +5274,7 @@ function createProgram() {
5324
5274
  "[task]",
5325
5275
  "Path to the task .md file (only with an events.jsonl target)"
5326
5276
  ).description(
5327
- "Assemble a paste-into-IDE fix prompt (no LLM call, no network). With no args, reads the latest FAILED run set under ./runs: the persisted cloud verdicts (verdict.json) become grouped failure signatures over the raw traces, in one prompt. Point it at a trial run dir to target that set, or use the legacy `<events.jsonl> <task.md>` form for a single trace."
5277
+ "Assemble a paste-into-IDE fix prompt (no LLM call, no network). With no args, reads the latest FAILED run set under ./runs: the persisted cloud verdicts (verdict.json) become grouped failure signatures over the raw traces, in one prompt. Point it at a trial run dir to target that set, or point it at an `events.jsonl` with its task file for a single trace."
5328
5278
  ).action(async (target, taskArg) => {
5329
5279
  if (target !== void 0 && target.endsWith(".jsonl")) {
5330
5280
  if (!taskArg) {
@@ -5446,13 +5396,13 @@ function createProgram() {
5446
5396
  ).description(
5447
5397
  "Start a standalone twin as a long-lived foreground server (Ctrl-C to stop)"
5448
5398
  ).action(async (name, options) => {
5449
- const { runTwinStartCommand } = await import('../../twinStart-ZDWFU6M4.js');
5399
+ const { runTwinStartCommand } = await import('../../twinStart-VUCN4CFY.js');
5450
5400
  await runTwinStartCommand(name, options);
5451
5401
  });
5452
5402
  twin.command("seed").argument("<name...>", `Twin name (${TWIN_NAME_LIST.join(" | ")}). Repeat for one file covering several.`).option("--out <path>", "Write to this file instead of stdout. Refuses to overwrite.").description(
5453
5403
  "Print a starter seed file for a twin, generated from the twin's own starting state"
5454
5404
  ).action(async (names, options) => {
5455
- const { runTwinSeedCommand } = await import('../../twinSeed-MOQXJDEG.js');
5405
+ const { runTwinSeedCommand } = await import('../../twinSeed-XIKTIHX2.js');
5456
5406
  await runTwinSeedCommand(names, options);
5457
5407
  });
5458
5408
  twin.command("reset").argument("[name]", "Twin name (default: github)", "github").description("Reset standalone twin state").action(async (name) => {
@@ -1,4 +1,4 @@
1
- export { LINEAR_CHECKS } from './chunk-XBT6ZLBG.js';
1
+ export { LINEAR_CHECKS } from './chunk-TSOSDKXP.js';
2
2
  import { MCP_PAGE_MAX, defaultSeedState, linearSeedSchema, notFound, badUserInput, MCP_PAGE_DEFAULT, DEFAULT_LINEAR_EMAIL, RELAY_PAGE_MAX, RELAY_PAGE_DEFAULT, STATE_EXPORT_CAP, parseSeed, DEFAULT_LINEAR_CLOCK, LINEAR_PROVIDER_TOKEN_PREFIX, DEFAULT_LINEAR_SID, DEFAULT_SCOPES, linearErrorEnvelope, unauthorizedEnvelope, unsupportedEnvelope, forbiddenEnvelope, assertWebhookUrl, ACCESS_TOKEN_TTL_SECONDS, OAUTH_CODE_TTL_SECONDS, TITLE_MAX_BYTES, BODY_MAX_BYTES, LinearTwinError, GRAPHQL_QUERY_MAX_BYTES, GRAPHQL_SELECTION_DEPTH_MAX } from './chunk-Q5NBPR57.js';
3
3
  export { DEFAULT_LINEAR_CLOCK, DEFAULT_LINEAR_EMAIL, DEFAULT_LINEAR_PORT, DEFAULT_LINEAR_SID, DEFAULT_LINEAR_TOKEN, LINEAR_PROVIDER_TOKEN_PREFIX, LinearTwinError, STATE_EXPORT_CAP, assertWebhookUrl, defaultSeedState, linearErrorEnvelope, linearSeedSchema, loadSeedFromEnv, parseSeed, unauthorizedEnvelope, unsupportedEnvelope, webhookUrlError } from './chunk-Q5NBPR57.js';
4
4
  import './chunk-JWJYNAWI.js';
@@ -0,0 +1,6 @@
1
+ export { UnsupportedTwinError, bootTwin } from './chunk-WJFRBXL5.js';
2
+ export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-SDBBGCE7.js';
3
+ import './chunk-E665XWYU.js';
4
+ import './chunk-6KJC4BTO.js';
5
+ import './chunk-SG6ZTIMT.js';
6
+ import './chunk-CF6EIU2U.js';
@@ -1,4 +1,4 @@
1
- import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-SRG22BIH.js';
1
+ import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-SDBBGCE7.js';
2
2
  import { writeFile } from 'node:fs/promises';
3
3
 
4
4
  async function generateSeedFile(twins) {
@@ -1,6 +1,6 @@
1
- import { readSeedFileText, seedForTwin, parseSeedFileText, soleTwinOf, twinsNamedBy } from './chunk-B7PA7UDX.js';
2
- import { bootTwin } from './chunk-S6JLWI4S.js';
3
- import { TWIN_REGISTRY, isTwinName, TWIN_NAMES, defaultPortFor } from './chunk-SRG22BIH.js';
1
+ import { readSeedFileText, seedForTwin, parseSeedFileText, soleTwinOf, twinsNamedBy } from './chunk-IHKUFGYW.js';
2
+ import { bootTwin } from './chunk-WJFRBXL5.js';
3
+ import { TWIN_REGISTRY, isTwinName, TWIN_NAMES, defaultPortFor } from './chunk-SDBBGCE7.js';
4
4
  import './chunk-E665XWYU.js';
5
5
  import './chunk-6KJC4BTO.js';
6
6
  import './chunk-SG6ZTIMT.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.29.1",
3
+ "version": "0.30.0",
4
4
  "description": "Digital-twin testing for AI agents \u2014 run tasks against resettable local or hosted twins and record tool-call traces for evaluation on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",
@@ -1,22 +0,0 @@
1
- // src/cli/install.ts
2
- var GEN2_REDIRECT = [
3
- "pome install (Gen-1 agent-driven wiring) is retired.",
4
- "",
5
- "Wire your own agent to pome the Gen-2 way:",
6
- " 1. claude mcp add --transport http pome https://mcp.pome.sh/mcp",
7
- " # connect the pome control MCP",
8
- " 2. npx skills add pome-sh/digital-twins --skill '*'",
9
- " # install the Gen-2 coach skills",
10
- " # (--skill '*' takes all six; the",
11
- " # picker opens with none ticked)",
12
- " 3. run the pome-intake skill to register the examinee and check twin",
13
- " coverage (self-hosted REST agent: use the coach's REST-launch preflight).",
14
- "",
15
- "Already have pome.json? `pome register agent <name>` and `pome doctor` still apply.",
16
- "See `pome docs getting-started`."
17
- ];
18
- function runInstall() {
19
- for (const line of GEN2_REDIRECT) console.error(line);
20
- }
21
-
22
- export { runInstall };
@@ -1,6 +0,0 @@
1
- export { UnsupportedTwinError, bootTwin } from './chunk-S6JLWI4S.js';
2
- export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-SRG22BIH.js';
3
- import './chunk-E665XWYU.js';
4
- import './chunk-6KJC4BTO.js';
5
- import './chunk-SG6ZTIMT.js';
6
- import './chunk-CF6EIU2U.js';