-
-
Notifications
You must be signed in to change notification settings - Fork 165
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
new: Support task scripts (as an alternative to commands). #1530
Conversation
Run report for c5a73f5b
|
Action | Time | Status | Info | |
---|---|---|---|---|
🟩 | SyncWorkspace |
29.9ms | Passed | |
🟩 | SetupToolchain(node:~20) |
23.3s | Passed | |
🟩 | SyncProject(node, types) |
4.6ms | Passed | |
🟩 | SyncProject(node, runtime) |
3.7ms | Passed | |
🟩 | SyncProject(node, report) |
5.1ms | Passed | |
🟩 | SyncProject(node, website) |
4.2ms | Passed | |
🟩 | SyncProject(node, nx-compat) |
12.1ms | Passed | |
🟩 | InstallWorkspaceDeps(node:~20) |
43.1s | Passed | |
🟦 | RunTask(types:typecheck) |
1.1s | Cached | |
🟦 | RunTask(types:lint) |
1.4s | Cached | |
🟦 | RunTask(types:build) |
1.4s | Cached | |
🟩 | RunTask(types:format) |
1.7s | Passed | |
🟦 | RunTask(types:test) |
699.6ms | Cached | |
🟦 | RunTask(nx-compat:build) |
683.9ms | Cached | |
🟦 | RunTask(nx-compat:lint) |
713.6ms | Cached | |
🟦 | RunTask(nx-compat:test) |
629.4ms | Cached | |
🟩 | RunTask(nx-compat:format) |
1s | Passed | |
🟦 | RunTask(nx-compat:typecheck) |
614ms | Cached | |
🟦 | RunTask(report:build) |
623.7ms | Cached | |
🟦 | RunTask(runtime:build) |
640ms | Cached | |
And 13 more... |
Expanded report
Action | Time | Status | Info | |
---|---|---|---|---|
🟩 | RunTask(report:format) |
876ms | Passed | |
🟦 | RunTask(report:lint) |
600.7ms | Cached | |
🟦 | RunTask(report:typecheck) |
569.9ms | Cached | |
🟦 | RunTask(runtime:lint) |
578.9ms | Cached | |
🟦 | RunTask(report:test) |
915.6ms | Cached | |
🟩 | RunTask(runtime:format) |
670.8ms | Passed | |
🟦 | RunTask(runtime:typecheck) |
629ms | Cached | |
🟦 | RunTask(runtime:test) |
666.5ms | Cached | |
🟦 | RunTask(website:typecheck) |
918.8ms | Cached | |
🟦 | RunTask(website:lint) |
917.6ms | Cached | |
🟦 | RunTask(website:test) |
649.4ms | Cached | |
🟩 | RunTask(website:format) |
9.8s | Passed | |
🟩 | RunTask(website:build) |
1m 46s | Passed |
Environment
OS: Linux
Matrix:
os = ubuntu-latest
node-version = 20
Touched files
.github/workflows/rust.yml
Cargo.lock
crates/app/src/commands/project.rs
crates/app/src/commands/task.rs
crates/cli/tests/run_bun_test.rs
crates/cli/tests/run_deno_test.rs
crates/cli/tests/run_node_test.rs
crates/cli/tests/run_rust_test.rs
crates/cli/tests/run_test.rs
crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_deno_test__deno__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__npm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__pnpm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn1__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn__runs_script_task.snap
crates/cli/tests/snapshots/run_rust_test__runs_script_task.snap
crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap
crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap
crates/cli/tests/snapshots/run_test__output_styles__hash.snap
crates/cli/tests/snapshots/run_test__task_scripts__doesnt_passthrough_args.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_multiple_commands.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_pipes.snap
crates/common/src/consts.rs
crates/config/src/project/task_config.rs
crates/config/tests/task_config_test.rs
crates/project-expander/Cargo.toml
crates/project-expander/src/tasks_expander.rs
crates/project-expander/src/token_expander.rs
crates/project-expander/tests/token_expander_test.rs
crates/task-builder/src/tasks_builder.rs
crates/task-builder/tests/__fixtures__/builder/scripts/moon.yml
crates/task-builder/tests/tasks_builder_test.rs
crates/task-hasher/src/task_hash.rs
crates/task-runner/src/command_builder.rs
crates/task-runner/src/command_executor.rs
crates/task-runner/src/task_runner.rs
crates/task/src/task.rs
crates/test-utils/src/sandbox.rs
legacy/core/test-utils/src/configs.rs
packages/cli/CHANGELOG.md
packages/types/src/tasks-config.ts
tests/fixtures/bun-node-pm/bun/moon.yml
tests/fixtures/bun-node-pm/node/moon.yml
tests/fixtures/bun/base/moon.yml
tests/fixtures/cases/task-script/args.sh
tests/fixtures/cases/task-script/moon.yml
tests/fixtures/deno/base/moon.yml
tests/fixtures/node-bun/workspaces/base/moon.yml
tests/fixtures/node-npm/workspaces/base/moon.yml
tests/fixtures/node-pnpm/workspaces/base/moon.yml
tests/fixtures/node-yarn/workspaces/base/moon.yml
tests/fixtures/node-yarn1/workspaces/base/moon.yml
tests/fixtures/node/base/moon.yml
tests/fixtures/rust/cases/moon.yml
website/docs/concepts/task.mdx
website/docs/config/project.mdx
website/docs/faq.mdx
website/docs/how-it-works/languages.mdx
website/docs/setup-workspace.mdx
website/static/schemas/project.json
website/static/schemas/tasks.json
Run report for c5a73f5b
|
Action | Time | Status | Info | |
---|---|---|---|---|
🟩 | SyncWorkspace |
27.6ms | Passed | |
🟩 | SetupToolchain(node:~18) |
23.1s | Passed | |
🟩 | SyncProject(node, types) |
3.1ms | Passed | |
🟩 | SyncProject(node, nx-compat) |
3ms | Passed | |
🟩 | SyncProject(node, runtime) |
2.9ms | Passed | |
🟩 | SyncProject(node, website) |
3.4ms | Passed | |
🟩 | SyncProject(node, report) |
10.4ms | Passed | |
🟩 | InstallWorkspaceDeps(node:~18) |
43.6s | Passed | |
🟦 | RunTask(types:build) |
982.8ms | Cached | |
🟦 | RunTask(types:typecheck) |
1.3s | Cached | |
🟦 | RunTask(types:lint) |
1.3s | Cached | |
🟩 | RunTask(types:format) |
1.4s | Passed | |
🟦 | RunTask(types:test) |
703.2ms | Cached | |
🟦 | RunTask(runtime:typecheck) |
702.6ms | Cached | |
🟦 | RunTask(report:test) |
563.3ms | Cached | |
🟦 | RunTask(runtime:build) |
657.6ms | Cached | |
🟦 | RunTask(report:build) |
636ms | Cached | |
🟦 | RunTask(report:lint) |
617ms | Cached | |
🟩 | RunTask(report:format) |
891.3ms | Passed | |
🟦 | RunTask(nx-compat:lint) |
905.3ms | Cached | |
And 13 more... |
Expanded report
Action | Time | Status | Info | |
---|---|---|---|---|
🟦 | RunTask(nx-compat:build) |
630.1ms | Cached | |
🟦 | RunTask(report:typecheck) |
562.2ms | Cached | |
🟩 | RunTask(nx-compat:format) |
974.7ms | Passed | |
🟩 | RunTask(runtime:format) |
788ms | Passed | |
🟦 | RunTask(runtime:lint) |
809.4ms | Cached | |
🟦 | RunTask(runtime:test) |
597.8ms | Cached | |
🟦 | RunTask(website:typecheck) |
606.5ms | Cached | |
🟦 | RunTask(nx-compat:typecheck) |
709ms | Cached | |
🟦 | RunTask(nx-compat:test) |
832.1ms | Cached | |
🟦 | RunTask(website:lint) |
716.9ms | Cached | |
🟦 | RunTask(website:test) |
994.7ms | Cached | |
🟩 | RunTask(website:format) |
10.5s | Passed | |
🟩 | RunTask(website:build) |
1m 44s | Passed |
Environment
OS: Linux
Matrix:
os = ubuntu-latest
node-version = 18
Touched files
.github/workflows/rust.yml
Cargo.lock
crates/app/src/commands/project.rs
crates/app/src/commands/task.rs
crates/cli/tests/run_bun_test.rs
crates/cli/tests/run_deno_test.rs
crates/cli/tests/run_node_test.rs
crates/cli/tests/run_rust_test.rs
crates/cli/tests/run_test.rs
crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_deno_test__deno__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__npm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__pnpm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn1__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn__runs_script_task.snap
crates/cli/tests/snapshots/run_rust_test__runs_script_task.snap
crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap
crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap
crates/cli/tests/snapshots/run_test__output_styles__hash.snap
crates/cli/tests/snapshots/run_test__task_scripts__doesnt_passthrough_args.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_multiple_commands.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_pipes.snap
crates/common/src/consts.rs
crates/config/src/project/task_config.rs
crates/config/tests/task_config_test.rs
crates/project-expander/Cargo.toml
crates/project-expander/src/tasks_expander.rs
crates/project-expander/src/token_expander.rs
crates/project-expander/tests/token_expander_test.rs
crates/task-builder/src/tasks_builder.rs
crates/task-builder/tests/__fixtures__/builder/scripts/moon.yml
crates/task-builder/tests/tasks_builder_test.rs
crates/task-hasher/src/task_hash.rs
crates/task-runner/src/command_builder.rs
crates/task-runner/src/command_executor.rs
crates/task-runner/src/task_runner.rs
crates/task/src/task.rs
crates/test-utils/src/sandbox.rs
legacy/core/test-utils/src/configs.rs
packages/cli/CHANGELOG.md
packages/types/src/tasks-config.ts
tests/fixtures/bun-node-pm/bun/moon.yml
tests/fixtures/bun-node-pm/node/moon.yml
tests/fixtures/bun/base/moon.yml
tests/fixtures/cases/task-script/args.sh
tests/fixtures/cases/task-script/moon.yml
tests/fixtures/deno/base/moon.yml
tests/fixtures/node-bun/workspaces/base/moon.yml
tests/fixtures/node-npm/workspaces/base/moon.yml
tests/fixtures/node-pnpm/workspaces/base/moon.yml
tests/fixtures/node-yarn/workspaces/base/moon.yml
tests/fixtures/node-yarn1/workspaces/base/moon.yml
tests/fixtures/node/base/moon.yml
tests/fixtures/rust/cases/moon.yml
website/docs/concepts/task.mdx
website/docs/config/project.mdx
website/docs/faq.mdx
website/docs/how-it-works/languages.mdx
website/docs/setup-workspace.mdx
website/static/schemas/project.json
website/static/schemas/tasks.json
Run report for c5a73f5b
|
Action | Time | Status | Info | |
---|---|---|---|---|
🟩 | SyncWorkspace |
31.1ms | Passed | |
🟩 | SetupToolchain(node:~20) |
28.8s | Passed | |
🟩 | SyncProject(node, types) |
4.3ms | Passed | |
🟩 | SyncProject(node, nx-compat) |
6ms | Passed | |
🟩 | SyncProject(node, report) |
6.4ms | Passed | |
🟩 | SyncProject(node, runtime) |
6.9ms | Passed | |
🟩 | SyncProject(node, website) |
4.5ms | Passed | |
🟩 | InstallWorkspaceDeps(node:~20) |
1m 2s | Passed | |
🟦 | RunTask(types:build) |
794ms | Cached | |
🟦 | RunTask(types:lint) |
913.4ms | Cached | |
🟦 | RunTask(types:typecheck) |
917ms | Cached | |
🟦 | RunTask(types:test) |
567.2ms | Cached | |
🟦 | RunTask(nx-compat:build) |
658.6ms | Cached | |
🟦 | RunTask(nx-compat:test) |
496.1ms | Cached | |
🟩 | RunTask(types:format) |
2.3s | Passed | |
🟦 | RunTask(nx-compat:typecheck) |
628.4ms | Cached | |
🟦 | RunTask(runtime:build) |
524.3ms | Cached | |
🟩 | RunTask(nx-compat:format) |
2.1s | Passed | |
🟦 | RunTask(report:build) |
481.7ms | Cached | |
🟦 | RunTask(runtime:typecheck) |
449.5ms | Cached | |
And 13 more... |
Expanded report
Action | Time | Status | Info | |
---|---|---|---|---|
🟦 | RunTask(report:typecheck) |
422.2ms | Cached | |
🟩 | RunTask(report:format) |
2.4s | Passed | |
🟦 | RunTask(runtime:lint) |
440.6ms | Cached | |
🟦 | RunTask(report:lint) |
413.1ms | Cached | |
🟦 | RunTask(runtime:test) |
468ms | Cached | |
🟦 | RunTask(report:test) |
571.8ms | Cached | |
🟦 | RunTask(nx-compat:lint) |
411.3ms | Cached | |
🟩 | RunTask(runtime:format) |
1.6s | Passed | |
🟦 | RunTask(website:typecheck) |
471.8ms | Cached | |
🟦 | RunTask(website:test) |
994.6ms | Cached | |
🟦 | RunTask(website:lint) |
1s | Cached | |
🟩 | RunTask(website:format) |
12.8s | Passed | |
🟩 | RunTask(website:build) |
1m 56s | Passed |
Environment
OS: Windows
Matrix:
os = windows-latest
node-version = 20
Touched files
.github/workflows/rust.yml
Cargo.lock
crates/app/src/commands/project.rs
crates/app/src/commands/task.rs
crates/cli/tests/run_bun_test.rs
crates/cli/tests/run_deno_test.rs
crates/cli/tests/run_node_test.rs
crates/cli/tests/run_rust_test.rs
crates/cli/tests/run_test.rs
crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_deno_test__deno__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__npm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__pnpm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn1__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn__runs_script_task.snap
crates/cli/tests/snapshots/run_rust_test__runs_script_task.snap
crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap
crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap
crates/cli/tests/snapshots/run_test__output_styles__hash.snap
crates/cli/tests/snapshots/run_test__task_scripts__doesnt_passthrough_args.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_multiple_commands.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_pipes.snap
crates/common/src/consts.rs
crates/config/src/project/task_config.rs
crates/config/tests/task_config_test.rs
crates/project-expander/Cargo.toml
crates/project-expander/src/tasks_expander.rs
crates/project-expander/src/token_expander.rs
crates/project-expander/tests/token_expander_test.rs
crates/task-builder/src/tasks_builder.rs
crates/task-builder/tests/__fixtures__/builder/scripts/moon.yml
crates/task-builder/tests/tasks_builder_test.rs
crates/task-hasher/src/task_hash.rs
crates/task-runner/src/command_builder.rs
crates/task-runner/src/command_executor.rs
crates/task-runner/src/task_runner.rs
crates/task/src/task.rs
crates/test-utils/src/sandbox.rs
legacy/core/test-utils/src/configs.rs
packages/cli/CHANGELOG.md
packages/types/src/tasks-config.ts
tests/fixtures/bun-node-pm/bun/moon.yml
tests/fixtures/bun-node-pm/node/moon.yml
tests/fixtures/bun/base/moon.yml
tests/fixtures/cases/task-script/args.sh
tests/fixtures/cases/task-script/moon.yml
tests/fixtures/deno/base/moon.yml
tests/fixtures/node-bun/workspaces/base/moon.yml
tests/fixtures/node-npm/workspaces/base/moon.yml
tests/fixtures/node-pnpm/workspaces/base/moon.yml
tests/fixtures/node-yarn/workspaces/base/moon.yml
tests/fixtures/node-yarn1/workspaces/base/moon.yml
tests/fixtures/node/base/moon.yml
tests/fixtures/rust/cases/moon.yml
website/docs/concepts/task.mdx
website/docs/config/project.mdx
website/docs/faq.mdx
website/docs/how-it-works/languages.mdx
website/docs/setup-workspace.mdx
website/static/schemas/project.json
website/static/schemas/tasks.json
Run report for c5a73f5b
|
Action | Time | Status | Info | |
---|---|---|---|---|
🟩 | SyncWorkspace |
32.8ms | Passed | |
🟩 | SetupToolchain(node:~18) |
28.8s | Passed | |
🟩 | SyncProject(node, types) |
4ms | Passed | |
🟩 | SyncProject(node, nx-compat) |
5.3ms | Passed | |
🟩 | SyncProject(node, report) |
5.6ms | Passed | |
🟩 | SyncProject(node, runtime) |
6.1ms | Passed | |
🟩 | SyncProject(node, website) |
4.4ms | Passed | |
🟩 | InstallWorkspaceDeps(node:~18) |
58.2s | Passed | |
🟦 | RunTask(types:lint) |
654.9ms | Cached | |
🟦 | RunTask(types:typecheck) |
766.3ms | Cached | |
🟦 | RunTask(types:build) |
822.5ms | Cached | |
🟦 | RunTask(types:test) |
445.1ms | Cached | |
🟦 | RunTask(nx-compat:build) |
646.1ms | Cached | |
🟦 | RunTask(nx-compat:lint) |
481.9ms | Cached | |
🟦 | RunTask(nx-compat:typecheck) |
427.2ms | Cached | |
🟩 | RunTask(types:format) |
2.2s | Passed | |
🟦 | RunTask(nx-compat:test) |
735.7ms | Cached | |
🟦 | RunTask(runtime:build) |
582.6ms | Cached | |
🟩 | RunTask(nx-compat:format) |
1.9s | Passed | |
🟦 | RunTask(report:build) |
565.9ms | Cached | |
And 13 more... |
Expanded report
Action | Time | Status | Info | |
---|---|---|---|---|
🟦 | RunTask(report:lint) |
445.2ms | Cached | |
🟦 | RunTask(report:test) |
458.8ms | Cached | |
🟦 | RunTask(report:typecheck) |
550.9ms | Cached | |
🟦 | RunTask(runtime:lint) |
419.3ms | Cached | |
🟦 | RunTask(runtime:test) |
440.4ms | Cached | |
🟦 | RunTask(runtime:typecheck) |
413.3ms | Cached | |
🟩 | RunTask(report:format) |
1.9s | Passed | |
🟦 | RunTask(website:typecheck) |
601.8ms | Cached | |
🟩 | RunTask(runtime:format) |
1.5s | Passed | |
🟦 | RunTask(website:lint) |
765.6ms | Cached | |
🟦 | RunTask(website:test) |
678.5ms | Cached | |
🟩 | RunTask(website:format) |
12.9s | Passed | |
🟩 | RunTask(website:build) |
1m 53s | Passed |
Environment
OS: Windows
Matrix:
os = windows-latest
node-version = 18
Touched files
.github/workflows/rust.yml
Cargo.lock
crates/app/src/commands/project.rs
crates/app/src/commands/task.rs
crates/cli/tests/run_bun_test.rs
crates/cli/tests/run_deno_test.rs
crates/cli/tests/run_node_test.rs
crates/cli/tests/run_rust_test.rs
crates/cli/tests/run_test.rs
crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_deno_test__deno__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__bun__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__npm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__pnpm__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn1__runs_script_task.snap
crates/cli/tests/snapshots/run_node_test__yarn__runs_script_task.snap
crates/cli/tests/snapshots/run_rust_test__runs_script_task.snap
crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap
crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap
crates/cli/tests/snapshots/run_test__output_styles__hash.snap
crates/cli/tests/snapshots/run_test__task_scripts__doesnt_passthrough_args.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_multiple_commands.snap
crates/cli/tests/snapshots/run_test__task_scripts__supports_pipes.snap
crates/common/src/consts.rs
crates/config/src/project/task_config.rs
crates/config/tests/task_config_test.rs
crates/project-expander/Cargo.toml
crates/project-expander/src/tasks_expander.rs
crates/project-expander/src/token_expander.rs
crates/project-expander/tests/token_expander_test.rs
crates/task-builder/src/tasks_builder.rs
crates/task-builder/tests/__fixtures__/builder/scripts/moon.yml
crates/task-builder/tests/tasks_builder_test.rs
crates/task-hasher/src/task_hash.rs
crates/task-runner/src/command_builder.rs
crates/task-runner/src/command_executor.rs
crates/task-runner/src/task_runner.rs
crates/task/src/task.rs
crates/test-utils/src/sandbox.rs
legacy/core/test-utils/src/configs.rs
packages/cli/CHANGELOG.md
packages/types/src/tasks-config.ts
tests/fixtures/bun-node-pm/bun/moon.yml
tests/fixtures/bun-node-pm/node/moon.yml
tests/fixtures/bun/base/moon.yml
tests/fixtures/cases/task-script/args.sh
tests/fixtures/cases/task-script/moon.yml
tests/fixtures/deno/base/moon.yml
tests/fixtures/node-bun/workspaces/base/moon.yml
tests/fixtures/node-npm/workspaces/base/moon.yml
tests/fixtures/node-pnpm/workspaces/base/moon.yml
tests/fixtures/node-yarn/workspaces/base/moon.yml
tests/fixtures/node-yarn1/workspaces/base/moon.yml
tests/fixtures/node/base/moon.yml
tests/fixtures/rust/cases/moon.yml
website/docs/concepts/task.mdx
website/docs/config/project.mdx
website/docs/faq.mdx
website/docs/how-it-works/languages.mdx
website/docs/setup-workspace.mdx
website/static/schemas/project.json
website/static/schemas/tasks.json
* Add script field. * Add builder tests. * Test tokens. * Fix cache. * Fix lints. * Fix tests. * Add tests. * Add tests. * Update tests.
Tried to bring this functionality into commands, but it cause a lot of issues. Keeping the separation is nice.