Skip to content

[rush] Add status emojis #5293

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

dmichon-msft
Copy link
Contributor

@dmichon-msft dmichon-msft commented Jul 30, 2025

Summary

Fixes #5292

Details

Adds emoji status indicators. Note that the status indicators displayed in the headers are real-time, so errors may show up before the operation that failed gets reported in the console. Making the status indicators reflect status as-of the moment the operation being listed entered execution is possible, but might make the status less useful.

How it was tested

Executing a maximum of 16 simultaneous processes...
Legend:
❌️ FAILURE
⚡️ SUCCESS WITH WARNINGS
🔄 EXECUTING
⏳️ WAITING / QUEUED / READY
🚧 BLOCKED
✅️ SUCCESS
📦 FROM CACHE / SKIPPED

==[ decoupled-local-node-rig (build) ]================================[⏳️ 69]==
 "decoupled-local-node-rig (build)" did not define any work.

==[ @rushstack/eslint-patch (build) ]============================[🔄 1 ⏳️ 68]==
📦 "@rushstack/eslint-patch (build)" was restored from the build cache.

==[ decoupled-local-node-rig (test) ]=======================[🔄 4 ⏳️ 59 📦 5]==
 "decoupled-local-node-rig (test)" did not define any work.

==[ @rushstack/tree-pattern (build) ]=======================[🔄 4 ⏳️ 59 📦 5]==
📦 "@rushstack/tree-pattern (build)" was restored from the build cache.

==[ @rushstack/rig-package (build) ]========================[🔄 4 ⏳️ 59 📦 5]==
📦 "@rushstack/rig-package (build)" was restored from the build cache.

==[ @rushstack/node-core-library (build) ]==================[🔄 4 ⏳️ 59 📦 5]==
📦 "@rushstack/node-core-library (build)" was restored from the build cache.

==[ @rushstack/eslint-patch (test) ]=============================[⏳️ 58 📦 9]==
 "@rushstack/eslint-patch (test)" did not define any work.

==[ @rushstack/tree-pattern (test) ]=============================[⏳️ 58 📦 9]==
📦 "@rushstack/tree-pattern (test)" was restored from the build cache.

==[ @rushstack/eslint-plugin (build) ]===========================[⏳️ 58 📦 9]==
📦 "@rushstack/eslint-plugin (build)" was restored from the build cache.

==[ @rushstack/eslint-plugin-security (build) ]=============[🔄 5 ⏳️ 53 📦 9]==
📦 "@rushstack/eslint-plugin-security (build)" was restored from the build cache.

==[ @rushstack/rig-package (test) ]=========================[🔄 5 ⏳️ 53 📦 9]==
📦 "@rushstack/rig-package (test)" was restored from the build cache.

==[ @rushstack/eslint-plugin-packlets (build) ]=============[🔄 5 ⏳️ 53 📦 9]==
📦 "@rushstack/eslint-plugin-packlets (build)" was restored from the build cache.

==[ @microsoft/api-extractor-model (build) ]================[🔄 5 ⏳️ 53 📦 9]==
📦 "@microsoft/api-extractor-model (build)" was restored from the build cache.

==[ @rushstack/eslint-config (build) ]=====================[🔄 5 ⏳️ 45 📦 15]==
 "@rushstack/eslint-config (build)" did not define any work.

==[ @rushstack/eslint-config (test) ]======================[🔄 5 ⏳️ 45 📦 15]==
 "@rushstack/eslint-config (test)" did not define any work.

==[ @rushstack/eslint-plugin-security (test) ]=============[🔄 5 ⏳️ 45 📦 15]==
📦 "@rushstack/eslint-plugin-security (test)" was restored from the build cache.

==[ @rushstack/eslint-plugin-packlets (test) ]=============[🔄 5 ⏳️ 45 📦 15]==
📦 "@rushstack/eslint-plugin-packlets (test)" was restored from the build cache.

==[ @rushstack/node-core-library (test) ]==================[🔄 5 ⏳️ 45 📦 15]==
📦 "@rushstack/node-core-library (test)" was restored from the build cache.

==[ @rushstack/terminal (build) ]==========================[🔄 5 ⏳️ 45 📦 15]==
📦 "@rushstack/terminal (build)" was restored from the build cache.

==[ @rushstack/eslint-plugin (test) ]======================[🔄 5 ⏳️ 45 📦 15]==
📦 "@rushstack/eslint-plugin (test)" was restored from the build cache.

==[ local-eslint-config (build) ]==========================[🔄 5 ⏳️ 45 📦 15]==
✅️ "local-eslint-config (build)" completed successfully in 0.38 seconds.

==[ @rushstack/terminal (test) ]===========================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/terminal (test)" was restored from the build cache.

==[ @rushstack/heft-config-file (build) ]==================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/heft-config-file (build)" was restored from the build cache.

==[ @rushstack/operation-graph (build) ]===================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/operation-graph (build)" was restored from the build cache.

==[ @rushstack/ts-command-line (build) ]===================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/ts-command-line (build)" was restored from the build cache.

==[ @microsoft/api-extractor-model (test) ]================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@microsoft/api-extractor-model (test)" was restored from the build cache.

==[ @rushstack/heft-config-file (test) ]===================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/heft-config-file (test)" was restored from the build cache.

==[ @rushstack/operation-graph (test) ]====================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/operation-graph (test)" was restored from the build cache.

==[ @rushstack/ts-command-line (test) ]====================[⏳️ 41 ✅️ 1 📦 23]==
📦 "@rushstack/ts-command-line (test)" was restored from the build cache.

==[ @microsoft/api-extractor (build) ]================[🔄 1 ⏳️ 40 ✅️ 1 📦 23]==
📦 "@microsoft/api-extractor (build)" was restored from the build cache.

==[ local-eslint-config (test) ]===========================[⏳️ 39 ✅️ 1 📦 24]==
 "local-eslint-config (test)" did not define any work.

==[ @microsoft/api-extractor (test) ]=================[🔄 1 ⏳️ 38 ✅️ 1 📦 24]==
📦 "@microsoft/api-extractor (test)" was restored from the build cache.

==[ @rushstack/heft (build) ]==============================[⏳️ 37 ✅️ 1 📦 26]==
📦 "@rushstack/heft (build)" was restored from the build cache.

==[ @rushstack/heft (test) ]==========================[🔄 1 ⏳️ 36 ✅️ 1 📦 26]==
📦 "@rushstack/heft (test)" was restored from the build cache.

==[ @rushstack/heft-api-extractor-plugin (build) ]====[🔄 1 ⏳️ 29 ✅️ 1 📦 31]==
📦 "@rushstack/heft-api-extractor-plugin (build)" was restored from the build cache.

==[ @rushstack/heft-api-extractor-plugin (test) ]=====[🔄 1 ⏳️ 29 ✅️ 1 📦 31]==
 "@rushstack/heft-api-extractor-plugin (test)" did not define any work.

==[ @rushstack/heft-typescript-plugin (build) ]=======[🔄 1 ⏳️ 29 ✅️ 1 📦 31]==
📦 "@rushstack/heft-typescript-plugin (build)" was restored from the build cache.

==[ @rushstack/heft-typescript-plugin (test) ]========[🔄 1 ⏳️ 29 ✅️ 1 📦 31]==
 "@rushstack/heft-typescript-plugin (test)" did not define any work.

==[ @rushstack/heft-jest-plugin (build) ]=============[🔄 1 ⏳️ 29 ✅️ 1 📦 31]==
📦 "@rushstack/heft-jest-plugin (build)" was restored from the build cache.

==[ @rushstack/heft-lint-plugin (build) ]=============[🔄 1 ⏳️ 29 ✅️ 1 📦 31]==
📦 "@rushstack/heft-lint-plugin (build)" was restored from the build cache.

==[ @rushstack/heft-jest-plugin (test) ]===================[⏳️ 29 ✅️ 1 📦 32]==
📦 "@rushstack/heft-jest-plugin (test)" was restored from the build cache.

==[ @rushstack/heft-node-rig (build) ]================[🔄 4 ⏳️ 19 ✅️ 1 📦 34]==
 "@rushstack/heft-node-rig (build)" did not define any work.

==[ @rushstack/heft-node-rig (test) ]=================[🔄 4 ⏳️ 19 ✅️ 1 📦 34]==
 "@rushstack/heft-node-rig (test)" did not define any work.

==[ local-node-rig (build) ]==========================[🔄 4 ⏳️ 19 ✅️ 1 📦 34]==
 "local-node-rig (build)" did not define any work.

==[ local-node-rig (test) ]===========================[🔄 4 ⏳️ 19 ✅️ 1 📦 34]==
 "local-node-rig (test)" did not define any work.

==[ @rushstack/worker-pool (build) ]==================[🔄 4 ⏳️ 19 ✅️ 1 📦 34]==
📦 "@rushstack/worker-pool (build)" was restored from the build cache.

==[ @rushstack/heft-lint-plugin (test) ]==============[🔄 4 ⏳️ 19 ✅️ 1 📦 34]==
📦 "@rushstack/heft-lint-plugin (test)" was restored from the build cache.

==[ @rushstack/debug-certificate-manager (build) ]====[🔄 5 ⏳️ 15 ✅️ 1 📦 36]==
📦 "@rushstack/debug-certificate-manager (build)" was restored from the build cache.

==[ @rushstack/debug-certificate-manager (test) ]=====[🔄 5 ⏳️ 15 ✅️ 1 📦 36]==
 "@rushstack/debug-certificate-manager (test)" did not define any work.

==[ @rushstack/heft-sass-plugin (build) ]=============[🔄 5 ⏳️ 15 ✅️ 1 📦 36]==
📦 "@rushstack/heft-sass-plugin (build)" was restored from the build cache.

==[ @rushstack/module-minifier (build) ]==============[🔄 5 ⏳️ 15 ✅️ 1 📦 36]==
📦 "@rushstack/module-minifier (build)" was restored from the build cache.

==[ @rushstack/worker-pool (test) ]===================[🔄 3 ⏳️ 15 ✅️ 1 📦 38]==
📦 "@rushstack/worker-pool (test)" was restored from the build cache.

==[ @rushstack/heft-webpack5-plugin (build) ]=========[🔄 3 ⏳️ 15 ✅️ 1 📦 38]==
📦 "@rushstack/heft-webpack5-plugin (build)" was restored from the build cache.

==[ @rushstack/heft-sass-plugin (test) ]==============[🔄 3 ⏳️ 13 ✅️ 1 📦 40]==
📦 "@rushstack/heft-sass-plugin (test)" was restored from the build cache.

==[ @rushstack/heft-webpack4-plugin (build) ]=========[🔄 3 ⏳️ 13 ✅️ 1 📦 40]==
[build:lint] Warning: heft-plugins/heft-webpack4-plugin/src/WebpackConfigurationLoader.test.ts:19:1 - (no-console) Unexpected console statement. Only these console methods are allowed: debug, info, time, timeEnd, trace.
Encountered 1 warning
  [build:lint] heft-plugins/heft-webpack4-plugin/src/WebpackConfigurationLoader.test.ts:19:1 - (no-console) Unexpected console statement. Only these console methods are allowed: debug, info, time, timeEnd, trace.
⚡️ "@rushstack/heft-webpack4-plugin (build)" completed with warnings in 5.93 seconds.

==[ @rushstack/heft-web-rig (build) ]========[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
 "@rushstack/heft-web-rig (build)" did not define any work.

==[ @rushstack/heft-web-rig (test) ]=========[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
 "@rushstack/heft-web-rig (test)" did not define any work.

==[ local-web-rig (build) ]==================[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
 "local-web-rig (build)" did not define any work.

==[ local-web-rig (test) ]===================[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
 "local-web-rig (test)" did not define any work.

==[ @rushstack/module-minifier (test) ]======[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
📦 "@rushstack/module-minifier (test)" was restored from the build cache.

==[ @rushstack/webpack4-module-minifier-plugin (build) ][❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
📦 "@rushstack/webpack4-module-minifier-plugin (build)" was restored from the build cache.

==[ @rushstack/heft-webpack5-plugin (test) ]=[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
📦 "@rushstack/heft-webpack5-plugin (test)" was restored from the build cache.

==[ @rushstack/webpack4-module-minifier-plugin (test) ][❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
📦 "@rushstack/webpack4-module-minifier-plugin (test)" was restored from the build cache.

==[ @microsoft/load-themed-styles (build) ]==[❌️ 1 ⚡️ 1 ⏳️ 1 🚧 5 ✅️ 1 📦 44]==
[build:typescript] Error: libraries/load-themed-styles/src/index.ts:10:1 - (TS2304) Cannot find name 'zzzz'.
Encountered 1 error
  [build:typescript] libraries/load-themed-styles/src/index.ts:10:1 - (TS2304) Cannot find name 'zzzz'.
Returned error code: 1
❌️ "@microsoft/load-themed-styles (build)" failed to build.
🚧 "@microsoft/load-themed-styles (test)" is blocked by "@microsoft/load-themed-styles (build)".
🚧 "@rushstack/heft-sass-load-themed-styles-plugin (build)" is blocked by "@microsoft/load-themed-styles (build)".
🚧 "@rushstack/heft-sass-load-themed-styles-plugin (test)" is blocked by "@microsoft/load-themed-styles (build)".
🚧 "heft-sass-test (build)" is blocked by "@microsoft/load-themed-styles (build)".
🚧 "heft-sass-test (test)" is blocked by "@microsoft/load-themed-styles (build)".

==[ @rushstack/heft-webpack4-plugin (test) ]=[❌️ 1 ⚡️ 1 🔄 1 🚧 5 ✅️ 1 📦 44]==
📦 "@rushstack/heft-webpack4-plugin (test)" was restored from the build cache.



==[ NO OP: 17 operations ]====================================================

These operations did not define any work:
  @rushstack/debug-certificate-manager (test)
  @rushstack/eslint-config (build)
  @rushstack/eslint-config (test)
  @rushstack/eslint-patch (test)
  @rushstack/heft-api-extractor-plugin (test)
  @rushstack/heft-node-rig (build)
  @rushstack/heft-node-rig (test)
  @rushstack/heft-typescript-plugin (test)
  @rushstack/heft-web-rig (build)
  @rushstack/heft-web-rig (test)
  decoupled-local-node-rig (build)
  decoupled-local-node-rig (test)
  local-eslint-config (test)
  local-node-rig (build)
  local-node-rig (test)
  local-web-rig (build)
  local-web-rig (test)

==[📦 FROM CACHE: 45 operations ]===============================================

These operations were restored from the build cache:
  @microsoft/api-extractor (build)                      0.03 seconds
  @microsoft/api-extractor (test)                       0.05 seconds
  @microsoft/api-extractor-model (build)                0.05 seconds
  @microsoft/api-extractor-model (test)                 0.03 seconds
  @rushstack/debug-certificate-manager (build)          0.04 seconds
  @rushstack/eslint-patch (build)                       0.04 seconds
  @rushstack/eslint-plugin (build)                      0.07 seconds
  @rushstack/eslint-plugin (test)                       0.09 seconds
  @rushstack/eslint-plugin-packlets (build)             0.06 seconds
  @rushstack/eslint-plugin-packlets (test)              0.03 seconds
  @rushstack/eslint-plugin-security (build)             0.07 seconds
  @rushstack/eslint-plugin-security (test)              0.02 seconds
  @rushstack/heft (build)                               0.03 seconds
  @rushstack/heft (test)                                0.04 seconds
  @rushstack/heft-api-extractor-plugin (build)          0.02 seconds
  @rushstack/heft-config-file (build)                   0.06 seconds
  @rushstack/heft-config-file (test)                    0.02 seconds
  @rushstack/heft-jest-plugin (build)                   0.04 seconds
  @rushstack/heft-jest-plugin (test)                    0.02 seconds
  @rushstack/heft-lint-plugin (build)                   0.07 seconds
  @rushstack/heft-lint-plugin (test)                    0.03 seconds
  @rushstack/heft-sass-plugin (build)                   0.05 seconds
  @rushstack/heft-sass-plugin (test)                    0.02 seconds
  @rushstack/heft-typescript-plugin (build)             0.02 seconds
  @rushstack/heft-webpack4-plugin (test)                0.01 seconds
  @rushstack/heft-webpack5-plugin (build)               0.03 seconds
  @rushstack/heft-webpack5-plugin (test)                0.01 seconds
  @rushstack/module-minifier (build)                    0.03 seconds
  @rushstack/module-minifier (test)                     0.02 seconds
  @rushstack/node-core-library (build)                  0.08 seconds
  @rushstack/node-core-library (test)                   0.06 seconds
  @rushstack/operation-graph (build)                    0.05 seconds
  @rushstack/operation-graph (test)                     0.02 seconds
  @rushstack/rig-package (build)                        0.07 seconds
  @rushstack/rig-package (test)                         0.03 seconds
  @rushstack/terminal (build)                           0.05 seconds
  @rushstack/terminal (test)                            0.03 seconds
  @rushstack/tree-pattern (build)                       0.03 seconds
  @rushstack/tree-pattern (test)                        0.05 seconds
  @rushstack/ts-command-line (build)                    0.06 seconds
  @rushstack/ts-command-line (test)                     0.02 seconds
  @rushstack/webpack4-module-minifier-plugin (build)    0.02 seconds
  @rushstack/webpack4-module-minifier-plugin (test)     0.01 seconds
  @rushstack/worker-pool (build)                        0.03 seconds
  @rushstack/worker-pool (test)                         0.03 seconds

==[✅️ SUCCESS: 1 operation ]====================================================

These operations completed successfully:
  local-eslint-config (build)    0.38 seconds

==[⚡️ SUCCESS WITH WARNINGS: 1 operation ]======================================

--[⚡️ WARNING: @rushstack/heft-webpack4-plugin (build) ]-------[ 5.93 seconds ]--

[build:lint] Warning: heft-plugins/heft-webpack4-plugin/src/WebpackConfigurationLoader.test.ts:19:1 - (no-console) Unexpected console statement. Only these console methods are allowed: debug, info, time, timeEnd, trace.
Encountered 1 warning
  [build:lint] heft-plugins/heft-webpack4-plugin/src/WebpackConfigurationLoader.test.ts:19:1 - (no-console) Unexpected console statement. Only these console methods are allowed: debug, info, time, timeEnd, trace.

==[🚧 BLOCKED: 5 operations ]===================================================

These operations were blocked by dependencies that failed:
  @microsoft/load-themed-styles (test)
  @rushstack/heft-sass-load-themed-styles-plugin (build)
  @rushstack/heft-sass-load-themed-styles-plugin (test)
  heft-sass-test (build)
  heft-sass-test (test)

==[❌️ FAILURE: 1 operation ]====================================================

--[❌️ FAILURE: @microsoft/load-themed-styles (build) ]---------[ 2.09 seconds ]--

[build:typescript] Error: libraries/load-themed-styles/src/index.ts:10:1 - (TS2304) Cannot find name 'zzzz'.
Encountered 1 error
  [build:typescript] libraries/load-themed-styles/src/index.ts:10:1 - (TS2304) Cannot find name 'zzzz'.


Operations failed.

❌️ rush test (7.10 seconds)

Impacted documentation

None. Purely alters console output.

@dmichon-msft
Copy link
Contributor Author

Thinking more about this, I may need to switch to recalculating the status bar to only reflect terminal statuses of operations that have been rendered so far, since it might be confusing to see an error reflected in the log but have to scroll down (rather than up) to see it.

@octogonz
Copy link
Collaborator

David reported that the emoji don't render with correct widths in certain contexts such as GitHub codespans and VS Code console.

Another idea might be to stick with characters that are included in standard console fonts like Consolas, and then spice it up with some ANSI colors - something like:

● SUCCESS / FROM CACHE / SKIPPED / NO OP
▲ SUCCESS WITH WARNINGS
× FAILURE
■ BLOCKED
… status not yet reported

@dmichon-msft
Copy link
Contributor Author

David reported that the emoji don't render with correct widths in certain contexts such as GitHub codespans and VS Code console.

Another idea might be to stick with characters that are included in standard console fonts like Consolas, and then spice it up with some ANSI colors - something like:

● SUCCESS / FROM CACHE / SKIPPED / NO OP
▲ SUCCESS WITH WARNINGS
× FAILURE
■ BLOCKED
… status not yet reported

Hm, these could work; would want one more separate glyph for FROM CACHE / SKIPPED (or at least a different color). The main headache would be that injecting the color codes would mean I need to do extra math to ensure correct width.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Needs triage
Development

Successfully merging this pull request may close these issues.

[rush] RFC: Advanced CLI status reporting
2 participants