@agentuity/cli 0.0.106 → 0.0.108

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 (74) hide show
  1. package/dist/cmd/build/entry-generator.d.ts.map +1 -1
  2. package/dist/cmd/build/entry-generator.js +43 -50
  3. package/dist/cmd/build/entry-generator.js.map +1 -1
  4. package/dist/cmd/build/index.d.ts.map +1 -1
  5. package/dist/cmd/build/index.js +9 -9
  6. package/dist/cmd/build/index.js.map +1 -1
  7. package/dist/cmd/build/typecheck.d.ts +23 -0
  8. package/dist/cmd/build/typecheck.d.ts.map +1 -0
  9. package/dist/cmd/build/typecheck.js +38 -0
  10. package/dist/cmd/build/typecheck.js.map +1 -0
  11. package/dist/cmd/build/vite/metadata-generator.d.ts +2 -1
  12. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
  13. package/dist/cmd/build/vite/metadata-generator.js +14 -0
  14. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  15. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  16. package/dist/cmd/build/vite/vite-asset-server-config.js +15 -8
  17. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  18. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -1
  19. package/dist/cmd/build/vite/vite-asset-server.js +6 -2
  20. package/dist/cmd/build/vite/vite-asset-server.js.map +1 -1
  21. package/dist/cmd/build/vite/vite-builder.d.ts +2 -1
  22. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  23. package/dist/cmd/build/vite/vite-builder.js +15 -2
  24. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  25. package/dist/cmd/build/vite-bundler.d.ts +2 -1
  26. package/dist/cmd/build/vite-bundler.d.ts.map +1 -1
  27. package/dist/cmd/build/vite-bundler.js +2 -1
  28. package/dist/cmd/build/vite-bundler.js.map +1 -1
  29. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  30. package/dist/cmd/cloud/deploy.js +50 -24
  31. package/dist/cmd/cloud/deploy.js.map +1 -1
  32. package/dist/cmd/dev/index.d.ts.map +1 -1
  33. package/dist/cmd/dev/index.js +623 -578
  34. package/dist/cmd/dev/index.js.map +1 -1
  35. package/dist/schema-parser.d.ts.map +1 -1
  36. package/dist/schema-parser.js +17 -3
  37. package/dist/schema-parser.js.map +1 -1
  38. package/dist/tsc-output-parser.d.ts +54 -0
  39. package/dist/tsc-output-parser.d.ts.map +1 -0
  40. package/dist/tsc-output-parser.js +926 -0
  41. package/dist/tsc-output-parser.js.map +1 -0
  42. package/dist/tui.d.ts +77 -0
  43. package/dist/tui.d.ts.map +1 -1
  44. package/dist/tui.js +27 -2
  45. package/dist/tui.js.map +1 -1
  46. package/dist/types.d.ts +24 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js +22 -0
  49. package/dist/types.js.map +1 -1
  50. package/dist/typescript-errors.d.ts +26 -0
  51. package/dist/typescript-errors.d.ts.map +1 -0
  52. package/dist/typescript-errors.js +249 -0
  53. package/dist/typescript-errors.js.map +1 -0
  54. package/package.json +4 -4
  55. package/src/cmd/build/entry-generator.ts +43 -51
  56. package/src/cmd/build/index.ts +13 -10
  57. package/src/cmd/build/typecheck.ts +55 -0
  58. package/src/cmd/build/vite/metadata-generator.ts +17 -1
  59. package/src/cmd/build/vite/vite-asset-server-config.ts +17 -8
  60. package/src/cmd/build/vite/vite-asset-server.ts +6 -2
  61. package/src/cmd/build/vite/vite-builder.ts +16 -3
  62. package/src/cmd/build/vite-bundler.ts +4 -1
  63. package/src/cmd/cloud/deploy.ts +68 -32
  64. package/src/cmd/dev/index.ts +713 -657
  65. package/src/schema-parser.ts +17 -3
  66. package/src/tsc-output-parser.ts +1115 -0
  67. package/src/tui.ts +40 -2
  68. package/src/types.ts +25 -0
  69. package/src/typescript-errors.ts +382 -0
  70. package/dist/schemas/deploy.d.ts +0 -24
  71. package/dist/schemas/deploy.d.ts.map +0 -1
  72. package/dist/schemas/deploy.js +0 -26
  73. package/dist/schemas/deploy.js.map +0 -1
  74. package/src/schemas/deploy.ts +0 -28
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EACN,gBAAgB,EAChB,mBAAmB,IAAI,yBAAyB,GAChD,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AAG/B,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAI5B,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IAC3C,IAAI,EAAE,GAAG;SACP,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACpD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAChF,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC3E,OAAO,EAAE,GAAG;SACV,MAAM,CAAC;QACP,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACvE,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC5C,SAAS,EAAE,GAAG;SACZ,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,aAAa,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACtE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAChE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC9D,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAClE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACtE,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC1D,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAClE,kBAAkB,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KAC1F,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACxC,WAAW,EAAE,GAAG;SACd,MAAM,CAAC;QACP,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAClF,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1F,mBAAmB,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACxF,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAClE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC5E,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,kBAAkB,CAAC;IAC9B,OAAO,EAAE,GAAG;SACV,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACzE,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;CAC5C,CAAC,CAAC;AAsSH,MAAM,UAAU,gBAAgB,CAM9B,UAiCD;IACA,OAAO,UAA6C,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAM3B,UAoCD;IACA,OAAO,UAA0C,CAAC;AACnD,CAAC;AA2GD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACnD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IACxF,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAChF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EACN,gBAAgB,EAChB,mBAAmB,IAAI,yBAAyB,GAChD,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AAG/B,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAI5B,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IAC3C,IAAI,EAAE,GAAG;SACP,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACnE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QACpD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAChF,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC3E,OAAO,EAAE,GAAG;SACV,MAAM,CAAC;QACP,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACvE,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;IAC5C,SAAS,EAAE,GAAG;SACZ,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC/D,aAAa,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACtE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAChE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC9D,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAClE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACtE,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC1D,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAClE,kBAAkB,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KAC1F,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,4BAA4B,CAAC;IACxC,WAAW,EAAE,GAAG;SACd,MAAM,CAAC;QACP,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAClF,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC1F,mBAAmB,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACxF,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAClE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC5E,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,kBAAkB,CAAC;IAC9B,OAAO,EAAE,GAAG;SACV,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACxE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACzE,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;CAC5C,CAAC,CAAC;AAsSH,MAAM,UAAU,gBAAgB,CAM9B,UAiCD;IACA,OAAO,UAA6C,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAM3B,UAoCD;IACA,OAAO,UAA0C,CAAC;AACnD,CAAC;AA2GD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAClD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACnD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;IACxF,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAChF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAI7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACtE,OAAO,EAAE,GAAG;SACV,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;SACpC,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;IAC/C,SAAS,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACpE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC1F,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC9E,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC9E,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC3F,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IACtD,KAAK,EAAE,GAAG;SACR,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;SACpD,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACrD,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC9E,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACrF,cAAc,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CACrE,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Rust-style TypeScript error formatting
3
+ *
4
+ * Formats TypeScript compiler errors in a style similar to Rust's compiler output,
5
+ * with source code context, error highlighting, and helpful formatting.
6
+ */
7
+ import type { GrammarItem } from './tsc-output-parser';
8
+ export interface FormatOptions {
9
+ /** Project directory for resolving relative paths */
10
+ projectDir: string;
11
+ /** Maximum number of errors to display (default: all) */
12
+ maxErrors?: number;
13
+ }
14
+ /**
15
+ * Format TypeScript errors in Rust-style output
16
+ */
17
+ export declare function formatTypeScriptErrors(items: GrammarItem[], options: FormatOptions): Promise<string>;
18
+ /**
19
+ * Check if the parsed result contains any errors
20
+ */
21
+ export declare function hasErrors(items: GrammarItem[]): boolean;
22
+ /**
23
+ * Get the count of errors
24
+ */
25
+ export declare function getErrorCount(items: GrammarItem[]): number;
26
+ //# sourceMappingURL=typescript-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-errors.d.ts","sourceRoot":"","sources":["../src/typescript-errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmSvD,MAAM,WAAW,aAAa;IAC7B,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAuDjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Rust-style TypeScript error formatting
3
+ *
4
+ * Formats TypeScript compiler errors in a style similar to Rust's compiler output,
5
+ * with source code context, error highlighting, and helpful formatting.
6
+ */
7
+ import { join } from 'node:path';
8
+ import { colorError, colorPrimary, colorInfo, colorMuted, bold, link, getDisplayWidth, getColor, plural, sourceLink, truncateToWidth, } from './tui';
9
+ import { symbols } from './tui/symbols';
10
+ /**
11
+ * Check if a GrammarItem is a TypeScript error (not a warning or other diagnostic)
12
+ */
13
+ function isTsErrorItem(item) {
14
+ return item.type === 'Item' && item.value?.tsError?.value?.type === 'error';
15
+ }
16
+ /**
17
+ * Parse GrammarItem array into structured TypeScript errors
18
+ */
19
+ function parseErrors(items) {
20
+ const errors = [];
21
+ for (const item of items) {
22
+ if (!isTsErrorItem(item) || !item.value)
23
+ continue;
24
+ const val = item.value;
25
+ errors.push({
26
+ path: val.path?.value ?? 'unknown',
27
+ line: val.cursor?.value?.line ?? 0,
28
+ col: val.cursor?.value?.col ?? 0,
29
+ errorCode: val.tsError?.value?.errorString ?? 'TS0000',
30
+ message: (val.message?.value ?? '').trim(),
31
+ });
32
+ }
33
+ return errors;
34
+ }
35
+ /**
36
+ * Read source lines with context (line before, current, line after)
37
+ */
38
+ async function getSourceContext(filePath, lineNumber) {
39
+ try {
40
+ const file = Bun.file(filePath);
41
+ if (!(await file.exists())) {
42
+ return null;
43
+ }
44
+ const content = await file.text();
45
+ const lines = content.split('\n');
46
+ if (lineNumber <= 0 || lineNumber > lines.length) {
47
+ return null;
48
+ }
49
+ const current = lines[lineNumber - 1];
50
+ const before = lineNumber > 1 ? lines[lineNumber - 2] : null;
51
+ const after = lineNumber < lines.length ? lines[lineNumber] : null;
52
+ return {
53
+ before: before !== null && before.trim() !== '' ? before : null,
54
+ beforeLineNum: lineNumber - 1,
55
+ current,
56
+ after: after !== null && after.trim() !== '' ? after : null,
57
+ afterLineNum: lineNumber + 1,
58
+ total: lines.length,
59
+ };
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Prepare error data without rendering (first pass)
67
+ */
68
+ async function prepareError(error, projectDir, maxAvailableWidth) {
69
+ const fullPath = error.path.startsWith('/') ? error.path : `${projectDir}/${error.path}`;
70
+ // Error header
71
+ const url = link(`https://typescript.tv/errors/#${error.errorCode}`, `error[${error.errorCode}]`, getColor('error'));
72
+ const header = ' ' + url + colorMuted(': ') + bold(error.message);
73
+ // File location
74
+ const vscodelink = sourceLink(join(projectDir, error.path), error.line, error.col, `${error.path}:${error.line}:${error.col}`, getColor('info'));
75
+ const location = colorInfo(` ${vscodelink}`);
76
+ const codeLines = [];
77
+ // Get source code context
78
+ const context = await getSourceContext(fullPath, error.line);
79
+ if (context !== null) {
80
+ const maxLineNum = Math.max(context.before !== null ? context.beforeLineNum : error.line, error.line, context.after !== null ? context.afterLineNum : error.line);
81
+ const lineNumWidth = String(maxLineNum).length;
82
+ const formatLineNum = (num) => String(num).padStart(lineNumWidth);
83
+ const padding = ' '.repeat(lineNumWidth);
84
+ const linePrefix = lineNumWidth + 3;
85
+ const truncateCodeLine = (lineNum, separator, code) => {
86
+ const prefixWidth = getDisplayWidth(lineNum) + getDisplayWidth(separator) + 1;
87
+ const availableForCode = maxAvailableWidth - prefixWidth;
88
+ if (availableForCode > 10 && getDisplayWidth(code) > availableForCode) {
89
+ return `${lineNum}${separator} ${truncateToWidth(code, availableForCode, '…')}`;
90
+ }
91
+ return `${lineNum}${separator} ${code}`;
92
+ };
93
+ if (context.beforeLineNum > 1) {
94
+ const dots = '.'.repeat(String(context.beforeLineNum).length);
95
+ const content = colorMuted(`${dots} ${symbols.bar}`);
96
+ codeLines.push({ content, rawWidth: getDisplayWidth(content) });
97
+ }
98
+ // Context line before (muted)
99
+ if (context.before !== null) {
100
+ const lineContent = truncateCodeLine(formatLineNum(context.beforeLineNum), ` ${symbols.bar}`, context.before);
101
+ const content = colorMuted(lineContent);
102
+ codeLines.push({ content, rawWidth: getDisplayWidth(content) });
103
+ }
104
+ // Error line (primary color)
105
+ const truncatedCurrent = getDisplayWidth(context.current) > maxAvailableWidth - linePrefix
106
+ ? truncateToWidth(context.current, maxAvailableWidth - linePrefix, '…')
107
+ : context.current;
108
+ const errorLineContent = `${colorInfo(formatLineNum(error.line))} ${colorMuted(symbols.bar)} ${colorPrimary(truncatedCurrent)}`;
109
+ codeLines.push({ content: errorLineContent, rawWidth: getDisplayWidth(errorLineContent) });
110
+ // Error pointer line with carets
111
+ const col = Math.max(0, error.col - 1);
112
+ let underlineLength = 1;
113
+ const restOfLine = context.current.slice(col);
114
+ const identifierMatch = restOfLine.match(/^[a-zA-Z_$][a-zA-Z0-9_$]*/);
115
+ if (identifierMatch) {
116
+ underlineLength = identifierMatch[0].length;
117
+ }
118
+ else {
119
+ const tokenMatch = restOfLine.match(/^\S+/);
120
+ if (tokenMatch) {
121
+ underlineLength = Math.min(tokenMatch[0].length, 20);
122
+ }
123
+ }
124
+ const maxCaretWidth = maxAvailableWidth - linePrefix;
125
+ const caretStart = Math.min(col, maxCaretWidth - 1);
126
+ const caretLen = Math.min(underlineLength, maxCaretWidth - caretStart);
127
+ const carets = caretLen > 0 ? '^'.repeat(caretLen) : '^';
128
+ const caretPadding = ' '.repeat(caretStart);
129
+ const caretLine = `${padding} ${colorMuted(symbols.bar)} ${caretPadding}${colorError(carets)}`;
130
+ codeLines.push({ content: caretLine, rawWidth: getDisplayWidth(caretLine) });
131
+ // Context line after (muted)
132
+ if (context.after !== null) {
133
+ const lineContent = truncateCodeLine(formatLineNum(context.afterLineNum), ` ${symbols.bar}`, context.after);
134
+ const content = colorMuted(lineContent);
135
+ codeLines.push({ content, rawWidth: getDisplayWidth(content) });
136
+ }
137
+ if (context.afterLineNum + 1 < context.total) {
138
+ const dots = '.'.repeat(String(context.afterLineNum).length);
139
+ const content = colorMuted(`${dots} ${symbols.bar}`);
140
+ codeLines.push({ content, rawWidth: getDisplayWidth(content) });
141
+ }
142
+ }
143
+ const maxContentWidth = codeLines.length > 0 ? Math.max(...codeLines.map((l) => l.rawWidth)) : 0;
144
+ return {
145
+ error,
146
+ header,
147
+ location,
148
+ codeLines,
149
+ maxContentWidth,
150
+ };
151
+ }
152
+ /**
153
+ * Render a prepared error with a specific box width
154
+ */
155
+ function renderError(prepared, boxContentWidth) {
156
+ const lines = [];
157
+ lines.push(prepared.header);
158
+ lines.push(prepared.location);
159
+ if (prepared.codeLines.length > 0) {
160
+ const boxWidth = boxContentWidth + 2;
161
+ // Draw box
162
+ lines.push(colorMuted(` ${symbols.cornerTL}${symbols.barH.repeat(boxWidth)}${symbols.cornerTR}`));
163
+ for (const codeLine of prepared.codeLines) {
164
+ const rightPad = ' '.repeat(Math.max(0, boxContentWidth - codeLine.rawWidth));
165
+ lines.push(colorMuted(` ${symbols.bar}`) +
166
+ ` ${codeLine.content}${rightPad} ` +
167
+ colorMuted(symbols.bar));
168
+ }
169
+ lines.push(colorMuted(` ${symbols.cornerBL}${symbols.barH.repeat(boxWidth)}${symbols.cornerBR}`));
170
+ }
171
+ else {
172
+ lines.push(colorMuted(' (source not available)'));
173
+ }
174
+ return lines.join('\n') + '\n';
175
+ }
176
+ /**
177
+ * Group errors by file for better organization
178
+ */
179
+ function groupErrorsByFile(errors) {
180
+ const grouped = new Map();
181
+ for (const error of errors) {
182
+ const existing = grouped.get(error.path) ?? [];
183
+ existing.push(error);
184
+ grouped.set(error.path, existing);
185
+ }
186
+ for (const errors of grouped.values()) {
187
+ errors.sort((a, b) => a.line - b.line || a.col - b.col);
188
+ }
189
+ return grouped;
190
+ }
191
+ /**
192
+ * Format TypeScript errors in Rust-style output
193
+ */
194
+ export async function formatTypeScriptErrors(items, options) {
195
+ const errors = parseErrors(items);
196
+ if (errors.length === 0) {
197
+ return '';
198
+ }
199
+ // Calculate terminal constraints
200
+ const terminalWidth = process.stdout.columns || 80;
201
+ const boxChrome = 6;
202
+ const maxAvailableWidth = terminalWidth - boxChrome;
203
+ // First pass: prepare all errors and collect their widths
204
+ const groupedErrors = groupErrorsByFile(errors);
205
+ const maxErrors = options.maxErrors ?? errors.length;
206
+ const preparedErrors = [];
207
+ let displayedCount = 0;
208
+ for (const [, fileErrors] of groupedErrors) {
209
+ for (const error of fileErrors) {
210
+ if (displayedCount >= maxErrors)
211
+ break;
212
+ const prepared = await prepareError(error, options.projectDir, maxAvailableWidth);
213
+ preparedErrors.push(prepared);
214
+ displayedCount++;
215
+ }
216
+ if (displayedCount >= maxErrors)
217
+ break;
218
+ }
219
+ // Calculate uniform box width (max content width across all errors, capped at terminal width)
220
+ const globalMaxContentWidth = Math.max(...preparedErrors.map((p) => p.maxContentWidth));
221
+ const uniformBoxContentWidth = Math.min(globalMaxContentWidth, maxAvailableWidth);
222
+ // Second pass: render all errors with uniform width
223
+ const output = [];
224
+ for (const prepared of preparedErrors) {
225
+ output.push(renderError(prepared, uniformBoxContentWidth));
226
+ }
227
+ // Summary line
228
+ const totalErrors = errors.length;
229
+ const hiddenCount = totalErrors - displayedCount;
230
+ let msg = bold(colorPrimary(`aborting due to ${totalErrors} TypeScript compiler ${plural(totalErrors, 'error', 'errors')}`));
231
+ if (hiddenCount > 0) {
232
+ msg += colorMuted(` (${hiddenCount} not shown)`);
233
+ }
234
+ output.push(`${bold(colorError('error'))}: ${msg}`);
235
+ return output.join('\n');
236
+ }
237
+ /**
238
+ * Check if the parsed result contains any errors
239
+ */
240
+ export function hasErrors(items) {
241
+ return items.some(isTsErrorItem);
242
+ }
243
+ /**
244
+ * Get the count of errors
245
+ */
246
+ export function getErrorCount(items) {
247
+ return items.filter(isTsErrorItem).length;
248
+ }
249
+ //# sourceMappingURL=typescript-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-errors.js","sourceRoot":"","sources":["../src/typescript-errors.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/cli",
3
- "version": "0.0.106",
3
+ "version": "0.0.108",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -40,8 +40,8 @@
40
40
  "prepublishOnly": "bun run clean && bun run build"
41
41
  },
42
42
  "dependencies": {
43
- "@agentuity/core": "0.0.106",
44
- "@agentuity/server": "0.0.106",
43
+ "@agentuity/core": "0.0.108",
44
+ "@agentuity/server": "0.0.108",
45
45
  "@datasert/cronjs-parser": "^1.4.0",
46
46
  "@terascope/fetch-github-release": "^2.2.1",
47
47
  "@vitejs/plugin-react": "^5.1.2",
@@ -61,7 +61,7 @@
61
61
  "zod": "^4.1.12"
62
62
  },
63
63
  "devDependencies": {
64
- "@agentuity/test-utils": "0.0.106",
64
+ "@agentuity/test-utils": "0.0.108",
65
65
  "@types/adm-zip": "^0.5.7",
66
66
  "@types/bun": "latest",
67
67
  "@types/tar-fs": "^2.0.4",
@@ -67,25 +67,22 @@ export async function generateEntryFile(options: GenerateEntryOptions): Promise<
67
67
  ` setGlobalRouter,`,
68
68
  ` enableProcessExitProtection,`,
69
69
  ` hasWaitUntilPending,`,
70
+ ` loadBuildMetadata,`,
71
+ ` createWorkbenchRouter,`,
72
+ ` bootstrapRuntimeEnv,`,
73
+ ` patchBunS3ForStorageDev,`,
70
74
  ];
71
75
 
72
- if (hasWorkbench) {
73
- runtimeImports.push(` createWorkbenchRouter,`);
74
- }
75
-
76
76
  const imports = [
77
77
  `import { `,
78
78
  ...runtimeImports,
79
79
  `} from '@agentuity/runtime';`,
80
80
  `import type { Context } from 'hono';`,
81
- `import { websocket } from 'hono/bun';`,
82
- // Conditionally import serveStatic and readFileSync for web frontend or workbench support
83
- hasWebFrontend || hasWorkbench ? `import { serveStatic } from 'hono/bun';` : '',
84
- hasWebFrontend || hasWorkbench ? `import { readFileSync, existsSync } from 'node:fs';` : '',
81
+ `import { websocket${hasWebFrontend ? ', serveStatic' : ''} } from 'hono/bun';`,
82
+ hasWebFrontend ? `import { readFileSync, existsSync } from 'node:fs';` : '',
85
83
  ].filter(Boolean);
86
84
 
87
85
  imports.push(`import { type LogLevel } from '@agentuity/core';`);
88
- imports.push(`import { bootstrapRuntimeEnv, patchBunS3ForStorageDev } from '@agentuity/runtime';`);
89
86
 
90
87
  // Generate route mounting code for all discovered routes
91
88
  const routeImportsAndMounts: string[] = [];
@@ -124,13 +121,14 @@ ${routeImportsAndMounts.join('\n')}
124
121
  : '';
125
122
 
126
123
  // Workbench API routes mounting (if enabled)
127
- const workbenchApiMount = hasWorkbench
128
- ? `
129
- // Mount workbench API routes (/_agentuity/workbench/*)
130
- const workbenchRouter = createWorkbenchRouter();
131
- app.route('/', workbenchRouter);
132
- `
133
- : '';
124
+ const workbenchApiMount = `
125
+ const hasWorkbench = ${hasWorkbench};
126
+ if (hasWorkbench) {
127
+ // Mount workbench API routes (/_agentuity/workbench/*)
128
+ const workbenchRouter = createWorkbenchRouter();
129
+ app.route('/', workbenchRouter);
130
+ }
131
+ `;
134
132
 
135
133
  // Asset proxy routes - Always generated, but only active at runtime when:
136
134
  // - NODE_ENV !== 'production' (isDevelopment())
@@ -142,20 +140,16 @@ if (isDevelopment() && process.env.VITE_PORT) {
142
140
 
143
141
  const proxyToVite = async (c: Context) => {
144
142
  const viteUrl = \`http://127.0.0.1:\${VITE_ASSET_PORT}\${c.req.path}\`;
145
- const controller = new AbortController();
146
- const timeout = setTimeout(() => controller.abort(), 10000); // 10s timeout
147
143
  try {
148
144
  otel.logger.debug(\`[Proxy] \${c.req.method} \${c.req.path} -> Vite:\${VITE_ASSET_PORT}\`);
149
- const res = await fetch(viteUrl, { signal: controller.signal });
150
- clearTimeout(timeout);
145
+ const res = await fetch(viteUrl, { signal: AbortSignal.timeout(10000) });
151
146
  otel.logger.debug(\`[Proxy] \${c.req.path} -> \${res.status} (\${res.headers.get('content-type')})\`);
152
147
  return new Response(res.body, {
153
148
  status: res.status,
154
149
  headers: res.headers,
155
150
  });
156
151
  } catch (err) {
157
- clearTimeout(timeout);
158
- if (err instanceof Error && err.name === 'AbortError') {
152
+ if (err instanceof Error && err.name === 'TimeoutError') {
159
153
  otel.logger.error(\`Vite proxy timeout: \${c.req.path}\`);
160
154
  return c.text('Vite asset server timeout', 504);
161
155
  }
@@ -243,7 +237,9 @@ if (isDevelopment()) {
243
237
  // 404 for unmatched API/system routes
244
238
  app.all('/_agentuity/*', (c: Context) => c.notFound());
245
239
  app.all('/api/*', (c: Context) => c.notFound());
246
- ${hasWorkbench ? '' : `app.all('/workbench/*', (c: Context) => c.notFound());`}
240
+ if (hasWorkbench) {
241
+ app.all('/workbench/*', (c: Context) => c.notFound());
242
+ }
247
243
 
248
244
  // SPA fallback - serve index.html for client-side routing
249
245
  app.get('*', (c: Context) => {
@@ -276,7 +272,9 @@ if (isDevelopment()) {
276
272
  // 404 for unmatched API/system routes (IMPORTANT: comes before SPA fallback)
277
273
  app.all('/_agentuity/*', (c: Context) => c.notFound());
278
274
  app.all('/api/*', (c: Context) => c.notFound());
279
- ${hasWorkbench ? '' : `app.all('/workbench/*', (c: Context) => c.notFound());`}
275
+ if (hasWorkbench) {
276
+ app.all('/workbench/*', (c: Context) => c.notFound());
277
+ }
280
278
 
281
279
  // SPA fallback with asset protection
282
280
  app.get('*', (c: Context) => {
@@ -293,36 +291,25 @@ if (isDevelopment()) {
293
291
 
294
292
  // Workbench routes (if enabled) - runtime mode detection
295
293
  const workbenchRoute = workbench?.route ?? '/workbench';
296
- const workbenchRoutes = hasWorkbench
297
- ? `
298
- // Workbench routes - Runtime mode detection
299
- // Both dev and prod run from .agentuity/app.js (dev bundles before running)
300
- // So workbench-src is always in the same directory
301
- const workbenchSrcDir = import.meta.dir + '/workbench-src';
302
- const workbenchIndexPath = import.meta.dir + '/workbench/index.html';
303
- const workbenchIndex = existsSync(workbenchIndexPath)
304
- ? readFileSync(workbenchIndexPath, 'utf-8')
305
- : '';
306
-
307
- if (isDevelopment()) {
294
+ const workbenchRoutes = `
295
+ if (hasWorkbench) {
308
296
  // Development mode: Let Vite serve source files with HMR
309
- app.get('${workbenchRoute}', async (c: Context) => {
310
- const html = await Bun.file(workbenchSrcDir + '/index.html').text();
311
- // Rewrite script/css paths to use Vite's @fs protocol
312
- const withVite = html
313
- .replace('src="./main.tsx"', \`src="/@fs\${workbenchSrcDir}/main.tsx"\`)
314
- .replace('href="./styles.css"', \`href="/@fs\${workbenchSrcDir}/styles.css"\`);
315
- return c.html(withVite);
316
- });
317
- } else {
318
- // Production mode: Serve pre-built assets
319
- if (workbenchIndex) {
320
- app.get('${workbenchRoute}', (c: Context) => c.html(workbenchIndex));
321
- app.get('${workbenchRoute}/*', serveStatic({ root: import.meta.dir + '/workbench' }));
297
+ if (isDevelopment()) {
298
+ const workbenchSrcDir = import.meta.dir + '/workbench-src';
299
+ const workbenchIndexPath = import.meta.dir + '/workbench-src/index.html';
300
+ app.get('${workbenchRoute}', async (c: Context) => {
301
+ const html = await Bun.file(workbenchIndexPath).text();
302
+ // Rewrite script/css paths to use Vite's @fs protocol
303
+ const withVite = html
304
+ .replace('src="./main.tsx"', \`src="/@fs\${workbenchSrcDir}/main.tsx"\`)
305
+ .replace('href="./styles.css"', \`href="/@fs\${workbenchSrcDir}/styles.css"\`);
306
+ return c.html(withVite);
307
+ });
308
+ } else {
309
+ // Production mode disables the workbench assets
322
310
  }
323
311
  }
324
- `
325
- : '';
312
+ `;
326
313
 
327
314
  // Server startup (same for dev and prod - Bun.serve with native WebSocket)
328
315
  const serverStartup = `
@@ -345,6 +332,7 @@ if (typeof Bun !== 'undefined') {
345
332
  });
346
333
 
347
334
  // Make server available globally for health checks
335
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
348
336
  (globalThis as any).__AGENTUITY_SERVER__ = server;
349
337
 
350
338
  otel.logger.info(\`Server listening on http://127.0.0.1:\${port}\`);
@@ -366,6 +354,7 @@ if (!isDevelopment()) {
366
354
  };
367
355
  const idleHandler = (c: Context) => {
368
356
  // Check if server is idle (no pending requests/connections)
357
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
369
358
  const server = (globalThis as any).__AGENTUITY_SERVER__;
370
359
  if (!server) return c.text('NO', 200, { 'Content-Type': 'text/plain; charset=utf-8' });
371
360
 
@@ -429,6 +418,9 @@ if (isDevelopment()) {
429
418
  await bootstrapRuntimeEnv({ projectDir: import.meta.dir + '/../..' });
430
419
  }
431
420
 
421
+ // Step 0.25: load our runtime metadata and cache it
422
+ loadBuildMetadata();
423
+
432
424
  // Step 0.5: Patch Bun's S3 client for Agentuity storage endpoints
433
425
  // Agentuity storage uses virtual-hosted-style URLs (*.storage.dev)
434
426
  // This patches s3.file() to automatically set virtualHostedStyle: true
@@ -5,6 +5,7 @@ import { viteBundle } from './vite-bundler';
5
5
  import * as tui from '../../tui';
6
6
  import { getCommand } from '../../command-prefix';
7
7
  import { ErrorCode } from '../../errors';
8
+ import { typecheck } from './typecheck';
8
9
 
9
10
  const BuildResponseSchema = z.object({
10
11
  success: z.boolean().describe('Whether the build succeeded'),
@@ -78,22 +79,24 @@ export const command = createCommand({
78
79
  if (!opts.dev && !opts.skipTypeCheck) {
79
80
  try {
80
81
  tui.info('Running type check...');
81
- const result = await Bun.$`bunx tsc --noEmit --skipLibCheck`
82
- .cwd(absoluteProjectDir)
83
- .nothrow();
84
-
85
- if (result.exitCode === 0) {
82
+ const typeResult = await typecheck(absoluteProjectDir);
83
+ if (typeResult.success) {
86
84
  tui.success('Type check passed');
87
85
  } else {
88
- tui.error('Type check failed:\n');
89
- console.error(result.stderr.toString());
90
- tui.fatal('Fix type errors before building');
86
+ console.error('');
87
+ console.error(typeResult.output);
88
+ console.error('');
89
+ const msg =
90
+ 'errors' in typeResult ? 'Fix type errors before building' : 'Build error';
91
+ tui.fatal(msg, ErrorCode.BUILD_FAILED);
91
92
  }
92
93
  } catch (error: unknown) {
93
- // If tsc fails to run, show error and fail
94
94
  const errorMsg = error instanceof Error ? error.message : String(error);
95
95
  tui.error(`Type check failed to run: ${errorMsg}`);
96
- tui.fatal('Unable to run TypeScript type checking. Ensure TypeScript is installed.');
96
+ tui.fatal(
97
+ 'Unable to run TypeScript type checking. Ensure TypeScript is installed.',
98
+ ErrorCode.BUILD_FAILED
99
+ );
97
100
  }
98
101
  }
99
102
 
@@ -0,0 +1,55 @@
1
+ import { parse, type GrammarItem } from '../../tsc-output-parser';
2
+ import { formatTypeScriptErrors, hasErrors } from '../../typescript-errors';
3
+
4
+ interface TypeError {
5
+ success: false;
6
+ errors: GrammarItem[];
7
+ output: string;
8
+ }
9
+
10
+ interface TypeUnknownError {
11
+ success: false;
12
+ output: string;
13
+ }
14
+
15
+ interface TypeSuccess {
16
+ success: true;
17
+ }
18
+
19
+ type TypeResult = TypeError | TypeSuccess | TypeUnknownError;
20
+
21
+ /**
22
+ * run the typescript compiler and result formatted results
23
+ *
24
+ * @param dir the absolute path to the directory containing the project (must have tsconfig.json in this folder)
25
+ * @returns
26
+ */
27
+ export async function typecheck(dir: string): Promise<TypeResult> {
28
+ const result = await Bun.$`bunx tsc --noEmit --skipLibCheck --pretty false`
29
+ .cwd(dir)
30
+ .quiet()
31
+ .nothrow();
32
+
33
+ const output = await result.text();
34
+ const errors = parse(output) as GrammarItem[];
35
+
36
+ if (result.exitCode === 0) {
37
+ return {
38
+ success: true,
39
+ };
40
+ } else if (errors && hasErrors(errors)) {
41
+ const formattedErrors = await formatTypeScriptErrors(errors, {
42
+ projectDir: dir,
43
+ });
44
+ return {
45
+ success: false,
46
+ errors,
47
+ output: formattedErrors,
48
+ };
49
+ } else {
50
+ return {
51
+ success: false,
52
+ output: output || result.stderr.toString(),
53
+ };
54
+ }
55
+ }
@@ -9,7 +9,7 @@ import { writeFileSync, mkdirSync, existsSync, readFileSync, statSync, readdirSy
9
9
  import type { BuildMetadata } from '@agentuity/server';
10
10
  import type { AgentMetadata } from './agent-discovery';
11
11
  import type { RouteMetadata } from './route-discovery';
12
- import type { Logger } from '../../../types';
12
+ import type { Logger, DeployOptions } from '../../../types';
13
13
  import { getVersion } from '../../../version';
14
14
 
15
15
  interface ViteManifestEntry {
@@ -162,6 +162,7 @@ export interface MetadataGeneratorOptions {
162
162
  routes: RouteMetadata[];
163
163
  dev?: boolean;
164
164
  logger: Logger;
165
+ deploymentOptions?: DeployOptions;
165
166
  }
166
167
 
167
168
  /**
@@ -472,6 +473,21 @@ export async function generateMetadata(options: MetadataGeneratorOptions): Promi
472
473
  },
473
474
  };
474
475
 
476
+ if (options.deploymentOptions) {
477
+ const git = { ...(metadata.deployment.git ?? {}), ...options.deploymentOptions };
478
+ if (options.deploymentOptions.pullRequestNumber) {
479
+ git.pull_request = {
480
+ number: options.deploymentOptions.pullRequestNumber,
481
+ commentId: options.deploymentOptions.pullRequestCommentId,
482
+ url: options.deploymentOptions.pullRequestURL,
483
+ };
484
+ delete git.pullRequestCommentId;
485
+ delete git.pullRequestNumber;
486
+ delete git.pullRequestURL;
487
+ }
488
+ metadata.deployment.git = git;
489
+ }
490
+
475
491
  return metadata;
476
492
  }
477
493