@pome-sh/cli 0.32.0 → 0.33.1

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/README.md CHANGED
@@ -11,7 +11,7 @@ prints it to the terminal and records it to the dashboard, and
11
11
 
12
12
  **📚 Full documentation lives at [docs.pome.sh](https://docs.pome.sh).**
13
13
  Run `pome --help` (or `pome help <command>`) for the CLI reference, and
14
- `pome docs getting-started` to open the canonical quickstart.
14
+ `pome docs getting-started` to print the quickstart's URL.
15
15
 
16
16
  ## Install
17
17
 
@@ -40,7 +40,7 @@ local/OSS package release.
40
40
 
41
41
  ```bash
42
42
  pome login # one-time; opens the dashboard to sign in
43
- pome init # scaffolds tasks/, examples/agents/, runs/, pome.config.json
43
+ pome init # scaffolds tasks/, examples/agents/, runs/, pome.json
44
44
  pome register agent my-agent # scopes runs to this project
45
45
  pome run tasks/01-bug-happy-path.md --agent "node examples/agents/scripted-triage-agent.ts"
46
46
  pome inspect latest # trace/audit view of the last run
@@ -49,7 +49,7 @@ pome inspect latest # trace/audit view of the last run
49
49
  To capture a trace without the cloud (self-host), then get a verdict later:
50
50
 
51
51
  ```bash
52
- pome run --local tasks/01-bug-happy-path.md # captures a raw trace only no verdict
52
+ pome run --local tasks/01-bug-happy-path.md # captures a raw trace only, no verdict
53
53
  pome eval runs/01-bug-happy-path/<run-id> # uploads it for a cloud verdict
54
54
  ```
55
55
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "pome-sh",
3
- "version": "0.32.0",
4
- "git_sha": "816bd6d21eb0380e78441fd7f8e419ccb9f86ba0",
5
- "build_time": "2026-08-27T11:54:47.200Z"
3
+ "version": "0.33.1",
4
+ "git_sha": "15d61b80f3fb2ee0df893ca81c0c9e4d0afd0076",
5
+ "build_time": "2026-08-28T11:26:59.938Z"
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-TSAQYDC5.js');
186
+ const { bootTwin } = await import('./twinHarness-2OFWSVPK.js');
187
187
  harness = await bootTwin({
188
188
  twin: "github",
189
189
  seedState: void 0,
@@ -1,5 +1,5 @@
1
- import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-KNULR6S4.js';
2
- import { readSeedFileText, parseSeedFileText, soleTwinOf, seedsForTwins } from './chunk-IHKUFGYW.js';
1
+ import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-YJ5PASVX.js';
2
+ import { readSeedFileText, parseSeedFileText, soleTwinOf, seedsForTwins } from './chunk-DWOCTCSE.js';
3
3
  import { readManifest, normalizeManifestTwins } from './chunk-2V5A7NWP.js';
4
4
  import { MOUNTED_TWINS, HostedAuthError, HostedDiscardRefusedError, HostedQuotaError, HostedOrchError, HostedTrialError, agentResponseSchema, isMultiTwinSeedEnvelope } from './chunk-72CG3JNL.js';
5
5
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
@@ -39,7 +39,7 @@ var TWIN_REGISTRY = {
39
39
  defaultSeedState,
40
40
  GitHubDomain,
41
41
  openGitHubCloneDatabase
42
- } = await import('./src-56Y2R7ZQ.js');
42
+ } = await import('./src-DO3BEABU.js');
43
43
  const db = openGitHubCloneDatabase();
44
44
  const domain = new GitHubDomain(db);
45
45
  domain.seed(seedState === void 0 ? defaultSeedState() : seedState);
@@ -63,7 +63,7 @@ var TWIN_REGISTRY = {
63
63
  parseSeed: async (input) => (await import('./seed-IIMBJHAJ.js')).parseSeed(input),
64
64
  seedFields: async () => Object.keys((await import('./seed-IIMBJHAJ.js')).seedSchema.shape),
65
65
  async boot({ seedState, runId, recorder }) {
66
- const { createSlackTwinApp, openSlackTwinDatabase, SlackDomain } = await import('./src-SKCWAMVQ.js');
66
+ const { createSlackTwinApp, openSlackTwinDatabase, SlackDomain } = await import('./src-ANO374BX.js');
67
67
  const db = openSlackTwinDatabase(":memory:");
68
68
  const domain = new SlackDomain(db);
69
69
  domain.applySeed(seedState);
@@ -90,8 +90,8 @@ var TWIN_REGISTRY = {
90
90
  parseSeed: async (input) => (await import('./seed-YWDTT2WL.js')).parseSeed(input),
91
91
  seedFields: async () => Object.keys((await import('./seed-YWDTT2WL.js')).seedSchema.shape),
92
92
  async boot({ seedState, runId, recorder, twinBaseUrl }) {
93
- const stripeTwin = await import('./src-PW7U25ZX.js');
94
- const { createApp } = await import('./server-DMLORMOV.js');
93
+ const stripeTwin = await import('./src-AMLUIPYO.js');
94
+ const { createApp } = await import('./server-FBKFPGR4.js');
95
95
  const {
96
96
  applySeed: applyStripeSeed,
97
97
  createTwinStripeApp,
@@ -136,7 +136,7 @@ var TWIN_REGISTRY = {
136
136
  parseSeed: async (input) => (await import('./seed-NR6RUKXV.js')).parseSeed(input),
137
137
  seedFields: async () => Object.keys((await import('./seed-NR6RUKXV.js')).gmailSeedSchema.shape),
138
138
  async boot({ seedState, runId, recorder }) {
139
- const { createGmailTwinApp, GmailDomain, openGmailTwinDatabase, parseSeed } = await import('./src-KSLAF3I4.js');
139
+ const { createGmailTwinApp, GmailDomain, openGmailTwinDatabase, parseSeed } = await import('./src-YGMRIKFV.js');
140
140
  const db = openGmailTwinDatabase(":memory:");
141
141
  const seed = parseSeed(seedState);
142
142
  const domain = new GmailDomain(db);
@@ -165,7 +165,7 @@ var TWIN_REGISTRY = {
165
165
  LinearDomain,
166
166
  openLinearTwinDatabase,
167
167
  parseSeed
168
- } = await import('./src-FK536BIR.js');
168
+ } = await import('./src-5SOF4PDV.js');
169
169
  const db = openLinearTwinDatabase(":memory:");
170
170
  const seed = parseSeed(seedState);
171
171
  const domain = new LinearDomain(db);
@@ -181,7 +181,7 @@ var TWIN_REGISTRY = {
181
181
  }
182
182
  };
183
183
  async function createGitHubSmokeApp() {
184
- const { createGitHubCloneApp } = await import('./src-56Y2R7ZQ.js');
184
+ const { createGitHubCloneApp } = await import('./src-DO3BEABU.js');
185
185
  return createGitHubCloneApp();
186
186
  }
187
187
  function defaultPortFor(twin, env = process.env) {
@@ -1,4 +1,4 @@
1
- import { isTwinName, TWIN_REGISTRY, TWIN_NAMES } from './chunk-SDBBGCE7.js';
1
+ import { isTwinName, TWIN_REGISTRY, TWIN_NAMES } from './chunk-CNG6DQWX.js';
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { parse } from 'yaml';
4
4
 
@@ -1,5 +1,5 @@
1
- import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-KNULR6S4.js';
2
- import { createRecorder, bootTwin } from './chunk-WJFRBXL5.js';
1
+ import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-YJ5PASVX.js';
2
+ import { createRecorder, bootTwin } from './chunk-T73VMABH.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,5 +1,5 @@
1
- import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-SDBBGCE7.js';
2
- import { createFileBackedRecorderStore, createRecorderStore } from './chunk-E665XWYU.js';
1
+ import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-CNG6DQWX.js';
2
+ import { createFileBackedRecorderStore, createRecorderStore } from './chunk-VOHTQV4J.js';
3
3
 
4
4
  // src/recorder/recorder.ts
5
5
  function createRecorder(options = {}) {
@@ -418,10 +418,6 @@ var twinMeta = z.object({
418
418
  healthz: z.custom(isFunction).optional(),
419
419
  bodyReader: z.custom(isFunction).optional(),
420
420
  middleware: z.custom(isFunction).optional(),
421
- legacyMcp: z.object({
422
- aliases: z.boolean().optional(),
423
- missingTool: z.custom(isFunction).optional()
424
- }).optional(),
425
421
  pomeHealth: z.custom(isFunction).optional(),
426
422
  unsupported: z.custom(isFunction).optional(),
427
423
  pomeRoutes: z.record(z.string(), z.custom(isFunction)).optional(),
@@ -1610,25 +1606,7 @@ function createApp(definition, options = {}) {
1610
1606
  }));
1611
1607
  session.post("/mcp/call", recorder.handle({ mutation: false }, async (c) => {
1612
1608
  const raw = await readBody(c);
1613
- let call;
1614
- if (definition.legacyMcp?.aliases) {
1615
- const rec = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
1616
- const name = rec.tool ?? rec.name;
1617
- if (typeof name !== "string" || name.length === 0) {
1618
- const missing = definition.legacyMcp.missingTool;
1619
- if (missing) {
1620
- const envelope = missing();
1621
- return { status: envelope.status, body: envelope.body };
1622
- }
1623
- z.object({ tool: z.string().min(1) }).parse(rec);
1624
- }
1625
- call = {
1626
- tool: name,
1627
- arguments: rec.arguments ?? rec.params ?? {}
1628
- };
1629
- } else {
1630
- call = z.object({ tool: z.string().min(1), arguments: jsonRecord.default({}) }).parse(raw);
1631
- }
1609
+ const call = z.object({ tool: z.string().min(1), arguments: jsonRecord.default({}) }).parse(raw);
1632
1610
  setRecordedTool(c, call.tool);
1633
1611
  const tool = findTool(definition, call.tool);
1634
1612
  const parsed = tool.schema.parse(call.arguments);
@@ -1,9 +1,9 @@
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-SDBBGCE7.js';
3
+ import { isTwinName, TWIN_REGISTRY } from './chunk-CNG6DQWX.js';
4
4
  import { criterionSchema, normalizeTaskConfigKeys, finalizeResponseSchema, HostedDiscardRefusedError, HostedOrchError, HostedAuthError, HostedQuotaError, submitResultResponseSchema, createEvalSessionResponseSchema, createSessionResponseSchema, sessionPublicSchema } from './chunk-72CG3JNL.js';
5
5
  import { seedSchema, parseSeed, defaultSeedState as defaultSeedState$2 } from './chunk-HJX25USP.js';
6
- import { toTwinHttpEventRow } from './chunk-E665XWYU.js';
6
+ import { toTwinHttpEventRow } from './chunk-VOHTQV4J.js';
7
7
  import { redactEvent, redactSecrets } from './chunk-SG6ZTIMT.js';
8
8
  import { mkdir, appendFile, writeFile, readFile } from 'node:fs/promises';
9
9
  import { existsSync } from 'node:fs';
@@ -1,17 +1,17 @@
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-KIADZ7UM.js';
4
- import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-KNULR6S4.js';
3
+ import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-PNR7OHDC.js';
4
+ import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-YJ5PASVX.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import './chunk-3T5XN64P.js';
7
7
  import './chunk-Q5NBPR57.js';
8
- import { bootTwin } from './chunk-WJFRBXL5.js';
9
- import './chunk-SDBBGCE7.js';
8
+ import { bootTwin } from './chunk-T73VMABH.js';
9
+ import './chunk-CNG6DQWX.js';
10
10
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
11
11
  import { HostedQuotaError, HostedOrchError } from './chunk-72CG3JNL.js';
12
12
  import './chunk-CBFKZZBR.js';
13
13
  import './chunk-HJX25USP.js';
14
- import './chunk-E665XWYU.js';
14
+ import './chunk-VOHTQV4J.js';
15
15
  import './chunk-6KJC4BTO.js';
16
16
  import './chunk-SG6ZTIMT.js';
17
17
  import './chunk-CF6EIU2U.js';
@@ -1,15 +1,15 @@
1
1
  import { newGroupId, criterionPhrase } from './chunk-RGZBC7NF.js';
2
- import { runTaskHosted, resolveRunAgentIdentity } from './chunk-BK42YBOX.js';
3
- import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-KNULR6S4.js';
4
- import './chunk-IHKUFGYW.js';
2
+ import { runTaskHosted, resolveRunAgentIdentity } from './chunk-A2VNLUP7.js';
3
+ import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-YJ5PASVX.js';
4
+ import './chunk-DWOCTCSE.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import './chunk-3T5XN64P.js';
7
7
  import './chunk-Q5NBPR57.js';
8
- import './chunk-SDBBGCE7.js';
8
+ import './chunk-CNG6DQWX.js';
9
9
  import './chunk-2V5A7NWP.js';
10
10
  import { HostedQuotaError, HostedTrialError } from './chunk-72CG3JNL.js';
11
11
  import './chunk-HJX25USP.js';
12
- import './chunk-E665XWYU.js';
12
+ import './chunk-VOHTQV4J.js';
13
13
  import './chunk-6KJC4BTO.js';
14
14
  import './chunk-SG6ZTIMT.js';
15
15
  import './chunk-CF6EIU2U.js';
@@ -1,4 +1,4 @@
1
- export { POME_RECORDER_EVENTS_PATH, PROVIDER_SHAPED_TEAM_ID, TwinBootError, TwinError, UnknownToolError, bearerAuth, createAdminGate, createApp, createFileBackedRecorderStore, createRecorderHandle, createRecorderStore, created, ensureTwinAuthSecret, failureInjectionMiddleware, formTokenResolver, isLoopbackHost, mintProviderToken, ok, queryTokenResolver, recordedRequestHeaders, requireAdminAuth, resolveAuthSecret, resolveRecorderStore, serve, setClientIp, setRecordedTool, toTwinHttpEventRow, twinBuildInfo, verifyProviderToken } from './chunk-E665XWYU.js';
1
+ export { POME_RECORDER_EVENTS_PATH, PROVIDER_SHAPED_TEAM_ID, TwinBootError, TwinError, UnknownToolError, bearerAuth, createAdminGate, createApp, createFileBackedRecorderStore, createRecorderHandle, createRecorderStore, created, ensureTwinAuthSecret, failureInjectionMiddleware, formTokenResolver, isLoopbackHost, mintProviderToken, ok, queryTokenResolver, recordedRequestHeaders, requireAdminAuth, resolveAuthSecret, resolveRecorderStore, serve, setClientIp, setRecordedTool, toTwinHttpEventRow, twinBuildInfo, verifyProviderToken } from './chunk-VOHTQV4J.js';
2
2
  import './chunk-6KJC4BTO.js';
3
3
  export { redactEvent, redactSecrets } from './chunk-SG6ZTIMT.js';
4
4
  export { FAILURE_INJECTION_OVERRIDE_KEY, createFailureInjectionStore, failureInjectionRuleSchema } from './chunk-CF6EIU2U.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-BK42YBOX.js';
3
- import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-KIADZ7UM.js';
4
- import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-KNULR6S4.js';
5
- import '../../chunk-IHKUFGYW.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-A2VNLUP7.js';
3
+ import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-PNR7OHDC.js';
4
+ import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-YJ5PASVX.js';
5
+ import '../../chunk-DWOCTCSE.js';
6
6
  import '../../chunk-NW7HGA2K.js';
7
7
  import { GMAIL_CHECKS } from '../../chunk-JM6VS62R.js';
8
8
  import '../../chunk-3T5XN64P.js';
9
9
  import { LINEAR_CHECKS } from '../../chunk-TSOSDKXP.js';
10
10
  import '../../chunk-Q5NBPR57.js';
11
- import '../../chunk-WJFRBXL5.js';
12
- import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-SDBBGCE7.js';
11
+ import '../../chunk-T73VMABH.js';
12
+ import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-CNG6DQWX.js';
13
13
  import { readManifest, writeManifest, MANIFEST_JSON, readRequiredManifest, normalizeManifestTwins } from '../../chunk-2V5A7NWP.js';
14
14
  import '../../chunk-XDU6TD4O.js';
15
15
  import { MOUNTED_TWINS, deriveAgentSlug, exitCodeFor, HostedUsageError, HostedOrchError, HostedAuthError, HostedQuotaError } from '../../chunk-72CG3JNL.js';
@@ -18,7 +18,7 @@ import { TAPE_ASSERTABLE_TOOLS } from '../../chunk-C4BVTUA3.js';
18
18
  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
- import '../../chunk-E665XWYU.js';
21
+ import '../../chunk-VOHTQV4J.js';
22
22
  import { eventSchema, isLegacyEventRow } from '../../chunk-6KJC4BTO.js';
23
23
  import { redactEvent, redactSecrets } from '../../chunk-SG6ZTIMT.js';
24
24
  import '../../chunk-CF6EIU2U.js';
@@ -821,7 +821,7 @@ async function throwForStatus(res) {
821
821
 
822
822
  // src/task/seed-verifier.ts
823
823
  async function verifySeedWithTwin(seed) {
824
- const { GitHubDomain, openGitHubCloneDatabase } = await import('../../src-56Y2R7ZQ.js');
824
+ const { GitHubDomain, openGitHubCloneDatabase } = await import('../../src-DO3BEABU.js');
825
825
  const db = openGitHubCloneDatabase(":memory:");
826
826
  try {
827
827
  new GitHubDomain(db).seed(seed);
@@ -4622,7 +4622,7 @@ var DEFAULT_AGENT_COMMAND = `node ${DEFAULT_AGENT_FILE}`;
4622
4622
  var MANIFEST_SCHEMA_URL = "https://pome.sh/schemas/v1/pome.json";
4623
4623
  var MAX_UNREADABLE_PATHS_SHOWN = 5;
4624
4624
  function readPackageVersion() {
4625
- if ("0.32.0".length > 0) return "0.32.0";
4625
+ if ("0.33.1".length > 0) return "0.33.1";
4626
4626
  try {
4627
4627
  const here = dirname(fileURLToPath(import.meta.url));
4628
4628
  const candidates = [
@@ -4643,9 +4643,9 @@ function readPackageVersion() {
4643
4643
  function createProgram() {
4644
4644
  const program = new Command();
4645
4645
  program.name("pome").description(
4646
- "Digital-twin testing for AI agents \u2014 `pome run` records to app.pome.sh. See `pome docs getting-started`."
4646
+ "Test AI agents against digital twins of real SaaS APIs. Runs are recorded to app.pome.sh. Start with `pome demo`."
4647
4647
  ).version(PACKAGE_VERSION).showHelpAfterError("(add --help for usage)");
4648
- program.command("init").description("Create starter Pome config and folders").option(
4648
+ program.command("init").summary("Set up Pome in this project").description("Create pome.json, plus starter files in a new project").option(
4649
4649
  "--sdk <name>",
4650
4650
  "Scaffold for a specific agent SDK (claude | claude-managed). Adds the SDK-specific example file and pre-fills agent.framework so the dashboard badges runs correctly."
4651
4651
  ).option(
@@ -4720,7 +4720,7 @@ function createProgram() {
4720
4720
  }
4721
4721
  console.error(postInitMessage);
4722
4722
  });
4723
- program.command("login").description("Sign in with Clerk and store a hosted team API key (macOS Keychain or ~/.pome/credentials.json)").option(
4723
+ program.command("login").summary("Sign in and save an API key").description("Sign in with Clerk and store a hosted team API key (macOS Keychain or ~/.pome/credentials.json)").option(
4724
4724
  "--api-url <url>",
4725
4725
  "Control-plane base URL.",
4726
4726
  process.env.POME_API_URL ?? DEFAULT_CONTROL_PLANE_URL
@@ -4737,14 +4737,14 @@ function createProgram() {
4737
4737
  await loginWithClerk(options);
4738
4738
  }
4739
4739
  );
4740
- program.command("logout").description("Remove locally stored hosted credentials (Keychain entry and/or ~/.pome/credentials.json)").action(async () => {
4740
+ program.command("logout").summary("Delete the saved API key").description("Remove locally stored hosted credentials (Keychain entry and/or ~/.pome/credentials.json)").action(async () => {
4741
4741
  await clearLocalCredentials();
4742
4742
  console.error("Removed local Pome credentials.");
4743
4743
  console.error(
4744
4744
  "Server-side keys are not auto-revoked \u2014 revoke API keys from the dashboard if this device was lost."
4745
4745
  );
4746
4746
  });
4747
- program.command("docs").argument("[topic]", "Topic id (e.g. getting-started, github, cli) \u2014 prints the docs.pome.sh URL").option(
4747
+ program.command("docs").summary("Print a docs.pome.sh URL by topic").argument("[topic]", "Topic id (e.g. getting-started, github, cli) \u2014 prints the docs.pome.sh URL").option(
4748
4748
  "--site <origin>",
4749
4749
  "Override docs site origin (default https://docs.pome.sh)"
4750
4750
  ).option(
@@ -4756,7 +4756,7 @@ function createProgram() {
4756
4756
  ).action(async (topic, opts) => {
4757
4757
  await runDocsCommand(topic, { site: opts.site, urlOnly: Boolean(opts.url) });
4758
4758
  });
4759
- program.command("tasks").argument(
4759
+ program.command("tasks").summary("List or copy the bundled tasks").argument(
4760
4760
  "[twin]",
4761
4761
  "Twin id (e.g. github). Omit to list available twins."
4762
4762
  ).option(
@@ -4781,7 +4781,7 @@ function createProgram() {
4781
4781
  });
4782
4782
  }
4783
4783
  );
4784
- const checks = program.command("checks").argument("[twin]", "Twin id (e.g. github). Omit to list twins that declare checks.").option("--json", "Emit the declaration as JSON (for skills and agents).", false).description(
4784
+ const checks = program.command("checks").summary("List, add, and lint a twin's checks").argument("[twin]", "Twin id (e.g. github). Omit to list twins that declare checks.").option("--json", "Emit the declaration as JSON (for skills and agents).", false).description(
4785
4785
  "Browse the typed checks a twin declares \u2014 the closed set a [code] criterion is graded by"
4786
4786
  ).action(async (twin2, opts) => {
4787
4787
  await runChecksCommand(twin2, { json: opts.json });
@@ -4807,7 +4807,7 @@ function createProgram() {
4807
4807
  checks.command("lint").argument("<file...>", "Task markdown file(s) \u2014 shell globs work: tasks/*.md").description("Report [code] criteria that bind no declared check, so are never graded").action(async (files) => {
4808
4808
  await runChecksLintCommand(files);
4809
4809
  });
4810
- program.command("compile-seeds").argument("[target]", "Task .md file or directory (defaults to ./tasks)").option("--force", "Recompile even if the sidecar's source hash matches", false).option(
4810
+ program.command("compile-seeds").summary("Compile a task's seed state to JSON").argument("[target]", "Task .md file or directory (defaults to ./tasks)").option("--force", "Recompile even if the sidecar's source hash matches", false).option(
4811
4811
  "--hosted",
4812
4812
  "Compile via the Pome control plane instead of calling Anthropic directly (uses your Pome API key; no ANTHROPIC_API_KEY needed)",
4813
4813
  false
@@ -4825,7 +4825,7 @@ function createProgram() {
4825
4825
  });
4826
4826
  if (code !== 0) process.exitCode = code;
4827
4827
  });
4828
- const register = program.command("register").description(
4828
+ const register = program.command("register").summary("Register an agent with Pome").description(
4829
4829
  "Register a cloud entity (agent, ...) and link this project to it"
4830
4830
  );
4831
4831
  register.command("agent").argument("<name>", 'Human-readable agent name (e.g. "triage-bot")').option(
@@ -4857,7 +4857,7 @@ function createProgram() {
4857
4857
  }
4858
4858
  }
4859
4859
  );
4860
- const session = program.command("sandbox").description(
4860
+ const session = program.command("sandbox").summary("Create, list, and stop sandboxes").description(
4861
4861
  "Hosted sandboxes (same API as the dashboard Twins page \u2014 requires login)"
4862
4862
  );
4863
4863
  session.command("create").description("Create a hosted sandbox for one or more twins and print its connection info").option(
@@ -4972,7 +4972,7 @@ function createProgram() {
4972
4972
  }
4973
4973
  }
4974
4974
  );
4975
- program.command("run").argument(
4975
+ program.command("run").summary("Run a task and print the score").argument(
4976
4976
  "[path]",
4977
4977
  'Task markdown file or directory. Omit to run the demo task ("that was ours, run yours"): tasks/first-run-demo.md is dropped into your project on first use with runs: 5 pinned.'
4978
4978
  ).option("--agent <command>", "Agent command to run").option(
@@ -5069,7 +5069,7 @@ function createProgram() {
5069
5069
  return;
5070
5070
  }
5071
5071
  {
5072
- const { runDoctorChecks } = await import('../../checks-KGDGQ35O.js');
5072
+ const { runDoctorChecks } = await import('../../checks-CAP2CSEW.js');
5073
5073
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5074
5074
  const doctorReport = await runDoctorChecks({ mode: useLocal ? "full" : "hosted" });
5075
5075
  if (!doctorReport.ok) {
@@ -5107,7 +5107,7 @@ function createProgram() {
5107
5107
  taskForRuns.config.runs
5108
5108
  );
5109
5109
  if (k > 1) {
5110
- const { runTrialGroup } = await import('../../runTrialGroup-W7C4Z5DN.js');
5110
+ const { runTrialGroup } = await import('../../runTrialGroup-UBN46ZEJ.js');
5111
5111
  const fileForRerun = relative(process.cwd(), file);
5112
5112
  const rerunCommand = defaultTask ? options.trials !== void 0 ? `pome run -n ${k}` : "pome run" : `pome run ${fileForRerun && !fileForRerun.startsWith("..") ? fileForRerun : file} -n ${k}`;
5113
5113
  const groupResult = await runTrialGroup({
@@ -5183,7 +5183,7 @@ function createProgram() {
5183
5183
  process.exitCode = worstExit;
5184
5184
  }
5185
5185
  );
5186
- program.command("demo").description(
5186
+ program.command("demo").summary("Run a sample task, no account needed").description(
5187
5187
  "Zero-auth first-run demo: boots a local GitHub twin, runs the bundled demo agent for 5 isolated trials (model calls via pome's anonymous demo gateway), and prints per-trial verdicts evaluated in Pome cloud. No signup, no API keys; ends with a no-login preview link."
5188
5188
  ).option(
5189
5189
  "--api-url <url>",
@@ -5201,7 +5201,7 @@ function createProgram() {
5201
5201
  process.exitCode = 5;
5202
5202
  return;
5203
5203
  }
5204
- const { runDemo } = await import('../../runDemo-3JEAM6CM.js');
5204
+ const { runDemo } = await import('../../runDemo-6WD2RSIH.js');
5205
5205
  const result = await runDemo({
5206
5206
  apiBase: opts.apiUrl.replace(/\/$/, ""),
5207
5207
  dashboardBase: process.env.POME_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL,
@@ -5216,16 +5216,16 @@ function createProgram() {
5216
5216
  const code = await runDemoAgentCommand();
5217
5217
  if (code !== 0) process.exitCode = code;
5218
5218
  });
5219
- program.command("doctor").description(
5219
+ program.command("doctor").summary("Check the agent and twin wiring").description(
5220
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."
5221
5221
  ).action(async () => {
5222
- const { runDoctorChecks } = await import('../../checks-KGDGQ35O.js');
5222
+ const { runDoctorChecks } = await import('../../checks-CAP2CSEW.js');
5223
5223
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5224
5224
  const report = await runDoctorChecks();
5225
5225
  for (const line of renderDoctorReport(report, { passNote: true })) console.error(line);
5226
5226
  if (!report.ok) process.exitCode = 1;
5227
5227
  });
5228
- program.command("eval").argument(
5228
+ program.command("eval").summary("Score a trace recorded earlier").argument(
5229
5229
  "[run-dir]",
5230
5230
  "Existing run directory (runs/<task>/<run-id>). Omit to use <artifacts-dir>/latest.json."
5231
5231
  ).option(
@@ -5267,7 +5267,7 @@ function createProgram() {
5267
5267
  for (const line of renderEvents(eventsResult.events)) console.log(line);
5268
5268
  }
5269
5269
  });
5270
- program.command("fix-prompt").argument(
5270
+ program.command("fix-prompt").summary("Build a prompt for a failed run").argument(
5271
5271
  "[target]",
5272
5272
  "Artifacts root or a trial run dir (default: runs). Legacy form: a path to events.jsonl \u2014 then <task> is required."
5273
5273
  ).argument(
@@ -5383,7 +5383,7 @@ function createProgram() {
5383
5383
  })
5384
5384
  );
5385
5385
  });
5386
- const twin = program.command("twin").description("Manage local twins");
5386
+ const twin = program.command("twin").summary("Run a twin on this machine").description("Start and reset a twin on this machine, print its status or a starter seed file");
5387
5387
  twin.command("start").argument(
5388
5388
  "[name]",
5389
5389
  `Twin name (${TWIN_NAME_LIST.join(" | ")}). Optional when --seed names exactly one twin.`
@@ -5396,7 +5396,7 @@ function createProgram() {
5396
5396
  ).description(
5397
5397
  "Start a standalone twin as a long-lived foreground server (Ctrl-C to stop)"
5398
5398
  ).action(async (name, options) => {
5399
- const { runTwinStartCommand } = await import('../../twinStart-VUCN4CFY.js');
5399
+ const { runTwinStartCommand } = await import('../../twinStart-2ZNLS3ON.js');
5400
5400
  await runTwinStartCommand(name, options);
5401
5401
  });
5402
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.").option(
@@ -5405,7 +5405,7 @@ function createProgram() {
5405
5405
  ).description(
5406
5406
  "Print a starter seed file for a twin, generated from the twin's own starting state"
5407
5407
  ).action(async (names, options) => {
5408
- const { runTwinSeedCommand } = await import('../../twinSeed-QCYKAY3I.js');
5408
+ const { runTwinSeedCommand } = await import('../../twinSeed-2MRVMNIT.js');
5409
5409
  await runTwinSeedCommand(names, options);
5410
5410
  });
5411
5411
  twin.command("reset").argument("[name]", "Twin name (default: github)", "github").description("Reset standalone twin state").action(async (name) => {
@@ -5428,7 +5428,7 @@ function createProgram() {
5428
5428
  }
5429
5429
  console.log(await import('node:fs/promises').then((fs) => fs.readFile(".pome/twin-status.json", "utf8")));
5430
5430
  });
5431
- program.command("endpoints").argument("<name>", "Twin name").description("List supported endpoints").action((name) => {
5431
+ program.command("endpoints").summary("List a twin's endpoints").argument("<name>", "Twin name").description("List the endpoints the github or gmail twin serves").action((name) => {
5432
5432
  const endpoints = name === "github" ? SUPPORTED_GITHUB_ENDPOINTS : name === "gmail" ? SUPPORTED_GMAIL_ENDPOINTS : null;
5433
5433
  if (!endpoints) {
5434
5434
  throw new Error("Endpoint listing is available for: github, gmail.");
@@ -5437,7 +5437,7 @@ function createProgram() {
5437
5437
  console.log(`${endpoint} semantic`);
5438
5438
  }
5439
5439
  });
5440
- program.command("capture-server").description(
5440
+ program.command("capture-server").summary("Record the agent's model calls").description(
5441
5441
  "Boot an HTTP CONNECT-tunnel proxy that appends one LlmCallEvent per tunnel to events.jsonl. Spawned by `pome run`; agent traffic flows via HTTPS_PROXY."
5442
5442
  ).option("--port <port>", "TCP port to listen on (0 = ephemeral).", "8910").option(
5443
5443
  "--events-out <path>",
@@ -3,7 +3,7 @@ import { MCP_PAGE_MAX, defaultSeedState, linearSeedSchema, notFound, badUserInpu
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';
5
5
  import { routeInputDeclarer, mountDeclaredRoute, UndeclaredInputError } from './chunk-IZFM7W2V.js';
6
- import { loadMcpToolFixture, deriveMcpToolTable, openTwinDatabase, defineTwin, createApp } from './chunk-E665XWYU.js';
6
+ import { loadMcpToolFixture, deriveMcpToolTable, openTwinDatabase, defineTwin, createApp } from './chunk-VOHTQV4J.js';
7
7
  import './chunk-6KJC4BTO.js';
8
8
  import './chunk-SG6ZTIMT.js';
9
9
  import './chunk-CF6EIU2U.js';
@@ -1,5 +1,5 @@
1
1
  import { routeInputDeclarer, bracketedQuery, integerInput, booleanInput, mountDeclaredRoute, UndeclaredInputError } from './chunk-IZFM7W2V.js';
2
- import { loadMcpToolFixture, openTwinDatabase, defineTwin, twinBuildInfo, deriveMcpToolTable, failureInjectionMiddleware, createApp, recordedRequestHeaders, UnknownToolError } from './chunk-E665XWYU.js';
2
+ import { loadMcpToolFixture, openTwinDatabase, defineTwin, twinBuildInfo, deriveMcpToolTable, failureInjectionMiddleware, createApp, recordedRequestHeaders, UnknownToolError } from './chunk-VOHTQV4J.js';
3
3
  import './chunk-6KJC4BTO.js';
4
4
  import './chunk-SG6ZTIMT.js';
5
5
  import { defaultSeed, seedSchema, ensureMigratedColumns, ensureStripeTables, resetStripeTables, looksLikeApiKey, resolveSidFromKey, applySeed, newId, newClientSecret, nowUnix, requestId, nowIso } from './chunk-SLTBPJKZ.js';
@@ -3,7 +3,7 @@ import './chunk-JWJYNAWI.js';
3
3
  import { defaultSeedState, parseSeed } from './chunk-ZDS25NS5.js';
4
4
  export { defaultSeedState, loadSeedFromEnv, parseSeed, seedSchema } from './chunk-ZDS25NS5.js';
5
5
  import { routeInputDeclarer, booleanInput, integerInput, mountDeclaredRoute, UndeclaredInputError } from './chunk-IZFM7W2V.js';
6
- import { loadMcpToolFixture, defineTwin, queryTokenResolver, formTokenResolver, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-E665XWYU.js';
6
+ import { loadMcpToolFixture, defineTwin, queryTokenResolver, formTokenResolver, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-VOHTQV4J.js';
7
7
  import './chunk-6KJC4BTO.js';
8
8
  import './chunk-SG6ZTIMT.js';
9
9
  import './chunk-CF6EIU2U.js';
@@ -3101,12 +3101,6 @@ var slackTwinDefinition = defineTwin({
3101
3101
  // engine-owned surface — official Slack SDKs default to
3102
3102
  // application/x-www-form-urlencoded — and malformed JSON collapses to {}.
3103
3103
  bodyReader: (c) => parseFormOrJson(c),
3104
- // Frozen legacy /mcp/call surface: {name}/{params} alias keys; a body
3105
- // naming no tool answers 400 {ok:false, error:"invalid_arguments"}.
3106
- legacyMcp: {
3107
- aliases: true,
3108
- missingTool: () => ({ status: 400, body: slackError2("invalid_arguments") })
3109
- },
3110
3104
  // Frozen /_pome/health shape: exactly {ok, twin} — no extras.
3111
3105
  pomeHealth: () => ({}),
3112
3106
  state: ({ domain }) => domain.exportState(),
@@ -2,7 +2,7 @@ import './chunk-C4BVTUA3.js';
2
2
  import { defaultSeedState, parseSeed } from './chunk-HJX25USP.js';
3
3
  export { defaultSeedState, parseSeed, seedSchema } from './chunk-HJX25USP.js';
4
4
  import { routeInputDeclarer, integerInput, mountDeclaredRoute, UndeclaredInputError, MalformedBodyError } from './chunk-IZFM7W2V.js';
5
- import { loadMcpToolFixture, defineTwin, twinBuildInfo, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-E665XWYU.js';
5
+ import { loadMcpToolFixture, defineTwin, twinBuildInfo, deriveMcpToolTable, UnknownToolError, openTwinDatabase, createApp, typeDisagreements } from './chunk-VOHTQV4J.js';
6
6
  import './chunk-6KJC4BTO.js';
7
7
  import './chunk-SG6ZTIMT.js';
8
8
  import './chunk-CF6EIU2U.js';
@@ -3,7 +3,7 @@ import { gmailErrorEnvelope, gmailSeedSchema, parseSeed, defaultSeedState, notFo
3
3
  export { DEFAULT_GMAIL_AGENT_EMAIL, GmailError, SEARCH_MAILBOX_MESSAGE_BUDGET, agentPathInboxMailbox, defaultSeedState, gmailErrorEnvelope, gmailSeedSchema, loadSeedFromEnv, parseSearchQuery, parseSeed, validateSearchQuery } from './chunk-3T5XN64P.js';
4
4
  import './chunk-JWJYNAWI.js';
5
5
  import { routeInputDeclarer, integerInput, booleanInput, repeatedInput, mountDeclaredRoute, UndeclaredInputError, MalformedBodyError } from './chunk-IZFM7W2V.js';
6
- import { loadMcpToolFixture, deriveMcpToolTable, defineTwin, openTwinDatabase, createApp } from './chunk-E665XWYU.js';
6
+ import { loadMcpToolFixture, deriveMcpToolTable, defineTwin, openTwinDatabase, createApp } from './chunk-VOHTQV4J.js';
7
7
  import './chunk-6KJC4BTO.js';
8
8
  import './chunk-SG6ZTIMT.js';
9
9
  import './chunk-CF6EIU2U.js';
@@ -0,0 +1,6 @@
1
+ export { UnsupportedTwinError, bootTwin } from './chunk-T73VMABH.js';
2
+ export { STRIPE_LOCAL_ACCOUNT_ID } from './chunk-CNG6DQWX.js';
3
+ import './chunk-VOHTQV4J.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-SDBBGCE7.js';
1
+ import { TWIN_NAMES, isTwinName, TWIN_REGISTRY } from './chunk-CNG6DQWX.js';
2
2
  import { writeFile } from 'node:fs/promises';
3
3
 
4
4
  async function generateSeedFile(twins, opts = {}) {
@@ -1,7 +1,7 @@
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
- import './chunk-E665XWYU.js';
1
+ import { readSeedFileText, seedForTwin, parseSeedFileText, soleTwinOf, twinsNamedBy } from './chunk-DWOCTCSE.js';
2
+ import { bootTwin } from './chunk-T73VMABH.js';
3
+ import { TWIN_REGISTRY, isTwinName, TWIN_NAMES, defaultPortFor } from './chunk-CNG6DQWX.js';
4
+ import './chunk-VOHTQV4J.js';
5
5
  import './chunk-6KJC4BTO.js';
6
6
  import './chunk-SG6ZTIMT.js';
7
7
  import './chunk-CF6EIU2U.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.32.0",
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.",
3
+ "version": "0.33.1",
4
+ "description": "Test AI agents against digital twins of real SaaS APIs. Records tool-call traces and scores them on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",
7
7
  "agents",
@@ -1,6 +0,0 @@
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';