Skip to content

cli refactoring and merge into app codebase#68

Merged
eviltester merged 9 commits into
masterfrom
60-sort-out-clis
May 8, 2026
Merged

cli refactoring and merge into app codebase#68
eviltester merged 9 commits into
masterfrom
60-sort-out-clis

Conversation

@eviltester

@eviltester eviltester commented May 8, 2026

Copy link
Copy Markdown
Owner

closes #60
@codex

Summary by CodeRabbit

  • New Features

    • Streaming data generation API (CSV/JSONL) and CLI streaming with Node/Bun entrypoints, progress and test-mode behaviors.
  • Tests

    • Expanded unit and integration suites covering CLI parsing, streaming paths, output modes, and error handling.
  • Documentation

    • Updated CLI docs and READMEs to reflect workspace move, new options, and streaming behavior.
  • Chores

    • .gitignore updated; legacy CLI package artifacts and changelog removed; CI workflows added/adjusted.

Copilot AI review requested due to automatic review settings May 8, 2026 08:46
@eviltester eviltester linked an issue May 8, 2026 that may be closed by this pull request
@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create an environment for this repo.

@coderabbitai

coderabbitai Bot commented May 8, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Consolidates Bun and Node CLIs into apps/cli with platform adapters, yargs-based options parsing, a runCliCommand executor using a new core streaming API (csv/jsonl), refactors legacy entrypoints to delegate, and adds tests, docs, and CI/workflow updates.

Changes

Unified CLI Architecture with Streaming Support

Layer / File(s) Summary
Platform Adapters & Entry Scripts
apps/cli/src/platform/node-platform.js, apps/cli/src/platform/bun-platform.js, apps/cli/src/node-entry.js, apps/cli/src/bun-entry.js
Node and Bun adapters implement readText/writeText, createLineWriter with error/backpressure handling, and stdout/stderr. Entry scripts invoke the unified CLI and exit with its return code.
CLI Options, Package & Test Config
apps/cli/src/cli-options.js, apps/cli/package.json, apps/cli/jest.config.cjs, .gitignore
Adds parseCliOptions (yargs) returning normalized options (inputFile, outputFile, format, rowCount, testMode, showProgress, shouldStream, unsafeFakerExpressions), updates package metadata and Jest config, and ignores .tmp.
Core Streaming API
packages/core/src/index.js
Adds createAndValidateGenerator, CSV/JSONL helpers, and exported streamFromTextSpec that streams rows via an onChunk callback and can optionally collect rows.
Core Streaming Tests
packages/core/src/tests/core-api/streamFromTextSpec.test.js
Unit tests verifying CSV header streaming, JSONL chunk validity, and rejection of unsupported formats.
CLI Command Execution
apps/cli/src/run-cli.js
Adds runCliCommand to validate format, read input, choose streaming (csv/jsonl) or buffered generation, handle diagnostics/test-mode output, and write results to file or stdout with numeric exit codes.
CLI Tests
apps/cli/src/tests/*
Unit tests for options parsing and runCliCommand; integration tests for CLI behavior (help, params, output file, streaming, thresholds, unsafe expressions); run-cli unit tests mock platform behaviors.
Orchestration & Legacy Refactor
apps/cli/src/index.js, packages/cli/src/index.js, cli/src/command.ts, cli/*, README.md, packages/cli/CHANGELOG.md
Centralizes CLI exports and refactors legacy Node/Bun wrappers to delegate to the unified implementation; updates workspace docs and clears legacy changelog.
Docs & CI Workflows
apps/cli/README.md, docs-src/docs/070-interfaces-and-deployment/050-cli-node-and-bun.md, .github/workflows/*
Adds apps/cli README, updates CLI docs, removes legacy docs page, and updates/extends workflows for packing/smoke-testing apps/cli, Bun setup, and a Codex PR review action.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 From scattered scripts, one CLI blooms,
I hop from Bun to Node through rooms,
Chunk by chunk the rows I send,
Tests wag tails and docs commend,
Carrots for every successful run!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'cli refactoring and merge into app codebase' directly reflects the main objective of consolidating CLI implementations into apps/cli and creating a shared codebase for both Node and Bun, which is accurately summarized in the changes.
Linked Issues check ✅ Passed The PR successfully addresses issue #60 by creating apps/cli with shared code (cli-options.js, run-cli.js, platform abstractions) and implementing both Node and Bun entry points that use the unified codebase.
Out of Scope Changes check ✅ Passed While the PR includes some peripheral changes (documentation updates, GitHub Actions workflow adjustments, changelog cleanup), these are reasonably scoped as supporting modifications necessary for the CLI refactoring and integration into the app structure.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 60-sort-out-clis

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@coderabbitai coderabbitai Bot 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: 6

🧹 Nitpick comments (2)
apps/cli/src/tests/integration.cli-params.test.js (1)

16-18: 💤 Low value

Consider cleaning up temp files after tests.

The tempFile helper creates unique temporary files but doesn't clean them up. While the OS eventually clears /tmp, adding cleanup in an afterAll or per-test finally block would be cleaner.

🤖 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 `@apps/cli/src/tests/integration.cli-params.test.js` around lines 16 - 18, The
tempFile helper (function tempFile) creates unique files but never removes them;
modify tests to track created temp paths (e.g., push each path returned by
tempFile into an array) and add cleanup that deletes those files after tests —
either an afterAll hook that iterates the array and fs.unlink or
fs.promises.unlink each file (catch ENOENT), or ensure per-test finally blocks
remove the file(s); update imports to include fs if needed and reference
tempFile and the test suite hooks when adding the cleanup logic.
apps/cli/src/tests/integration.cli-output.test.js (1)

28-41: ⚡ Quick win

Clean up temp output files after the integration test.

The test creates a temp file but never removes it. Adding finally cleanup keeps repeated runs/CI workers tidy.

Suggested fix
 test('integration: writes generated content to file and keeps stdout progress-only in test mode', async () => {
   const inputPath = path.join(repoRoot, 'cli', 'examples', 'company-literal.txt');
   const outputPath = path.join(os.tmpdir(), `anywaydata-cli-test-${Date.now()}.csv`);
 
-  const result = runCli(['-i', inputPath, '-n', '2', '-f', 'csv', '-o', outputPath, '--testMode']);
-
-  expect(result.status).toBe(0);
-  expect(result.stderr).toBe('');
-  expect(result.stdout).toContain('> Processing Input File');
-  expect(result.stdout).toContain('> Writing output to');
-  expect(result.stdout).not.toContain('"Company","AnyWayData"');
-
-  const written = await fs.readFile(outputPath, 'utf8');
-  expect(written).toContain('"Company"');
-  expect(written).toContain('AnyWayData');
+  try {
+    const result = runCli(['-i', inputPath, '-n', '2', '-f', 'csv', '-o', outputPath, '--testMode']);
+
+    expect(result.status).toBe(0);
+    expect(result.stderr).toBe('');
+    expect(result.stdout).toContain('> Processing Input File');
+    expect(result.stdout).toContain('> Writing output to');
+    expect(result.stdout).not.toContain('"Company"');
+    expect(result.stdout).not.toContain('AnyWayData');
+
+    const written = await fs.readFile(outputPath, 'utf8');
+    expect(written).toContain('"Company"');
+    expect(written).toContain('AnyWayData');
+  } finally {
+    await fs.unlink(outputPath).catch(() => {});
+  }
 });
🤖 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 `@apps/cli/src/tests/integration.cli-output.test.js` around lines 28 - 41, The
test creates a temporary output file (outputPath) but never removes it; update
the test around the runCli call to ensure cleanup by adding a try...finally (or
wrapping assertions) where after reading the written file you unlink the temp
file (use await fs.unlink(outputPath) or fs.promises.unlink) in the finally
block so the temp CSV is removed even if assertions fail; locate the integration
test in apps/cli/src/tests/integration.cli-output.test.js around the outputPath,
runCli and fs.readFile usage and add the finally cleanup referencing outputPath.
🤖 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 `@apps/cli/package.json`:
- Around line 1-24: The CI is failing because package-lock.json is missing the
new package entry for "@anywaydata/cli-next" declared in package.json; fix it by
running npm install (or npm install --package-lock-only) at the repository root
to regenerate package-lock.json so it includes the new package, verify the lock
now contains an entry for "@anywaydata/cli-next" and then commit and push the
updated package-lock.json so npm ci in CI will succeed.

In `@apps/cli/src/platform/bun-platform.js`:
- Around line 12-22: The current createLineWriter implementation buffers the
entire file in memory (buffer in createLineWriter, writeLine and close) instead
of streaming; replace it to use Bun.file(path).writer() (or
bunRef.file(path).writer()) to obtain a streaming writer in createLineWriter,
call writer.write for each writeLine (appending "\n"), and call await
writer.close() in close(); also add error handling on write and close to surface
and log errors (mirror Node's createWriteStream error handling), ensure
writeLine returns/awaits the writer.write promise so backpressure/errors
propagate.

In `@apps/cli/src/tests/integration.cli-output.test.js`:
- Line 36: The current assertion only forbids one exact CSV string; update the
assertion that references result.stdout (the expect(result.stdout) call) to
reject any CSV-like output instead of a single combined string—replace the exact
not-toContain check with a broader check (e.g., use a negative regex match via
not.toMatch or test for absence of the CSV header token like "Company" or any
quoted comma-separated cells) so leaked CSV fragments (headers or quoted fields)
will fail the test.
- Around line 6-7: Replace the process.cwd() relative resolution with a
deterministic __dirname-based path: compute repoRoot from the test file's
directory (use path.resolve(__dirname, '../../../../') from the tests folder) so
repoRoot is independent of the current working directory, then keep building
cliEntry with path.join(repoRoot, 'apps','cli','src','node-entry.js'); update
the repoRoot declaration (and any dependent references) accordingly to ensure
tests resolve the CLI entry reliably.

In `@packages/core/src/index.js`:
- Around line 335-345: The code is collecting every generated row into the rows
array (rows, generator.generateRow(), safeRowCount) which defeats streaming;
modify the logic so that rows are only accumulated when explicitly requested
(e.g., add options.collectRows boolean or options.sampleRows number) — when
outputFormat === 'csv' or other streaming modes, avoid pushing each row into
rows unless options.collectRows is true (or instead collect only a limited
sample like first/last N when options.sampleRows is provided); update the
generator loop to conditionally push into rows based on that flag/sample and
ensure the returned object omits or returns an empty/undefined rows field when
not collecting.
- Around line 343-351: Wrap the entire streaming block that calls
streamFromTextSpec(...) and uses writer.writeLine / writer.close in a try/catch
(and a finally) so runtime I/O errors are caught and reported instead of
crashing: surround the await streamFromTextSpec(...) and subsequent streaming
loop (including calls to writer.writeLine via onChunk) with try { ... } catch
(err) { console.error("Failed to stream output:", err); process.exit(1); } and
place writer.close() in a finally (or catch its own errors) to ensure cleanup
and report any close errors; reference the streamFromTextSpec call, the
writer.writeLine usages indirectly invoked by onChunk/rowToCsv/rowToJsonLine,
and writer.close so you locate and protect the whole streaming sequence.

---

Nitpick comments:
In `@apps/cli/src/tests/integration.cli-output.test.js`:
- Around line 28-41: The test creates a temporary output file (outputPath) but
never removes it; update the test around the runCli call to ensure cleanup by
adding a try...finally (or wrapping assertions) where after reading the written
file you unlink the temp file (use await fs.unlink(outputPath) or
fs.promises.unlink) in the finally block so the temp CSV is removed even if
assertions fail; locate the integration test in
apps/cli/src/tests/integration.cli-output.test.js around the outputPath, runCli
and fs.readFile usage and add the finally cleanup referencing outputPath.

In `@apps/cli/src/tests/integration.cli-params.test.js`:
- Around line 16-18: The tempFile helper (function tempFile) creates unique
files but never removes them; modify tests to track created temp paths (e.g.,
push each path returned by tempFile into an array) and add cleanup that deletes
those files after tests — either an afterAll hook that iterates the array and
fs.unlink or fs.promises.unlink each file (catch ENOENT), or ensure per-test
finally blocks remove the file(s); update imports to include fs if needed and
reference tempFile and the test suite hooks when adding the cleanup logic.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 622731c5-0cfb-4750-b9cd-a666d822c51a

📥 Commits

Reviewing files that changed from the base of the PR and between ec39cc2 and e97b386.

📒 Files selected for processing (18)
  • .gitignore
  • apps/cli/jest.config.cjs
  • apps/cli/package.json
  • apps/cli/src/bun-entry.js
  • apps/cli/src/cli-options.js
  • apps/cli/src/index.js
  • apps/cli/src/node-entry.js
  • apps/cli/src/platform/bun-platform.js
  • apps/cli/src/platform/node-platform.js
  • apps/cli/src/run-cli.js
  • apps/cli/src/tests/cli-options.test.js
  • apps/cli/src/tests/integration.cli-output.test.js
  • apps/cli/src/tests/integration.cli-params.test.js
  • apps/cli/src/tests/run-cli.test.js
  • cli/src/command.ts
  • packages/cli/src/index.js
  • packages/core/src/index.js
  • packages/core/src/tests/core-api/streamFromTextSpec.test.js

Comment thread apps/cli/package.json
Comment thread apps/cli/src/platform/bun-platform.js
Comment thread apps/cli/src/tests/integration.cli-output.test.js Outdated
Comment thread apps/cli/src/tests/integration.cli-output.test.js Outdated
Comment thread packages/core/src/index.js Outdated
Comment thread packages/core/src/index.js
@eviltester

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 38b76ddfa9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/cli/src/index.js Outdated
Comment thread packages/core/src/index.js Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@coderabbitai coderabbitai Bot 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: 2

🤖 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 @.github/workflows/codex-pr-review.yml:
- Around line 23-27: The workflow uses mutable action tags — specifically the
`uses: actions/checkout@v4` and `uses: openai/codex-action@v1` entries — which
must be pinned to immutable commit SHAs; update each `uses:` entry to replace
the tag (e.g., `@v4`, `@v1`) with the corresponding 40-character commit SHA for
that action, verifying the correct repository and commit on GitHub, and ensure
no other `uses:` lines remain non-SHA pinned (run the provided grep/python check
if needed).
- Around line 19-29: The workflow step "Run Codex PR review" (uses:
openai/codex-action@v1, input openai-api-key) lacks a fork guard so the step
fails when secrets.OPENAI_API_KEY is unavailable for forked PRs; update the
job/step condition to skip runs for forked repositories (e.g., require
github.event.pull_request.head.repo.fork == false) or otherwise check that the
secret is present before invoking the action so the Codex step only runs on
non-fork PRs.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b47ac22e-8095-46e7-b969-00f5cacb234b

📥 Commits

Reviewing files that changed from the base of the PR and between e97b386 and f8aa1b6.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (11)
  • .github/workflows/codex-pr-review.yml
  • README.md
  • apps/cli/package.json
  • apps/cli/src/platform/bun-platform.js
  • apps/cli/src/run-cli.js
  • apps/cli/src/tests/integration.cli-output.test.js
  • apps/cli/src/tests/integration.cli-params.test.js
  • apps/cli/src/tests/run-cli.test.js
  • packages/cli/CHANGELOG.md
  • packages/cli/src/index.js
  • packages/core/src/index.js
💤 Files with no reviewable changes (2)
  • packages/cli/CHANGELOG.md
  • packages/cli/src/index.js
✅ Files skipped from review due to trivial changes (2)
  • README.md
  • apps/cli/src/run-cli.js
🚧 Files skipped from review as they are similar to previous changes (5)
  • apps/cli/src/platform/bun-platform.js
  • apps/cli/src/tests/run-cli.test.js
  • apps/cli/src/tests/integration.cli-output.test.js
  • apps/cli/src/tests/integration.cli-params.test.js
  • packages/core/src/index.js

Comment thread .github/workflows/codex-pr-review.yml Outdated
Comment thread .github/workflows/codex-pr-review.yml

@coderabbitai coderabbitai Bot 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 `@docs-src/docs/070-interfaces-and-deployment/050-cli-node-and-bun.md`:
- Line 45: Update the docs text for the `--show-progress` CLI option to clarify
the exact command-line syntax users should use; in the `--show-progress`
description replace the current "(true or false)" with a brief example showing
the accepted form(s) (e.g., `--show-progress true` and/or
`--show-progress=true`) or explicitly state which one is supported by the CLI,
and add the example into the examples section if present so users see usage in
context.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e231143c-c67a-4d05-a890-c883f766fd49

📥 Commits

Reviewing files that changed from the base of the PR and between f8aa1b6 and 4ef63d8.

⛔ Files ignored due to path filters (1)
  • cli/bun.lock is excluded by !**/*.lock
📒 Files selected for processing (15)
  • README.md
  • apps/cli/examples/company-literal.txt
  • apps/cli/examples/company.txt
  • apps/cli/examples/error-extra-line.txt
  • apps/cli/examples/faker-and-regex.txt
  • apps/cli/examples/regex-field.txt
  • apps/cli/examples/test.txt
  • cli/.gitignore
  • cli/index.ts
  • cli/package.json
  • cli/readme.md
  • cli/src/command.ts
  • cli/src/outputData.js
  • cli/tsconfig.json
  • docs-src/docs/070-interfaces-and-deployment/050-cli-node-and-bun.md
💤 Files with no reviewable changes (7)
  • cli/tsconfig.json
  • cli/readme.md
  • cli/.gitignore
  • cli/index.ts
  • cli/src/outputData.js
  • cli/package.json
  • cli/src/command.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • README.md

Comment thread docs-src/docs/070-interfaces-and-deployment/050-cli-node-and-bun.md Outdated

@coderabbitai coderabbitai Bot 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 @.github/workflows/codex-pr-review.yml:
- Around line 11-17: The concurrency group currently references
github.event.pull_request.number and the codex-review job-level if uses
github.event.pull_request and secrets (which are invalid for workflow_dispatch
and job ifs); update the concurrency group to use a run-scoped value like
github.run_id (replace group: codex-pr-review-${{
github.event.pull_request.number }} with group: codex-pr-review-${{
github.run_id }}) and remove the job-level if on the codex-review job (delete
the if: github.event.pull_request.draft == false && secrets.OPENAI_API_KEY != ''
line) so the workflow can run for workflow_dispatch and rely on the existing
step-level secrets.OPENAI_API_KEY check instead.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6f81cd93-5bc6-4885-bbea-4ed25dde9536

📥 Commits

Reviewing files that changed from the base of the PR and between 8f44658 and b2e67eb.

📒 Files selected for processing (1)
  • .github/workflows/codex-pr-review.yml

Comment thread .github/workflows/codex-pr-review.yml Outdated
@eviltester eviltester merged commit d229070 into master May 8, 2026
5 checks passed
@eviltester eviltester deleted the 60-sort-out-clis branch May 8, 2026 15:35
Sign up for free to 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.

sort out clis

2 participants