@sanity/runtime-cli 17.1.0-next.g3cb2d2e → 17.1.0-next.gcfbd613

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 (61) hide show
  1. package/README.md +23 -22
  2. package/dist/actions/blueprints/assets.d.ts +2 -1
  3. package/dist/actions/blueprints/assets.js +2 -2
  4. package/dist/actions/blueprints/blueprint.d.ts +1 -1
  5. package/dist/actions/blueprints/wait-for-operation.js +4 -0
  6. package/dist/actions/sanity/examples.d.ts +4 -4
  7. package/dist/baseCommands.d.ts +4 -4
  8. package/dist/commands/blueprints/add.d.ts +1 -1
  9. package/dist/commands/blueprints/config.d.ts +1 -1
  10. package/dist/commands/blueprints/deploy.d.ts +1 -1
  11. package/dist/commands/blueprints/destroy.d.ts +1 -1
  12. package/dist/commands/blueprints/doctor.d.ts +0 -1
  13. package/dist/commands/blueprints/doctor.js +3 -7
  14. package/dist/commands/blueprints/info.d.ts +1 -1
  15. package/dist/commands/blueprints/logs.d.ts +1 -1
  16. package/dist/commands/blueprints/mint-deploy-token.d.ts +1 -1
  17. package/dist/commands/blueprints/plan.d.ts +1 -1
  18. package/dist/commands/blueprints/promote.d.ts +1 -1
  19. package/dist/commands/blueprints/stacks.d.ts +1 -1
  20. package/dist/commands/functions/add.d.ts +1 -1
  21. package/dist/commands/functions/build.d.ts +1 -1
  22. package/dist/commands/functions/dev.d.ts +1 -1
  23. package/dist/commands/functions/env/add.d.ts +1 -1
  24. package/dist/commands/functions/env/list.d.ts +1 -1
  25. package/dist/commands/functions/env/remove.d.ts +1 -1
  26. package/dist/commands/functions/logs.d.ts +1 -1
  27. package/dist/commands/functions/test.d.ts +1 -1
  28. package/dist/cores/blueprints/deploy.js +5 -4
  29. package/dist/cores/blueprints/doctor.js +15 -12
  30. package/dist/cores/functions/build.js +3 -2
  31. package/dist/cores/functions/test.js +4 -2
  32. package/dist/server/app.js +8 -2
  33. package/dist/server/static/favicon-dark.svg +1 -0
  34. package/dist/server/static/favicon.svg +1 -0
  35. package/dist/server/static/index.html +1 -1
  36. package/dist/server/static/vendor/vendor.bundle.js +5 -0
  37. package/dist/utils/functions/find-entry-point.d.ts +1 -1
  38. package/dist/utils/functions/find-entry-point.js +10 -12
  39. package/dist/utils/functions/invoke/local.js +1 -1
  40. package/dist/utils/functions/invoke/prepare.d.ts +1 -1
  41. package/dist/utils/functions/invoke/prepare.js +19 -8
  42. package/dist/utils/functions/package-json.d.ts +1 -2
  43. package/dist/utils/functions/package-json.js +4 -6
  44. package/dist/utils/functions/prepare-asset.d.ts +2 -2
  45. package/dist/utils/functions/prepare-asset.js +18 -7
  46. package/dist/utils/functions/resolve-dependencies.d.ts +4 -1
  47. package/dist/utils/functions/resolve-dependencies.js +5 -6
  48. package/dist/utils/functions/resource-to-arc.d.ts +1 -1
  49. package/dist/utils/functions/resource-to-arc.js +4 -5
  50. package/dist/utils/functions/should-transpile.d.ts +7 -1
  51. package/dist/utils/functions/should-transpile.js +10 -10
  52. package/dist/utils/functions/transpile/function.d.ts +4 -1
  53. package/dist/utils/functions/transpile/function.js +9 -14
  54. package/dist/utils/functions/transpile/verify-handler.js +1 -1
  55. package/dist/utils/logger.d.ts +7 -5
  56. package/dist/utils/logger.js +33 -1
  57. package/dist/utils/progress.d.ts +5 -0
  58. package/dist/utils/progress.js +40 -0
  59. package/dist/utils/types.d.ts +5 -1
  60. package/oclif.manifest.json +5 -4
  61. package/package.json +23 -22
package/README.md CHANGED
@@ -20,7 +20,7 @@ $ npm install -g @sanity/runtime-cli
20
20
  $ sanity-run COMMAND
21
21
  running command...
22
22
  $ sanity-run (--version)
23
- @sanity/runtime-cli/17.1.0-next.g3cb2d2e linux-x64 node-v24.18.0
23
+ @sanity/runtime-cli/17.1.0-next.gcfbd613 linux-x64 node-v24.18.0
24
24
  $ sanity-run --help [COMMAND]
25
25
  USAGE
26
26
  $ sanity-run COMMAND
@@ -103,7 +103,7 @@ EXAMPLES
103
103
  $ sanity-run blueprints add function --name my-function --fn-type document-create --fn-type document-update --lang js
104
104
  ```
105
105
 
106
- _See code: [src/commands/blueprints/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/add.ts)_
106
+ _See code: [src/commands/blueprints/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/add.ts)_
107
107
 
108
108
  ## `sanity-run blueprints config`
109
109
 
@@ -140,7 +140,7 @@ EXAMPLES
140
140
  $ sanity-run blueprints config --edit --project-id <projectId> --stack <name-or-id>
141
141
  ```
142
142
 
143
- _See code: [src/commands/blueprints/config.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/config.ts)_
143
+ _See code: [src/commands/blueprints/config.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/config.ts)_
144
144
 
145
145
  ## `sanity-run blueprints deploy`
146
146
 
@@ -194,7 +194,7 @@ EXAMPLES
194
194
  $ sanity-run blueprints deploy --new-stack-name <new-name>
195
195
  ```
196
196
 
197
- _See code: [src/commands/blueprints/deploy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/deploy.ts)_
197
+ _See code: [src/commands/blueprints/deploy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/deploy.ts)_
198
198
 
199
199
  ## `sanity-run blueprints destroy`
200
200
 
@@ -232,7 +232,7 @@ EXAMPLES
232
232
  $ sanity-run blueprints destroy --stack <name-or-id> --project-id <projectId> --force --no-wait
233
233
  ```
234
234
 
235
- _See code: [src/commands/blueprints/destroy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/destroy.ts)_
235
+ _See code: [src/commands/blueprints/destroy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/destroy.ts)_
236
236
 
237
237
  ## `sanity-run blueprints doctor`
238
238
 
@@ -240,13 +240,12 @@ Diagnose potential issues with local Blueprint and remote Stack configuration
240
240
 
241
241
  ```
242
242
  USAGE
243
- $ sanity-run blueprints doctor [--json] [-p <value>] [--verbose] [--fix]
243
+ $ sanity-run blueprints doctor [--json] [-p <value>] [--fix]
244
244
 
245
245
  FLAGS
246
246
  -p, --path=<value> [env: SANITY_BLUEPRINT_PATH] Path to a Blueprint file or directory containing one
247
247
  --fix Interactively fix configuration issues
248
248
  --json Format output as json
249
- --[no-]verbose Verbose output; defaults to true
250
249
 
251
250
  DESCRIPTION
252
251
  Diagnose potential issues with local Blueprint and remote Stack configuration
@@ -257,13 +256,15 @@ DESCRIPTION
257
256
  Run this command when encountering errors with other Blueprint commands. Use --fix to interactively resolve detected
258
257
  issues.
259
258
 
259
+ Supports --json for programmatic consumption of diagnostic results.
260
+
260
261
  EXAMPLES
261
262
  $ sanity-run blueprints doctor
262
263
 
263
264
  $ sanity-run blueprints doctor --fix
264
265
  ```
265
266
 
266
- _See code: [src/commands/blueprints/doctor.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/doctor.ts)_
267
+ _See code: [src/commands/blueprints/doctor.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/doctor.ts)_
267
268
 
268
269
  ## `sanity-run blueprints info`
269
270
 
@@ -300,7 +301,7 @@ EXAMPLES
300
301
  $ sanity-run blueprints info --organization-id <orgId> --stack <name-or-id>
301
302
  ```
302
303
 
303
- _See code: [src/commands/blueprints/info.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/info.ts)_
304
+ _See code: [src/commands/blueprints/info.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/info.ts)_
304
305
 
305
306
  ## `sanity-run blueprints init [DIR]`
306
307
 
@@ -364,7 +365,7 @@ EXAMPLES
364
365
  $ sanity-run blueprints init old-stack --type <json|js|ts> --project-id <projectId> --stack-id <existingStackId>
365
366
  ```
366
367
 
367
- _See code: [src/commands/blueprints/init.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/init.ts)_
368
+ _See code: [src/commands/blueprints/init.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/init.ts)_
368
369
 
369
370
  ## `sanity-run blueprints logs`
370
371
 
@@ -410,7 +411,7 @@ EXAMPLES
410
411
  $ sanity-run blueprints logs --before 2026-05-01T00:00:00Z
411
412
  ```
412
413
 
413
- _See code: [src/commands/blueprints/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/logs.ts)_
414
+ _See code: [src/commands/blueprints/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/logs.ts)_
414
415
 
415
416
  ## `sanity-run blueprints mint-deploy-token`
416
417
 
@@ -455,7 +456,7 @@ EXAMPLES
455
456
  $ sanity-run blueprints mint-deploy-token --organization-id <orgId>
456
457
  ```
457
458
 
458
- _See code: [src/commands/blueprints/mint-deploy-token.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/mint-deploy-token.ts)_
459
+ _See code: [src/commands/blueprints/mint-deploy-token.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/mint-deploy-token.ts)_
459
460
 
460
461
  ## `sanity-run blueprints plan`
461
462
 
@@ -488,7 +489,7 @@ EXAMPLES
488
489
  $ sanity-run blueprints plan --organization-id <orgId> --stack <name-or-id>
489
490
  ```
490
491
 
491
- _See code: [src/commands/blueprints/plan.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/plan.ts)_
492
+ _See code: [src/commands/blueprints/plan.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/plan.ts)_
492
493
 
493
494
  ## `sanity-run blueprints promote`
494
495
 
@@ -524,7 +525,7 @@ EXAMPLES
524
525
  $ sanity-run blueprints promote --new-stack-name <new-name>
525
526
  ```
526
527
 
527
- _See code: [src/commands/blueprints/promote.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/promote.ts)_
528
+ _See code: [src/commands/blueprints/promote.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/promote.ts)_
528
529
 
529
530
  ## `sanity-run blueprints stacks`
530
531
 
@@ -560,7 +561,7 @@ EXAMPLES
560
561
  $ sanity-run blueprints stacks --organization-id <organizationId> --include-projects
561
562
  ```
562
563
 
563
- _See code: [src/commands/blueprints/stacks.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/blueprints/stacks.ts)_
564
+ _See code: [src/commands/blueprints/stacks.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/blueprints/stacks.ts)_
564
565
 
565
566
  ## `sanity-run functions add`
566
567
 
@@ -612,7 +613,7 @@ EXAMPLES
612
613
  $ sanity-run functions add --name my-function --type document-create --type document-update --lang js
613
614
  ```
614
615
 
615
- _See code: [src/commands/functions/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/add.ts)_
616
+ _See code: [src/commands/functions/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/add.ts)_
616
617
 
617
618
  ## `sanity-run functions dev`
618
619
 
@@ -647,7 +648,7 @@ EXAMPLES
647
648
  $ sanity-run functions dev --timeout 60
648
649
  ```
649
650
 
650
- _See code: [src/commands/functions/dev.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/dev.ts)_
651
+ _See code: [src/commands/functions/dev.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/dev.ts)_
651
652
 
652
653
  ## `sanity-run functions env add NAME KEY VALUE`
653
654
 
@@ -677,7 +678,7 @@ EXAMPLES
677
678
  $ sanity-run functions env add MyFunction API_URL https://api.example.com/
678
679
  ```
679
680
 
680
- _See code: [src/commands/functions/env/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/env/add.ts)_
681
+ _See code: [src/commands/functions/env/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/env/add.ts)_
681
682
 
682
683
  ## `sanity-run functions env list NAME`
683
684
 
@@ -704,7 +705,7 @@ EXAMPLES
704
705
  $ sanity-run functions env list MyFunction
705
706
  ```
706
707
 
707
- _See code: [src/commands/functions/env/list.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/env/list.ts)_
708
+ _See code: [src/commands/functions/env/list.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/env/list.ts)_
708
709
 
709
710
  ## `sanity-run functions env remove NAME KEY`
710
711
 
@@ -733,7 +734,7 @@ EXAMPLES
733
734
  $ sanity-run functions env remove MyFunction API_URL
734
735
  ```
735
736
 
736
- _See code: [src/commands/functions/env/remove.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/env/remove.ts)_
737
+ _See code: [src/commands/functions/env/remove.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/env/remove.ts)_
737
738
 
738
739
  ## `sanity-run functions logs [NAME]`
739
740
 
@@ -773,7 +774,7 @@ EXAMPLES
773
774
  $ sanity-run functions logs <name> --delete
774
775
  ```
775
776
 
776
- _See code: [src/commands/functions/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/logs.ts)_
777
+ _See code: [src/commands/functions/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/logs.ts)_
777
778
 
778
779
  ## `sanity-run functions test [NAME]`
779
780
 
@@ -830,7 +831,7 @@ EXAMPLES
830
831
  $ sanity-run functions test <name> --event update --data-before '{ "title": "before" }' --data-after '{ "title": "after" }'
831
832
  ```
832
833
 
833
- _See code: [src/commands/functions/test.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.g3cb2d2e/src/commands/functions/test.ts)_
834
+ _See code: [src/commands/functions/test.ts](https://github.com/sanity-io/runtime-cli/blob/v17.1.0-next.gcfbd613/src/commands/functions/test.ts)_
834
835
 
835
836
  ## `sanity-run help [COMMAND]`
836
837
 
@@ -3,9 +3,10 @@ import type { Logger } from '../../utils/logger.js';
3
3
  import type { AssetResource, AuthParams, InstallerType } from '../../utils/types.js';
4
4
  export declare const assetCheckUrl: string;
5
5
  export declare const assetStashUrl: string;
6
- export declare function stashAsset({ resource, auth, logger, installer, }: {
6
+ export declare function stashAsset({ resource, auth, blueprintFileDir, logger, installer, }: {
7
7
  resource: AssetResource;
8
8
  auth: AuthParams;
9
+ blueprintFileDir: string;
9
10
  logger: Logger;
10
11
  installer?: InstallerType;
11
12
  }): Promise<{
@@ -10,14 +10,14 @@ import { isLocalFunctionResource, isStudioResource } from '../../utils/types.js'
10
10
  const assetsUrl = blueprintsUrl('assets');
11
11
  export const assetCheckUrl = `${assetsUrl}/check`;
12
12
  export const assetStashUrl = `${assetsUrl}/stash`;
13
- export async function stashAsset({ resource, auth, logger, installer, }) {
13
+ export async function stashAsset({ resource, auth, blueprintFileDir, logger, installer, }) {
14
14
  try {
15
15
  let b64;
16
16
  let hash;
17
17
  let extension;
18
18
  let cleanup;
19
19
  if (isLocalFunctionResource(resource)) {
20
- const prepResult = await prepareFunctionAsset({ resource }, { installer });
20
+ const prepResult = await prepareFunctionAsset({ resource, blueprintFileDir, installer });
21
21
  if (prepResult.success === false) {
22
22
  return {
23
23
  success: false,
@@ -4,7 +4,7 @@ import type { Logger } from '../../utils/logger.js';
4
4
  import type { BlueprintParserError, ScopeType } from '../../utils/types.js';
5
5
  import { type LocatedBlueprintsConfig } from './config.js';
6
6
  import { type ConfigSource } from './resolve.js';
7
- declare const SUPPORTED_FILE_EXTENSIONS: readonly [".json", ".js", ".mjs", ".ts"];
7
+ declare const SUPPORTED_FILE_EXTENSIONS: readonly ['.json', '.js', '.mjs', '.ts'];
8
8
  type BlueprintFileExtension = (typeof SUPPORTED_FILE_EXTENSIONS)[number];
9
9
  export declare const JSON_BLUEPRINT_CONTENT: {
10
10
  blueprintVersion: string;
@@ -12,6 +12,7 @@ export async function waitForOperation(options) {
12
12
  const logHints = createHintCollector(bin);
13
13
  let logStreamCleanup = null;
14
14
  try {
15
+ log.showProgress();
15
16
  let lastLogAt = Date.now();
16
17
  let idleMessageShown = false;
17
18
  let consecutiveErrors = 0;
@@ -85,4 +86,7 @@ export async function waitForOperation(options) {
85
86
  logStreamCleanup();
86
87
  throw error;
87
88
  }
89
+ finally {
90
+ log.clearProgress();
91
+ }
88
92
  }
@@ -2,12 +2,12 @@ import type { Logger } from '../../utils/logger.js';
2
2
  export declare const EXAMPLES_CACHE_DIR: string;
3
3
  declare const EXAMPLE_TYPES: {
4
4
  readonly blueprint: {
5
- readonly repo: "sanity-io/sanity";
6
- readonly dir: "examples/blueprints";
5
+ readonly repo: 'sanity-io/sanity';
6
+ readonly dir: 'examples/blueprints';
7
7
  };
8
8
  readonly function: {
9
- readonly repo: "sanity-labs/function-recipes";
10
- readonly dir: "";
9
+ readonly repo: 'sanity-labs/function-recipes';
10
+ readonly dir: '';
11
11
  };
12
12
  };
13
13
  export declare function verifyExampleExists({ type, name, logger, }: {
@@ -10,7 +10,7 @@ export declare const pathFlagConfig: {
10
10
  description: string;
11
11
  env: string;
12
12
  aliases: string[];
13
- char: "p";
13
+ char: 'p';
14
14
  };
15
15
  export declare const baseFlags: {
16
16
  json: Interfaces.BooleanFlag<boolean>;
@@ -112,14 +112,14 @@ export type Need = 'token' | 'blueprint' | 'scope' | 'stackId' | 'deployedStack'
112
112
  export declare abstract class ResolvedCommand<T extends typeof Command> extends RuntimeCommand<T> {
113
113
  static needs: readonly Need[];
114
114
  static baseFlags: {
115
- stack: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
116
- 'project-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
117
- 'organization-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
118
115
  json: Interfaces.BooleanFlag<boolean>;
119
116
  path: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
120
117
  trace: Interfaces.BooleanFlag<boolean>;
121
118
  'validate-resources': Interfaces.BooleanFlag<boolean>;
122
119
  verbose: Interfaces.BooleanFlag<boolean>;
120
+ stack: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
121
+ 'project-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
122
+ 'organization-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
123
123
  };
124
124
  protected sanityToken: string;
125
125
  protected blueprint: ReadBlueprintResult;
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { ResolvedCommand } from '../../baseCommands.js';
6
6
  export default class AddCommand extends ResolvedCommand<typeof AddCommand> {
7
- static needs: readonly ["blueprint"];
7
+ static needs: readonly ['blueprint'];
8
8
  static state: string;
9
9
  static deprecationOptions: {
10
10
  to: string;
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class ConfigCommand extends ResolvedCommand<typeof ConfigCommand> {
3
- static needs: readonly ["token", "blueprint"];
3
+ static needs: readonly ['token', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class DeployCommand extends ResolvedCommand<typeof DeployCommand> {
3
- static needs: readonly ["deployedStack", "blueprint"];
3
+ static needs: readonly ['deployedStack', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class DestroyCommand extends ResolvedCommand<typeof DestroyCommand> {
3
- static needs: readonly ["scope"];
3
+ static needs: readonly ['scope'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -6,7 +6,6 @@ export default class DoctorCommand extends RuntimeCommand<typeof DoctorCommand>
6
6
  static flags: {
7
7
  path: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
8
  fix: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
9
  };
11
10
  run(): Promise<Record<string, unknown> | undefined>;
12
11
  }
@@ -7,8 +7,9 @@ export default class DoctorCommand extends RuntimeCommand {
7
7
  static summary = 'Diagnose potential issues with local Blueprint and remote Stack configuration';
8
8
  static description = `Analyzes your local Blueprint and remote Stack configuration for common issues, such as missing authentication, invalid project references, or misconfigured resources.
9
9
 
10
- Run this command when encountering errors with other Blueprint commands. Use --fix to interactively resolve detected issues.`;
11
- // TODO: add "Supports --json for programmatic consumption of diagnostic results." to help text
10
+ Run this command when encountering errors with other Blueprint commands. Use --fix to interactively resolve detected issues.
11
+
12
+ Supports --json for programmatic consumption of diagnostic results.`;
12
13
  static examples = [
13
14
  '<%= config.bin %> <%= command.id %>',
14
15
  '<%= config.bin %> <%= command.id %> --fix',
@@ -19,11 +20,6 @@ Run this command when encountering errors with other Blueprint commands. Use --f
19
20
  description: 'Interactively fix configuration issues',
20
21
  default: false,
21
22
  }),
22
- verbose: Flags.boolean({
23
- description: 'Verbose output; defaults to true',
24
- default: true,
25
- allowNo: true,
26
- }),
27
23
  };
28
24
  async run() {
29
25
  const { token } = config;
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class InfoCommand extends ResolvedCommand<typeof InfoCommand> {
3
- static needs: readonly ["deployedStack"];
3
+ static needs: readonly ['deployedStack'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class LogsCommand extends ResolvedCommand<typeof LogsCommand> {
3
- static needs: readonly ["deployedStack"];
3
+ static needs: readonly ['deployedStack'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class MintDeployTokenCommand extends ResolvedCommand<typeof MintDeployTokenCommand> {
3
- static needs: readonly ["scope"];
3
+ static needs: readonly ['scope'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class PlanCommand extends ResolvedCommand<typeof PlanCommand> {
3
- static needs: readonly ["token", "blueprint"];
3
+ static needs: readonly ['token', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class PromoteCommand extends ResolvedCommand<typeof PromoteCommand> {
3
- static needs: readonly ["deployedStack", "blueprint"];
3
+ static needs: readonly ['deployedStack', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class StacksCommand extends ResolvedCommand<typeof StacksCommand> {
3
- static needs: readonly ["scope"];
3
+ static needs: readonly ['scope'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class AddCommand extends ResolvedCommand<typeof AddCommand> {
3
- static needs: readonly ["blueprint"];
3
+ static needs: readonly ['blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class BuildCommand extends ResolvedCommand<typeof BuildCommand> {
3
- static needs: readonly ["blueprint"];
3
+ static needs: readonly ['blueprint'];
4
4
  static summary: string;
5
5
  static hidden: boolean;
6
6
  static args: {
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class DevCommand extends ResolvedCommand<typeof DevCommand> {
3
- static needs: readonly ["blueprint"];
3
+ static needs: readonly ['blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static examples: string[];
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../../baseCommands.js';
2
2
  export default class EnvAddCommand extends ResolvedCommand<typeof EnvAddCommand> {
3
- static needs: readonly ["deployedStack", "blueprint"];
3
+ static needs: readonly ['deployedStack', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static args: {
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../../baseCommands.js';
2
2
  export default class EnvListCommand extends ResolvedCommand<typeof EnvListCommand> {
3
- static needs: readonly ["deployedStack", "blueprint"];
3
+ static needs: readonly ['deployedStack', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static args: {
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../../baseCommands.js';
2
2
  export default class EnvRemoveCommand extends ResolvedCommand<typeof EnvRemoveCommand> {
3
- static needs: readonly ["deployedStack", "blueprint"];
3
+ static needs: readonly ['deployedStack', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static args: {
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class LogsCommand extends ResolvedCommand<typeof LogsCommand> {
3
- static needs: readonly ["deployedStack", "blueprint"];
3
+ static needs: readonly ['deployedStack', 'blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static args: {
@@ -1,6 +1,6 @@
1
1
  import { ResolvedCommand } from '../../baseCommands.js';
2
2
  export default class TestCommand extends ResolvedCommand<typeof TestCommand> {
3
- static needs: readonly ["blueprint"];
3
+ static needs: readonly ['blueprint'];
4
4
  static summary: string;
5
5
  static description: string;
6
6
  static args: {
@@ -19,7 +19,8 @@ export async function blueprintDeployCore(options) {
19
19
  const noWait = flags['no-wait'] || false;
20
20
  const stackName = flags['new-stack-name'] ?? deployedStack.name;
21
21
  const installer = flags['fn-installer'] || undefined;
22
- const workspaceWarnings = getWarnings({ dir: dirname(blueprint.fileInfo.blueprintFilePath) });
22
+ const blueprintFileDir = dirname(blueprint.fileInfo.blueprintFilePath);
23
+ const workspaceWarnings = getWarnings({ dir: blueprintFileDir });
23
24
  log(`Deploying "${stackName}" ${niceId(deployedStack.id)}...`);
24
25
  try {
25
26
  const { ok: checkOk, stack: currentStack } = await getStack({ stackId, auth, logger: log });
@@ -42,7 +43,7 @@ export async function blueprintDeployCore(options) {
42
43
  if (assetResources.length > 0) {
43
44
  log('Processing assets...');
44
45
  for (const resource of assetResources) {
45
- const preDeployResult = await preDeploy(resource, { auth, installer, log });
46
+ const preDeployResult = await preDeploy(resource, { auth, blueprintFileDir, installer, log });
46
47
  if (!preDeployResult.success)
47
48
  return preDeployResult;
48
49
  const idx = resources.indexOf(resource);
@@ -152,7 +153,7 @@ export async function blueprintDeployCore(options) {
152
153
  }
153
154
  }
154
155
  async function preDeploy(resource, options) {
155
- const { auth, installer, log } = options;
156
+ const { auth, blueprintFileDir, installer, log } = options;
156
157
  const fnSpinner = log.ora({ text: `Processing ${resource.name}...`, prefixText: ' ' }).start();
157
158
  const warnTimer = setTimeout(() => {
158
159
  fnSpinner.text = `Still processing ${resource.name}, this can take a moment...`;
@@ -161,7 +162,7 @@ async function preDeploy(resource, options) {
161
162
  let result;
162
163
  try {
163
164
  result = await Promise.race([
164
- stashAsset({ resource, auth, logger: log, installer }),
165
+ stashAsset({ resource, blueprintFileDir, auth, logger: log, installer }),
165
166
  new Promise((_, reject) => {
166
167
  assetTimeoutTimer = setTimeout(() => {
167
168
  reject(new Error(`Processing ${resource.name} timed out after ${assetTimeoutS}s`));
@@ -2,13 +2,13 @@ import { readFileSync } from 'node:fs';
2
2
  import { dirname } from 'node:path';
3
3
  import { arch, cwd, env, version as nodeVersion, platform } from 'node:process';
4
4
  import * as resolve from 'empathic/resolve';
5
- import ora from 'ora';
6
5
  import { loadAndParseBlueprint, } from '../../actions/blueprints/blueprint.js';
7
6
  import { readConfigFile } from '../../actions/blueprints/config.js';
8
7
  import { resolveIds } from '../../actions/blueprints/resolve.js';
9
8
  import { getStack } from '../../actions/blueprints/stacks.js';
10
9
  import config, { RUNTIME_CLI_VERSION } from '../../config.js';
11
10
  import { formatDateTime } from '../../utils/display/dates.js';
11
+ import { presentBlueprintParserErrors } from '../../utils/display/errors.js';
12
12
  import { advise, check, filePathRelativeToCwd, niceId, renderSection, severe, unsure, } from '../../utils/display/presenters.js';
13
13
  import { styleText } from '../../utils/style-text.js';
14
14
  import { createTracedFetch } from '../../utils/traced-fetch.js';
@@ -55,7 +55,7 @@ export async function blueprintDoctorCore(options) {
55
55
  envRows.push(['CLI', bin]);
56
56
  const configRows = [];
57
57
  const stackRows = [];
58
- const spinner = ora('Running diagnostics...').start();
58
+ const spinner = log.ora('Running diagnostics...').start();
59
59
  // --- ONLINE ---
60
60
  const fetchFn = createTracedFetch(log);
61
61
  try {
@@ -109,6 +109,7 @@ export async function blueprintDoctorCore(options) {
109
109
  status: false,
110
110
  detail: `${blueprint.errors.length} error(s)`,
111
111
  };
112
+ log.verbose(presentBlueprintParserErrors(blueprint.errors));
112
113
  }
113
114
  }
114
115
  catch {
@@ -186,6 +187,8 @@ export async function blueprintDoctorCore(options) {
186
187
  stackRows.push(['Operation', `${op.status}${timestamp}`]);
187
188
  if (op.userMessage)
188
189
  stackRows.push([' Message', `"${op.userMessage}"`]);
190
+ if (v && op.systemMessage)
191
+ stackRows.push([' System', `"${op.systemMessage}"`]);
189
192
  }
190
193
  if (stack.resources) {
191
194
  stackRows.push(['Resources', `${stack.resources.length}`]);
@@ -275,20 +278,20 @@ export async function blueprintDoctorCore(options) {
275
278
  }
276
279
  // --- RENDER REPORT ---
277
280
  spinner.stop();
278
- // Environment (verbose)
279
- log.verbose(renderSection('Environment', envRows));
280
- log.verbose('');
281
- // Configuration (verbose)
281
+ // Environment
282
+ log(renderSection('Environment', envRows));
283
+ log('');
284
+ // Configuration
282
285
  if (configRows.length > 0) {
283
- log.verbose(renderSection('Configuration', configRows));
284
- log.verbose('');
286
+ log(renderSection('Configuration', configRows));
287
+ log('');
285
288
  }
286
- // Deployment (verbose)
289
+ // Deployment
287
290
  if (stackRows.length > 0) {
288
- log.verbose(renderSection('Deployment', stackRows));
289
- log.verbose('');
291
+ log(renderSection('Deployment', stackRows));
292
+ log('');
290
293
  }
291
- // Checks (always visible)
294
+ // Checks
292
295
  const maxLabel = Math.max(...Object.values(diagLookup).map((l) => l.length));
293
296
  log(styleText('bold', 'Checks'));
294
297
  let allGood = true;
@@ -18,13 +18,14 @@ export async function functionBuildCore(options) {
18
18
  functions = allFunctions;
19
19
  }
20
20
  const installer = flags['fn-installer'] || undefined;
21
- const outDir = flags['out-dir'] || path.join(path.dirname(blueprint.fileInfo.blueprintFilePath), '.build');
21
+ const blueprintFileDir = path.dirname(blueprint.fileInfo.blueprintFilePath);
22
+ const outDir = flags['out-dir'] || path.join(blueprintFileDir, '.build');
22
23
  await fs.promises.mkdir(outDir, { recursive: true });
23
24
  const errors = [];
24
25
  const built = [];
25
26
  for (const resource of functions) {
26
27
  const spinner = log.ora(`Building ${resource.name}...`).start();
27
- const prepResult = await prepareAsset({ resource }, { installer });
28
+ const prepResult = await prepareAsset({ resource, blueprintFileDir, installer });
28
29
  if (prepResult.success === false) {
29
30
  spinner.fail(`Failed to build ${resource.name}`);
30
31
  errors.push({ name: resource.name, error: prepResult.error ?? 'Unknown error' });