toolcraft 0.0.53 → 0.0.55

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 (2) hide show
  1. package/dist/cli.js +84 -20
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -887,6 +887,31 @@ function describeHelpValueToken(schema, field) {
887
887
  }
888
888
  return describeFieldNameValueToken(field.displayPath, field.optionFlag) ?? "value";
889
889
  }
890
+ function formatCompactEnumSignatureToken(schema) {
891
+ if (schema.kind !== "enum" || schema.values.length < 2 || schema.values.length > 3) {
892
+ return undefined;
893
+ }
894
+ const tokens = schema.values.map((value) => String(value));
895
+ const compact = tokens.every((token) => token.length > 0 &&
896
+ token.length <= 24 &&
897
+ token.trim() === token &&
898
+ !token.includes("|") &&
899
+ !token.includes("\t") &&
900
+ !token.includes("\n") &&
901
+ !token.includes("\r") &&
902
+ !token.includes(" "));
903
+ return compact ? tokens.join("|") : undefined;
904
+ }
905
+ function formatCommandParameterFieldFlags(field, globalLongOptionFlags) {
906
+ if (field.positionalIndex !== undefined || field.schema.kind === "boolean") {
907
+ return formatHelpFieldFlags(field, globalLongOptionFlags);
908
+ }
909
+ const enumToken = formatCompactEnumSignatureToken(field.schema);
910
+ if (enumToken !== undefined) {
911
+ return `${formatOptionFlags(field, globalLongOptionFlags)} ${enumToken}`;
912
+ }
913
+ return formatHelpFieldFlags(field, globalLongOptionFlags);
914
+ }
890
915
  function describeDynamicFieldType(field) {
891
916
  if (field.schema.kind === "record") {
892
917
  const valueSchema = unwrapOptional(field.schema.value);
@@ -1035,7 +1060,7 @@ function formatCommandParameterTokens(command, casing, globalLongOptionFlags) {
1035
1060
  const fields = assignPositionals(collected.fields, command.positional);
1036
1061
  return fields
1037
1062
  .filter((field) => field.global !== true)
1038
- .map((field) => wrapOptionalCommandParameterToken(formatHelpFieldFlags(field, globalLongOptionFlags), field.positionalIndex === undefined && (field.optional || field.hasDefault)))
1063
+ .map((field) => wrapOptionalCommandParameterToken(formatCommandParameterFieldFlags(field, globalLongOptionFlags), field.positionalIndex === undefined && (field.optional || field.hasDefault)))
1039
1064
  .concat(collected.dynamicFields.flatMap((field) => formatCommandDynamicParameterTokens(field, casing)));
1040
1065
  }
1041
1066
  function formatCommandRowName(node, casing, globalLongOptionFlags) {
@@ -2011,6 +2036,40 @@ function renderApprovalDeclined(error) {
2011
2036
  logger.error(error.message);
2012
2037
  process.exitCode = 1;
2013
2038
  }
2039
+ function renderCliErrorPattern(pattern) {
2040
+ const logger = createLogger();
2041
+ if (pattern.kind === "usage") {
2042
+ logger.error(appendUsagePointer(pattern.message, {
2043
+ rootUsageName: pattern.rootUsageName,
2044
+ commandPath: pattern.commandPath
2045
+ }));
2046
+ process.exitCode = 1;
2047
+ return;
2048
+ }
2049
+ if (pattern.kind === "runtime-user") {
2050
+ logger.error(pattern.message);
2051
+ process.exitCode = 1;
2052
+ return;
2053
+ }
2054
+ if (pattern.kind === "toolcraft-bug") {
2055
+ logger.error(`toolcraft hit an internal invariant: ${pattern.error.message}\n` +
2056
+ `This is a bug in toolcraft or in the command definition; ` +
2057
+ `it cannot be worked around by changing argv. ` +
2058
+ `Re-run with --debug for a stack trace and file an issue.`);
2059
+ if (pattern.debugStackMode !== undefined && pattern.error.stack) {
2060
+ process.stderr.write(`${formatDebugStack(pattern.error.stack, pattern.debugStackMode)}\n`);
2061
+ }
2062
+ process.exitCode = 1;
2063
+ return;
2064
+ }
2065
+ logger.error(pattern.debugStackMode !== undefined
2066
+ ? pattern.message
2067
+ : `${pattern.message} Use --debug for a stack trace.`);
2068
+ if (pattern.debugStackMode !== undefined && pattern.stack !== undefined) {
2069
+ process.stderr.write(`${formatDebugStack(pattern.stack, pattern.debugStackMode)}\n`);
2070
+ }
2071
+ process.exitCode = 1;
2072
+ }
2014
2073
  function validateServices(services) {
2015
2074
  for (const name of Object.keys(services)) {
2016
2075
  if (RESERVED_SERVICE_NAMES.has(name)) {
@@ -2837,22 +2896,25 @@ function renderHttpError(error, options) {
2837
2896
  function handleRunError(error, options) {
2838
2897
  const logger = createLogger();
2839
2898
  if (error instanceof UserError) {
2840
- logger.error(appendUsagePointer(error.message, {
2841
- rootUsageName: options.rootUsageName,
2842
- commandPath: options.commandPath
2843
- }));
2844
- process.exitCode = 1;
2899
+ renderCliErrorPattern(options.userErrorPattern === "usage"
2900
+ ? {
2901
+ kind: "usage",
2902
+ message: error.message,
2903
+ rootUsageName: options.rootUsageName,
2904
+ commandPath: options.commandPath
2905
+ }
2906
+ : {
2907
+ kind: "runtime-user",
2908
+ message: error.message
2909
+ });
2845
2910
  return;
2846
2911
  }
2847
2912
  if (error instanceof Error && error.name === "ToolcraftBugError") {
2848
- logger.error(`toolcraft hit an internal invariant: ${error.message}\n` +
2849
- `This is a bug in toolcraft or in the command definition; ` +
2850
- `it cannot be worked around by changing argv. ` +
2851
- `Re-run with --debug for a stack trace and file an issue.`);
2852
- if (options.debugStackMode !== undefined && error.stack) {
2853
- process.stderr.write(`${formatDebugStack(error.stack, options.debugStackMode)}\n`);
2854
- }
2855
- process.exitCode = 1;
2913
+ renderCliErrorPattern({
2914
+ kind: "toolcraft-bug",
2915
+ error,
2916
+ debugStackMode: options.debugStackMode
2917
+ });
2856
2918
  return;
2857
2919
  }
2858
2920
  if (error instanceof CommanderError) {
@@ -2891,11 +2953,12 @@ function handleRunError(error, options) {
2891
2953
  return;
2892
2954
  }
2893
2955
  const message = error instanceof Error ? error.message : String(error);
2894
- logger.error(options.debugStackMode !== undefined ? message : `${message} Use --debug for a stack trace.`);
2895
- if (options.debugStackMode !== undefined && error instanceof Error && error.stack) {
2896
- process.stderr.write(`${formatDebugStack(error.stack, options.debugStackMode)}\n`);
2897
- }
2898
- process.exitCode = 1;
2956
+ renderCliErrorPattern({
2957
+ kind: "unexpected",
2958
+ message,
2959
+ stack: error instanceof Error ? error.stack : undefined,
2960
+ debugStackMode: options.debugStackMode
2961
+ });
2899
2962
  }
2900
2963
  function formatCommanderErrorMessage(error) {
2901
2964
  return error.message.startsWith("error:") ? error.message : `error: ${error.message}`;
@@ -3195,7 +3258,8 @@ export async function runCLI(roots, options = {}) {
3195
3258
  program,
3196
3259
  argv: process.argv,
3197
3260
  rootUsageName,
3198
- commandPath: resolvedCommandPath
3261
+ commandPath: resolvedCommandPath,
3262
+ userErrorPattern: errorReportContext?.params === undefined ? "usage" : "runtime-user"
3199
3263
  });
3200
3264
  }
3201
3265
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toolcraft",
3
- "version": "0.0.53",
3
+ "version": "0.0.55",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -47,7 +47,7 @@
47
47
  "postpack": "node ../../scripts/manage-bundled-workspace-deps.mjs cleanup . toolcraft-design @poe-code/frontmatter @poe-code/agent-mcp-config @poe-code/agent-human-in-loop @poe-code/task-list @poe-code/agent-defs @poe-code/config-mutations @poe-code/process-runner tiny-mcp-client mcp-oauth auth-store"
48
48
  },
49
49
  "dependencies": {
50
- "toolcraft-schema": "0.0.53",
50
+ "toolcraft-schema": "0.0.55",
51
51
  "commander": "^14.0.3",
52
52
  "fast-string-width": "^3.0.2",
53
53
  "fast-wrap-ansi": "^0.2.0",