Skip to content

feat(curl,task): add nuxt curl, nuxt task list and nuxt task run - #1417

Merged
danielroe merged 10 commits into
mainfrom
feat/task-curl
Aug 2, 2026
Merged

feat(curl,task): add nuxt curl, nuxt task list and nuxt task run#1417
danielroe merged 10 commits into
mainfrom
feat/task-curl

Conversation

@danielroe

@danielroedanielroe commented Jul 31, 2026

Copy link
Copy Markdown
Member

🔗 Linked issue

closes#353

📚 Description

this picks up on the lockfile support added in #1414 to add two more commands that use the lock file to find the running server:

Video preview

Screen.Recording.2026-07-31.at.23.00.53.mov

nuxt curl

sends requests to your dev server without needing to know the port

nuxt curl /api/hello
nuxt curl /api/users -X POST -d '{"name":"daniel"}'
nuxt curl /api/data -H "Authorization: Bearer token"

it auto-detects JSON bodies, pretty-prints JSON responses in a TTY, and exits 22 on HTTP errors (matching real curl's --fail).

nuxt task list and nuxt task run

these commands talk to Nitro's task runner

# shows descriptions and any scheduled crons
nuxt task list
# prints the task's result and exits non-zero with the server's error when the task fails
nuxt task run db:migrate --payload.force=true
nuxt task run db:migrate --payload '{"force":true}'

Important

--payload.key=value pairs are always strings, as they are when Nitro reads them from the query string, so the JSON form is an escape hatch.

Note

nuxt task works with nitropack 2 (nuxt 4) and Nitro 3 (nuxt 5)

behind the scenes, both commands resolve the server in this order:

sourcewhen
--url flagalways wins
lock file (nuxt.lock)if a dev server is running
Nitro dev worker socketnuxt task only, when there is no lock†

† the worker fallback means nuxt task works even when the dev server was started by something other than nuxt dev (for example, programmatically from nuxt/kit).

@pkg-pr-new

pkg-pr-newBot commented Jul 31, 2026

Copy link
Copy Markdown
  • nuxt-cli-playground

    npm i https://pkg.pr.new/create-nuxt@1417
    
    npm i https://pkg.pr.new/nuxi@1417
    
    npm i https://pkg.pr.new/@nuxt/cli@1417
    

commit: 97926e0

@codspeed-hq

codspeed-hqBot commented Jul 31, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 2 untouched benchmarks


Comparing feat/task-curl (97926e0) with main (b80ed9c)

Open in CodSpeed

@danielroe
danielroe requested review from atinux and pi0July 31, 2026 16:27
@danielroe
danielroeforce-pushed the feat/task-curl branch 2 times, most recently from 16813ee to 7c46dafCompareJuly 31, 2026 21:43
@TheAlexLichter

TheAlexLichter commented Jul 31, 2026

Copy link
Copy Markdown
Member

Somewhat (un)related note as I saw nuxt.lock: Vite might get a lockfile themselves (vitejs/vite#23065 (comment))

@danielroe

Copy link
Copy Markdown
MemberAuthor

nice! it makes sense.

I am assuming vite wouldn't write a lockfile if it's being used programmatically by something like nuxt

@danielroe
danielroeforce-pushed the feat/task-curl branch 2 times, most recently from 402050d to c2bcb18CompareAugust 1, 2026 08:21
Base automatically changed from feat/dev-takeover to mainAugust 2, 2026 08:24
@coderabbitai

coderabbitaiBot commented Aug 2, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 22f23587-722c-4118-b49f-d9951119b67a

📥 Commits

Reviewing files that changed from the base of the PR and between 81bfd82 and 97926e0.

📒 Files selected for processing (15)
  • packages/nuxt-cli/src/commands/curl.ts
  • packages/nuxt-cli/src/commands/dev.ts
  • packages/nuxt-cli/src/commands/index.ts
  • packages/nuxt-cli/src/commands/task/_utils.ts
  • packages/nuxt-cli/src/commands/task/index.ts
  • packages/nuxt-cli/src/commands/task/list.ts
  • packages/nuxt-cli/src/commands/task/run.ts
  • packages/nuxt-cli/src/utils/dev-server.ts
  • packages/nuxt-cli/src/utils/json-highlight.ts
  • packages/nuxt-cli/test/e2e/commands.spec.ts
  • packages/nuxt-cli/test/unit/commands/curl.spec.ts
  • packages/nuxt-cli/test/unit/commands/task.spec.ts
  • packages/nuxt-cli/test/unit/dev-server.spec.ts
  • packages/nuxt-cli/test/unit/help.spec.ts
  • packages/nuxt-cli/test/unit/utils/json-highlight.spec.ts
🚧 Files skipped from review as they are similar to previous changes (14)
  • packages/nuxt-cli/test/e2e/commands.spec.ts
  • packages/nuxt-cli/src/utils/json-highlight.ts
  • packages/nuxt-cli/src/commands/task/run.ts
  • packages/nuxt-cli/src/commands/dev.ts
  • packages/nuxt-cli/test/unit/help.spec.ts
  • packages/nuxt-cli/test/unit/utils/json-highlight.spec.ts
  • packages/nuxt-cli/test/unit/commands/task.spec.ts
  • packages/nuxt-cli/test/unit/dev-server.spec.ts
  • packages/nuxt-cli/src/commands/task/list.ts
  • packages/nuxt-cli/src/utils/dev-server.ts
  • packages/nuxt-cli/src/commands/task/_utils.ts
  • packages/nuxt-cli/test/unit/commands/curl.spec.ts
  • packages/nuxt-cli/src/commands/index.ts
  • packages/nuxt-cli/src/commands/curl.ts

📝 Walkthrough

Walkthrough

Adds nuxt curl for absolute URLs or detected Nuxt dev servers. It supports headers, request bodies, JSON formatting, verbose output, and curl-compatible HTTP failures. Adds nuxt task list and nuxt task run for Nitro task discovery and execution over HTTP or Unix sockets. Adds shared dev-server utilities, JSON highlighting, command registration, help updates, and unit and end-to-end test coverage.

Estimated code review effort: 4 (Complex) | ~45 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Out of Scope Changes check⚠️ WarningThe nuxt curl command and related tests are not covered by linked issue #353, which only requests Nitro task integration.Split the curl feature into a separate pull request or link an issue that explicitly covers its implementation.
Docstring Coverage⚠️ WarningDocstring coverage is 44.19% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the addition of the nuxt curl and task commands.
Description check✅ PassedThe description directly explains the new curl and task commands, their behavior, and server-resolution logic.
Linked Issues check✅ PassedThe task commands satisfy issue #353 by integrating Nitro task listing and execution through a running development server.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/task-curl

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (1)
packages/nuxt-cli/src/utils/dev-server.ts (1)

99-101: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Avoid evaluating the user config twice per task command.

resolveTaskServer in packages/nuxt-cli/src/commands/task/_utils.ts (lines 79-84) calls findDevServer(cwd) and then findNitroDevWorker(cwd). Each call runs resolveLockDir, which can call getNuxtConfig when .nuxt is absent. Loading the user config twice is slow and can run config side effects twice. Resolve the lock directory once in the caller and pass it as buildDir to both functions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/nuxt-cli/src/utils/dev-server.ts` around lines 99 - 101, Update
resolveTaskServer to resolve the lock directory once and pass that resolved
directory as buildDir to both findDevServer and findNitroDevWorker. Ensure these
calls no longer independently invoke resolveLockDir or evaluate the user
configuration twice, while preserving their existing server-discovery behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/nuxt-cli/src/commands/curl.ts`:
- Around line 86-104: The curl command must reject a defined body when the
resolved method in the method/body setup is GET or HEAD before calling fetch.
Add an early validation that prints a direct usage error and exits, while
preserving the existing request and network-error handling for valid
combinations.
- Around line 136-151: The readRequestBody function assumes data is always a
string, but repeated -d arguments may provide an array and cause startsWith to
throw. Update readRequestBody to normalize repeated values before checking for
stdin or file syntax, or explicitly reject arrays with a clear error while
preserving existing single-value behavior.
In `@packages/nuxt-cli/src/commands/task/_utils.ts`:
- Around line 240-268: Update both httpRequest and socketRequest to enforce a
configurable timeout suitable for long-running tasks. Pass an AbortSignal or
equivalent timeout to fetch in httpRequest, and configure the request/socket
timeout in socketRequest so stalled connections reject rather than waiting
indefinitely; ensure timers and listeners are cleaned up after completion.
In `@packages/nuxt-cli/src/commands/task/run.ts`:
- Around line 100-112: Update assign() to reject unsafe path segments named
__proto__, constructor, or prototype before reading or assigning target[key],
including at every recursive level. Return without mutation when any segment is
unsafe, while preserving existing nested assignment behavior for other keys.
In `@packages/nuxt-cli/test/unit/commands/curl.spec.ts`:
- Around line 56-65: Make the curl test setup deterministic by explicitly
setting process.stdout.isTTY to false in the beforeEach setup, and restore its
original value during cleanup such as afterEach. Keep the existing write spies
and assertions unchanged, ensuring writeResponseBody always follows the non-TTY
output path regardless of the developer’s terminal environment.
---
Nitpick comments:
In `@packages/nuxt-cli/src/utils/dev-server.ts`:
- Around line 99-101: Update resolveTaskServer to resolve the lock directory
once and pass that resolved directory as buildDir to both findDevServer and
findNitroDevWorker. Ensure these calls no longer independently invoke
resolveLockDir or evaluate the user configuration twice, while preserving their
existing server-discovery behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3358e6b1-b03a-40d0-88fe-a77f08846250

📥 Commits

Reviewing files that changed from the base of the PR and between 9d7ce7a and 9050f12.

📒 Files selected for processing (15)
  • packages/nuxt-cli/src/commands/curl.ts
  • packages/nuxt-cli/src/commands/dev.ts
  • packages/nuxt-cli/src/commands/index.ts
  • packages/nuxt-cli/src/commands/task/_utils.ts
  • packages/nuxt-cli/src/commands/task/index.ts
  • packages/nuxt-cli/src/commands/task/list.ts
  • packages/nuxt-cli/src/commands/task/run.ts
  • packages/nuxt-cli/src/utils/dev-server.ts
  • packages/nuxt-cli/src/utils/json-highlight.ts
  • packages/nuxt-cli/test/e2e/commands.spec.ts
  • packages/nuxt-cli/test/unit/commands/curl.spec.ts
  • packages/nuxt-cli/test/unit/commands/task.spec.ts
  • packages/nuxt-cli/test/unit/dev-server.spec.ts
  • packages/nuxt-cli/test/unit/help.spec.ts
  • packages/nuxt-cli/test/unit/utils/json-highlight.spec.ts

Comment threadpackages/nuxt-cli/src/commands/curl.ts Outdated
Comment on lines +136 to +151
async function readRequestBody(data: string | undefined): Promise<string | undefined> {
if (data === undefined) {
return undefined
}
if (data === '@-') {
const chunks: Buffer[] = []
for await (const chunk of process.stdin) {
chunks.push(chunk as Buffer)
}
return Buffer.concat(chunks).toString('utf-8')
}
if (data.startsWith('@')) {
return await readFile(data.slice(1), 'utf-8')
}
return data
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd -t f 'package.json' packages/nuxt-cli --exec cat {} \;| rg -n 'citty'
rg -nP --type=ts -C3 'toArray\(' packages/nuxt-cli/src

Repository: nuxt/cli

Length of output: 1218


🏁 Script executed:

#!/bin/bashset -euo pipefail
echo"== packages/nuxt-cli/src/commands/curl.ts relevant sections =="
sed -n '1,225p' packages/nuxt-cli/src/commands/curl.ts
echoecho"== citty package files =="
fd -t f --hidden '^citty\.' packages/nuxt-cli/node_modules pkg 2>/dev/null ||true
fd -t f --hidden 'package.json' packages/nuxt-cli/node_modules 2>/dev/null | head -80
echoecho"== citty source mentions for args handling =="
rg -n --type=text "string|array|parseArgs|Repeated|command" packages/nuxt-cli/src packages/nuxt-cli 2>/dev/null | head -200 ||true

Repository: nuxt/cli

Length of output: 5848


🏁 Script executed:

#!/bin/bashset -euo pipefail
echo"== lockfile/package manager references for citty =="
git ls-files | rg '(^|/)(pnpm-lock\.yaml|package-lock\.json|yarn\.lock|bun\.lockb?)$'||trueforfin pnpm-lock.yaml package-lock.json yarn.lock bun.lock bun.lockb;doif [ -f"$f" ];thenecho"--- $f ---"
rg -n '"?citty"?|\.citty'"$f"||truefidoneechoecho"== npm metadata for citty@0.2.2 =="
npm view citty@0.2.2 dist.tarball version --json 2>/dev/null ||trueechoecho"== fetch and parse citty source from tarball =="
tmp="$(mktemp -d)"
tarball="$(npm view citty@0.2.2 dist.tarball 2>/dev/null || true)"if [ -n"${tarball:-}" ];then
curl -fsSL "$tarball" -o "$tmp/citty.tgz"
tar -xzf "$tmp/citty.tgz" -C "$tmp"echo"--- files ---"
find "$tmp/package" -maxdepth 3 -type f | sort | sed 's#^`#-` #'echo"--- src/parse.ts ---"
sed -n '1,260p'"$tmp/package/src/parse.ts"2>/dev/null ||trueecho"--- src/utils.ts ---"
sed -n '1,240p'"$tmp/package/src/utils.ts"2>/dev/null ||trueecho"--- src/index.ts ---"
sed -n '1,220p'"$tmp/package/src/index.ts"2>/dev/null ||trueecho"--- repeated arg relevant mentions ---"
rg -n "split|trim|isArray|repeat|args|positionals|value""$tmp/package/src"||truefiechoecho"== local citty if installed =="if [ -d packages/nuxt-cli/node_modules/citty ];then
rg -n '"?citty"?|node_modules/citty' package.json packages/nuxt-cli/package.json
sed -n '1,260p' packages/nuxt-cli/node_modules/citty/src/parse.ts 2>/dev/null ||trueelseecho"packages/nuxt-cli/node_modules/citty not present"fi

Repository: nuxt/cli

Length of output: 1569


🏁 Script executed:

#!/bin/bashset -euo pipefail
echo"== npm registry mirror availability =="
npm view citty dist.time --json 2>/dev/null ||echo FAILED
npm view citty@0.2.2 --json 2>/dev/null | jq -r '"dist.tarball=" + .dist.tarball'||trueechoecho"== parse citty@0.2.2 source from npm tarball using registry-compatible fetch =="
tmp="$(mktemp -d)"
tarball="$(npm view citty@0.2.2 dist.tarball 2>/dev/null || true)"if [ -n"${tarball:-}" ];thenecho"tarball=$tarball"
curl -fsSL "$tarball" -o "$tmp/citty.tgz"
tar -xzf "$tmp/citty.tgz" -C "$tmp"echo"--- package files ---"
find "$tmp/package" -maxdepth 3 -type f | sort | sed 's#^`#-` #'echo"--- dist citty source snippets ---"
rg -n "string|array|split|trim|parseArgs|defineCommand|command""$tmp/package/dist" -A3 -B3 ||trueecho"--- src citty source snippets, if any ---"
(test -d "$tmp/package/src"&& rg -n "string|array|split|trim|parseArgs|defineCommand|command""$tmp/package/src" -A3 -B3 || true)
elseecho"Unable to fetch citty@0.2.2 tarball: $tarball"fi

Repository: nuxt/cli

Length of output: 25937


Handle a repeated -d flag.

data is declared as type string, but citty can return repeated string args as an array, so data.startsWith can throw a TypeError for -d a -d b. Normalize data before body detection, or reject multiple values with a clear message.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/nuxt-cli/src/commands/curl.ts` around lines 136 - 151, The
readRequestBody function assumes data is always a string, but repeated -d
arguments may provide an array and cause startsWith to throw. Update
readRequestBody to normalize repeated values before checking for stdin or file
syntax, or explicitly reject arrays with a clear error while preserving existing
single-value behavior.

Comment on lines +240 to +268
async function httpRequest(url: string, options: RequestOptions): Promise<TaskResponse> {
const response = await fetch(url, options)
return { ok: response.ok, status: response.status, data: parseBody(await response.text()) }
}

/**
* Nitro's dev worker usually listens on a unix socket rather than a port, which
* `fetch` cannot dial.
*/
function socketRequest(socketPath: string, path: string, options: RequestOptions): Promise<TaskResponse> {
return new Promise((resolve, reject) => {
const req = http.request({ socketPath, path, method: options.method || 'GET', headers: options.headers }, (res) => {
res.setEncoding('utf-8')
let body = ''
res.on('data', (chunk: string) => {
body += chunk
})
res.on('end', () => {
const status = res.statusCode || 0
resolve({ ok: status >= 200 && status < 300, status, data: parseBody(body) })
})
})
req.on('error', reject)
if (options.body) {
req.write(options.body)
}
req.end()
})
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Add a timeout to both transports.

httpRequest calls fetch without a signal, and socketRequest sets no socket or request timeout. If the dev worker accepts the connection but never answers, the command waits forever and the user must interrupt it. A long-running task also has no upper bound, so pick a timeout that fits task execution, or make it configurable.

♻️ Proposed change for the socket transport
 function socketRequest(socketPath: string, path: string, options: RequestOptions): Promise<TaskResponse> {
return new Promise((resolve, reject) => {
const req = http.request({ socketPath, path, method: options.method || 'GET', headers: options.headers }, (res) => {
res.setEncoding('utf-8')
let body = ''
res.on('data', (chunk: string) => {
body += chunk
})
+ res.on('error', reject)
res.on('end', () => {
const status = res.statusCode || 0
resolve({ ok: status >= 200 && status < 300, status, data: parseBody(body) })
})
})
+ req.setTimeout(REQUEST_TIMEOUT_MS, () => {+ req.destroy(new Error(`Timed out after ${REQUEST_TIMEOUT_MS}ms`))+ })
req.on('error', reject)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/nuxt-cli/src/commands/task/_utils.ts` around lines 240 - 268, Update
both httpRequest and socketRequest to enforce a configurable timeout suitable
for long-running tasks. Pass an AbortSignal or equivalent timeout to fetch in
httpRequest, and configure the request/socket timeout in socketRequest so
stalled connections reject rather than waiting indefinitely; ensure timers and
listeners are cleaned up after completion.

Comment threadpackages/nuxt-cli/src/commands/task/run.ts
Comment threadpackages/nuxt-cli/test/unit/commands/curl.spec.ts

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/nuxt-cli/src/commands/curl.ts`:
- Around line 196-198: Update the @<file> handling in readRequestBody to catch
readFile failures and report a direct user-facing error through the command’s
existing error/exit flow, rather than allowing the rejection to propagate as an
unhandled stack trace. Preserve successful UTF-8 file reads and the behavior of
other request-body inputs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: cbb98d57-6264-42a0-9c5d-8d719e932b95

📥 Commits

Reviewing files that changed from the base of the PR and between 9050f12 and 8427d76.

📒 Files selected for processing (15)
  • packages/nuxt-cli/src/commands/curl.ts
  • packages/nuxt-cli/src/commands/dev.ts
  • packages/nuxt-cli/src/commands/index.ts
  • packages/nuxt-cli/src/commands/task/_utils.ts
  • packages/nuxt-cli/src/commands/task/index.ts
  • packages/nuxt-cli/src/commands/task/list.ts
  • packages/nuxt-cli/src/commands/task/run.ts
  • packages/nuxt-cli/src/utils/dev-server.ts
  • packages/nuxt-cli/src/utils/json-highlight.ts
  • packages/nuxt-cli/test/e2e/commands.spec.ts
  • packages/nuxt-cli/test/unit/commands/curl.spec.ts
  • packages/nuxt-cli/test/unit/commands/task.spec.ts
  • packages/nuxt-cli/test/unit/dev-server.spec.ts
  • packages/nuxt-cli/test/unit/help.spec.ts
  • packages/nuxt-cli/test/unit/utils/json-highlight.spec.ts
🚧 Files skipped from review as they are similar to previous changes (12)
  • packages/nuxt-cli/src/utils/json-highlight.ts
  • packages/nuxt-cli/src/commands/task/index.ts
  • packages/nuxt-cli/src/commands/task/list.ts
  • packages/nuxt-cli/test/e2e/commands.spec.ts
  • packages/nuxt-cli/test/unit/dev-server.spec.ts
  • packages/nuxt-cli/test/unit/help.spec.ts
  • packages/nuxt-cli/test/unit/commands/task.spec.ts
  • packages/nuxt-cli/src/commands/index.ts
  • packages/nuxt-cli/src/utils/dev-server.ts
  • packages/nuxt-cli/src/commands/task/run.ts
  • packages/nuxt-cli/src/commands/task/_utils.ts
  • packages/nuxt-cli/test/unit/utils/json-highlight.spec.ts

Comment threadpackages/nuxt-cli/src/commands/curl.ts
@danielroe
danielroe added this pull request to the merge queueAug 2, 2026
Merged via the queue into main with commit e80f9d0Aug 2, 2026
19 checks passed
@danielroe
danielroe deleted the feat/task-curl branch August 2, 2026 15:30
@github-actionsgithub-actionsBot mentioned this pull request Aug 2, 2026
This was referenced Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Integrate with Nitro Tasks

2 participants

@danielroe@TheAlexLichter