Skip to content

feat(cli): splash banner, agent grid, provider picker, smart defaults#403

Merged
rohitg00 merged 1 commit into
mainfrom
feat/cli-onboarding
May 15, 2026
Merged

feat(cli): splash banner, agent grid, provider picker, smart defaults#403
rohitg00 merged 1 commit into
mainfrom
feat/cli-onboarding

Conversation

@rohitg00
Copy link
Copy Markdown
Owner

@rohitg00 rohitg00 commented May 15, 2026

What

Replaces the 25-line [agentmemory] X log spam on first invocation with a SkillKit-grade onboarding. The user goes from a wall of unstructured startup chatter to a three-step interactive flow plus a single-line ready hint.

New modules

src/cli/splash.ts

Terminal-width-aware ASCII banner, three render tiers:

  • >= 120 cols — full block-art logo + tagline
  • 80–119 cols — compact monospace title + tagline
  • < 80 cols — single-line agentmemory v0.9.14

Brand accent is #FF6B35 rendered through ANSI 256-colour (38;5;208), honours NO_COLOR, no new deps.

src/cli/preferences.ts

JSON-backed prefs at ~/.agentmemory/preferences.json:

{ schemaVersion: 1, lastAgent, lastAgents, lastProvider,
  skipSplash, skipNpxHint, firstRunAt }
  • Atomic write via tmp + fsync + rename so a Ctrl+C never corrupts the file
  • readPrefs() returns defaults on missing / corrupt / wrong-schema files
  • isFirstRun() returns true when firstRunAt === null
  • resetPrefs() for the new --reset flag
  • 7 unit tests covering defaults, merge semantics, atomic write, schema clamping, corrupt-file recovery, and --reset

src/cli/onboarding.ts

First-run interactive flow using @clack/prompts:

  1. multiselect over native-plugin agents (claude-code · codex · openhuman · openclaw · hermes · pi · cursor · gemini-cli) + MCP-only agents (opencode · cline · goose · kilo · aider · claude-desktop · windsurf · roo), with glyphs (⟁ ◫ ◎ ✦ ⬡) and fallback
  2. select over providers (anthropic · openai · gemini · openrouter · minimax · skip — BM25-only mode)
  3. Seeds ~/.agentmemory/.env from the bundled template (idempotent via COPYFILE_EXCL)
  4. Writes prefs + prints ready note

Re-runs only on --reset.

Log demotion

src/logger.ts gets bootLog() and setBootVerbose(). The 18 startup console.log calls in src/index.ts are rewritten to route through this shim. Default behaviour: buffered + dropped. With --verbose (or AGENTMEMORY_VERBOSE=1): printed verbatim. Warnings, errors, and shutdown logs stay loud.

CLI surgery

src/cli.ts:

  • Splash before clack intro
  • runOnboarding() when isFirstRun() or --reset
  • setBootVerbose(IS_VERBOSE) propagates verbosity to the worker
  • waitForAgentmemoryReady() polls /agentmemory/livez after the worker imports; prints a single-line ready hint:
    Memory ready on :3111 · viewer on http://localhost:3113 · try: agentmemory demo
    
  • New --reset flag wipes prefs and re-runs onboarding
  • Help text updated

First-run output (target ~10 lines)

  agentmemory                                                  (full ASCII banner at >=120 cols)
  v0.9.14 · Persistent memory for AI coding agents

┌  first-run setup
│
│  Welcome to agentmemory.
│  Persistent memory for your AI coding agents. ...
│
◇  Which agents will use agentmemory? (space to toggle, enter to confirm)
│  ⟁ Claude Code, ◫ Cursor
│
◇  Which LLM provider should agentmemory use for compress/consolidate?
│  Anthropic — claude
│
◇  ready
│  ✓ Saved preferences to ~/.agentmemory/preferences.json
│  ✓ Wrote ~/.agentmemory/.env (edit to add your API key)
│  Uncomment ANTHROPIC_API_KEY= in that file to enable anthropic.
│
◇  Starting iii-engine: /Users/.../iii
◇  iii-engine is ready

Memory ready on :3111 · viewer on http://localhost:3113 · try: agentmemory demo

Subsequent runs:

◇  iii-engine is ready

Memory ready on :3111 · viewer on http://localhost:3113 · try: agentmemory demo

Acceptance check

  • npm run build passes
  • npm test — 900/910 passing; the 10 failures are pre-existing in test/mcp-standalone.test.ts (parity with main). 7 new passes from test/preferences.test.ts.
  • No new heavy deps. @clack/prompts was already in.
  • --verbose restores full boot log
  • --reset wipes prefs and re-runs onboarding
  • Version unchanged, CHANGELOG untouched
  • Conventional commit

Summary by CodeRabbit

  • New Features

    • Interactive first-run onboarding to select agents/providers and seed credentials.
    • Terminal-aware splash banner that adapts to terminal width.
    • Persistent CLI preferences to remember onboarding choices and skip the splash.
    • Improved verbosity control via flag or environment variable.
    • Startup readiness checks that wait for the REST endpoint and print a “ready” hint.
    • Buffered startup logging with togglable verbose output.
  • Tests

    • Added tests covering preference read/write, schema handling, first-run logic, and reset.

Review Change Stack

@vercel
Copy link
Copy Markdown

vercel Bot commented May 15, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agentmemory Ready Ready Preview, Comment May 15, 2026 3:24pm

Request Review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 15, 2026

📝 Walkthrough

Walkthrough

The PR adds a first-run onboarding flow, a JSON-backed CLI preferences store, a terminal-aware splash, a buffered/verbose boot logger, readiness polling and plain-stdout readiness hints in the CLI, and routes core startup logs through the boot logger.

Changes

First-run onboarding and startup improvements

Layer / File(s) Summary
Boot logging infrastructure
src/logger.ts
Logger adds buffered boot-time output controlled by AGENTMEMORY_VERBOSE or setBootVerbose(), with bootLog buffering when quiet and bootWarn always emitting to stderr.
Preferences persistence system
src/cli/preferences.ts, test/preferences.test.ts
New Prefs schema and JSON store at ~/.agentmemory/preferences.json with atomic writes, schemaVersion forced to 1, defensive reads, reset and isFirstRun helpers, and tests covering defaults, persistence, merge, corruption fallback, and reset.
Interactive onboarding flow
src/cli/onboarding.ts
First-run agent/provider multi-select prompts, .env seeding (from .env.example or minimal skeleton), writes onboarding prefs via runOnboarding() and returns OnboardingResult.
Terminal-aware splash screen
src/cli/splash.ts
Responsive CLI banner renderer honoring TTY/NO_COLOR, with accent/dim/bold helpers and three banner sizes (full/compact/minimal), exported as renderSplash(version).
CLI startup with preferences and readiness
src/cli.ts
CLI derives verbosity from --verbose or AGENTMEMORY_VERBOSE and calls setBootVerbose(), supports --reset, polls /agentmemory/livez with waitForAgentmemoryReady(), prints readiness hints via printReadyHint(), and persists skipSplash: true after successful engine start.
Core startup logging refactor
src/index.ts
Replaces many console.log startup and scheduler messages with bootLog() calls for consistent boot output handling.

Sequence Diagram(s)

sequenceDiagram
  participant CLI as CLI main
  participant Prefs as Preferences
  participant Board as Onboarding
  participant Env as .env seeding
  participant Engine as Engine / agentmemory
  participant REST as /agentmemory/livez
  CLI->>Prefs: readPrefs()
  Prefs-->>CLI: current or defaults
  alt First run
    CLI->>Board: runOnboarding()
    Board->>Board: prompt agents & provider
    Board->>Env: seedEnvFile(provider)
    Env->>Env: copy .env.example or write skeleton
    Board->>Prefs: writePrefs(agents, provider, firstRunAt)
    Board-->>CLI: OnboardingResult
  end
  CLI->>REST: waitForAgentmemoryReady() or startEngine()
  REST-->>CLI: ready
  CLI->>CLI: printReadyHint() to stdout
  CLI->>Prefs: writePrefs(skipSplash: true)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • rohitg00/agentmemory#383: Related onboarding/init behavior that copies a bundled .env.example into the user env, similar .env seeding logic.
  • rohitg00/agentmemory#128: Overlaps on src/cli.ts --verbose/-v handling and engine readiness logic.
  • rohitg00/agentmemory#405: Adds/uses CLI preferences keys that interact with the new JSON-backed preferences (e.g., npx/hint flags).

Poem

🐰 I seeded prefs beneath the moonlit tree,

I painted splashes wide for all to see,
I buffered whispers till they should be loud,
Ready hints I print to welcome the crowd,
Hop on — the first run blooms, so proud.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.45% 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 comprehensively reflects the main changes: new splash banner, agent selection grid, provider picker, and smart defaults for onboarding.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/cli-onboarding

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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 and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/logger.ts (1)

63-72: ⚡ Quick win

Trim the new boot-log WHAT-comment block.

Please replace this behavior narration with clearer symbol naming (or a short WHY note only) to align with repo standards.

As per coding guidelines, "Avoid code comments explaining WHAT — use clear naming instead".

🤖 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 `@src/logger.ts` around lines 63 - 72, The comment block describing the "boot
log" behavior is overly verbose and explains WHAT the code does; instead,
replace it with a concise WHY note or clearer symbol naming: shorten the block
above the bootLog variable to a one-line summary like "bootLog: capture one-time
startup status lines (quiet vs verbose modes)" and/or add a brief WHY sentence
explaining why buffering is needed, then remove the long narration referencing
register-* functions; update references to bootLog and any register-* usages if
needed to ensure names are self-explanatory (e.g., keep symbol bootLog and
mention verbose flag behavior only briefly).
src/index.ts (1)

456-459: ⚡ Quick win

Remove the new WHAT-oriented inline comment block.

This block explains behavior already expressed by bootLog usage and can be reduced to naming/structure instead.

As per coding guidelines, "Avoid code comments explaining WHAT — use clear naming instead".

🤖 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 `@src/index.ts` around lines 456 - 459, Remove the WHAT-oriented inline comment
block that explains behavior already conveyed by bootLog and the surrounding
code; delete the multi-line comment about "Ready / Endpoints lines..." and, if
needed for clarity, replace it with a short, structural note or better-named
symbol (e.g., rename variables/functions or add a compact comment referencing
bootLog) so the code communicates intent through naming rather than an
explanatory block; ensure references to bootLog and the worker ready state
remain clear without the verbose comment.
🤖 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 `@src/index.ts`:
- Around line 233-251: The startup warnings currently call bootLog which can be
muted; update the two warning branches so that when isAutoCompressEnabled() is
true you call bootWarn instead of bootLog, and similarly when
isContextInjectionEnabled() is true call bootWarn instead of bootLog; keep the
same warning message text and leave the else branches using bootLog
unchanged—locate these calls around the isAutoCompressEnabled and
isContextInjectionEnabled checks and swap bootLog -> bootWarn for the
true/warning cases.

---

Nitpick comments:
In `@src/index.ts`:
- Around line 456-459: Remove the WHAT-oriented inline comment block that
explains behavior already conveyed by bootLog and the surrounding code; delete
the multi-line comment about "Ready / Endpoints lines..." and, if needed for
clarity, replace it with a short, structural note or better-named symbol (e.g.,
rename variables/functions or add a compact comment referencing bootLog) so the
code communicates intent through naming rather than an explanatory block; ensure
references to bootLog and the worker ready state remain clear without the
verbose comment.

In `@src/logger.ts`:
- Around line 63-72: The comment block describing the "boot log" behavior is
overly verbose and explains WHAT the code does; instead, replace it with a
concise WHY note or clearer symbol naming: shorten the block above the bootLog
variable to a one-line summary like "bootLog: capture one-time startup status
lines (quiet vs verbose modes)" and/or add a brief WHY sentence explaining why
buffering is needed, then remove the long narration referencing register-*
functions; update references to bootLog and any register-* usages if needed to
ensure names are self-explanatory (e.g., keep symbol bootLog and mention verbose
flag behavior only briefly).
🪄 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

Run ID: 4c517d9d-cd85-4cb1-ad5d-0cf6b31dcfe3

📥 Commits

Reviewing files that changed from the base of the PR and between 372c6a6 and e14e73c.

📒 Files selected for processing (7)
  • src/cli.ts
  • src/cli/onboarding.ts
  • src/cli/preferences.ts
  • src/cli/splash.ts
  • src/index.ts
  • src/logger.ts
  • test/preferences.test.ts

Comment thread src/index.ts
Comment on lines 233 to 251
if (isAutoCompressEnabled()) {
console.log(
`[agentmemory] WARNING: AGENTMEMORY_AUTO_COMPRESS=true — every PostToolUse observation will be sent to your LLM provider for compression. This spends API tokens proportional to your session tool-use frequency (see #138). Set AGENTMEMORY_AUTO_COMPRESS=false to disable.`,
bootLog(
`WARNING: AGENTMEMORY_AUTO_COMPRESS=true — every PostToolUse observation will be sent to your LLM provider for compression. This spends API tokens proportional to your session tool-use frequency (see #138). Set AGENTMEMORY_AUTO_COMPRESS=false to disable.`,
);
} else {
console.log(
`[agentmemory] Auto-compress: OFF (default, #138) — observations indexed via zero-LLM synthetic compression. Set AGENTMEMORY_AUTO_COMPRESS=true to opt-in to LLM-powered summaries (uses your API key).`,
bootLog(
`Auto-compress: OFF (default, #138) — observations indexed via zero-LLM synthetic compression. Set AGENTMEMORY_AUTO_COMPRESS=true to opt-in to LLM-powered summaries (uses your API key).`,
);
}

if (isContextInjectionEnabled()) {
console.log(
`[agentmemory] WARNING: AGENTMEMORY_INJECT_CONTEXT=true — the PreToolUse and SessionStart hooks will inject up to ~4000 chars of memory context into every tool turn. On Claude Pro this burns session tokens proportional to your tool-call frequency (see #143). Set AGENTMEMORY_INJECT_CONTEXT=false to disable.`,
bootLog(
`WARNING: AGENTMEMORY_INJECT_CONTEXT=true — the PreToolUse and SessionStart hooks will inject up to ~4000 chars of memory context into every tool turn. On Claude Pro this burns session tokens proportional to your tool-call frequency (see #143). Set AGENTMEMORY_INJECT_CONTEXT=false to disable.`,
);
} else {
console.log(
`[agentmemory] Context injection: OFF (default, #143) — hooks capture observations but do not inject context into Claude Code's conversation. Set AGENTMEMORY_INJECT_CONTEXT=true to opt-in (warning: expect your Claude Pro allocation to drain faster).`,
bootLog(
`Context injection: OFF (default, #143) — hooks capture observations but do not inject context into Claude Code's conversation. Set AGENTMEMORY_INJECT_CONTEXT=true to opt-in (warning: expect your Claude Pro allocation to drain faster).`,
);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Route startup warnings through bootWarn, not bootLog.

bootLog is quiet-buffered by default, so these warning paths can be suppressed. Use bootWarn for always-visible warnings.

Suggested diff
-import { bootLog } from "./logger.js";
+import { bootLog, bootWarn } from "./logger.js";
@@
-    bootLog(
+    bootWarn(
       `WARNING: AGENTMEMORY_AUTO_COMPRESS=true — every PostToolUse observation will be sent to your LLM provider for compression. This spends API tokens proportional to your session tool-use frequency (see `#138`). Set AGENTMEMORY_AUTO_COMPRESS=false to disable.`,
     );
@@
-    bootLog(
+    bootWarn(
       `WARNING: AGENTMEMORY_INJECT_CONTEXT=true — the PreToolUse and SessionStart hooks will inject up to ~4000 chars of memory context into every tool turn. On Claude Pro this burns session tokens proportional to your tool-call frequency (see `#143`). Set AGENTMEMORY_INJECT_CONTEXT=false to disable.`,
     );
🤖 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 `@src/index.ts` around lines 233 - 251, The startup warnings currently call
bootLog which can be muted; update the two warning branches so that when
isAutoCompressEnabled() is true you call bootWarn instead of bootLog, and
similarly when isContextInjectionEnabled() is true call bootWarn instead of
bootLog; keep the same warning message text and leave the else branches using
bootLog unchanged—locate these calls around the isAutoCompressEnabled and
isContextInjectionEnabled checks and swap bootLog -> bootWarn for the
true/warning cases.

Replaces the 25-line `[agentmemory] X` log spam on first invocation
with a SkillKit-grade onboarding flow:

* `src/cli/splash.ts` — terminal-width-aware ASCII banner with three
  tiers (>=120 / 80-119 / <80 cols), brand-accent orange via ANSI
  256-colour, NO_COLOR-aware, no new deps.
* `src/cli/preferences.ts` — JSON-backed prefs at
  `~/.agentmemory/preferences.json`, atomic write via tmp+fsync+rename,
  graceful defaults on corrupt/missing file, `isFirstRun()` /
  `resetPrefs()` helpers. 7 unit tests added.
* `src/cli/onboarding.ts` — first-run multi-select for agents (native
  plugin + MCP-server rows from the README), single-select for
  provider (anthropic / openai / gemini / openrouter / minimax / skip
  -> BM25-only), seeds `~/.agentmemory/.env`, prints the next-step
  hint.
* `src/logger.ts` — adds `bootLog` / `setBootVerbose`. The 18 startup
  `console.log` calls in `src/index.ts` route through this shim;
  default is muted, `--verbose` (or AGENTMEMORY_VERBOSE=1) restores
  the old chatty output. Warnings, errors, and shutdown logs stay
  loud.
* `src/cli.ts` — splash before clack intro, run onboarding when
  `isFirstRun()` or `--reset`, propagate verbosity to the worker
  logger, wait for `/agentmemory/livez` after `import("./index.js")`
  and print a single-line ready hint. Adds `--reset` flag.

First-run output drops from 30+ lines to ~10. Subsequent runs are a
single ready line. `--verbose` restores the old verbose surface for
debugging. Build passes; the 10 pre-existing failures in
`test/mcp-standalone.test.ts` are unchanged (903 -> 910, all 7 new
passes are `test/preferences.test.ts`).
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/logger.ts (1)

74-76: ⚡ Quick win

Read environment variable once.

The environment variable process.env["AGENTMEMORY_VERBOSE"] is accessed twice in the same expression.

♻️ Refactor to read once
-let bootVerbose =
-  process.env["AGENTMEMORY_VERBOSE"] === "1" ||
-  process.env["AGENTMEMORY_VERBOSE"] === "true";
+const verboseEnv = process.env["AGENTMEMORY_VERBOSE"];
+let bootVerbose = verboseEnv === "1" || verboseEnv === "true";
🤖 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 `@src/logger.ts` around lines 74 - 76, The bootVerbose assignment reads
process.env["AGENTMEMORY_VERBOSE"] twice; instead read the env var once into a
local const (e.g., const envVerbose = process.env["AGENTMEMORY_VERBOSE"]) and
then set bootVerbose = envVerbose === "1" || envVerbose === "true"; update the
variable declaration where bootVerbose is defined to use this single-read
pattern (refer to the bootVerbose variable in logger.ts).
🤖 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.

Nitpick comments:
In `@src/logger.ts`:
- Around line 74-76: The bootVerbose assignment reads
process.env["AGENTMEMORY_VERBOSE"] twice; instead read the env var once into a
local const (e.g., const envVerbose = process.env["AGENTMEMORY_VERBOSE"]) and
then set bootVerbose = envVerbose === "1" || envVerbose === "true"; update the
variable declaration where bootVerbose is defined to use this single-read
pattern (refer to the bootVerbose variable in logger.ts).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ab91ddcd-d62c-4e65-b066-b21aa9ad9c17

📥 Commits

Reviewing files that changed from the base of the PR and between e14e73c and d03c088.

📒 Files selected for processing (7)
  • src/cli.ts
  • src/cli/onboarding.ts
  • src/cli/preferences.ts
  • src/cli/splash.ts
  • src/index.ts
  • src/logger.ts
  • test/preferences.test.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • test/preferences.test.ts
  • src/cli/preferences.ts
  • src/cli/splash.ts
  • src/cli.ts
  • src/index.ts
  • src/cli/onboarding.ts

@rohitg00 rohitg00 merged commit 659d0c3 into main May 15, 2026
5 checks passed
rohitg00 added a commit that referenced this pull request May 15, 2026
… remove, silent killers) (#407)

Patch bump per the established rule: all changes additive, no breaks
to MemoryProvider trait or exported types or default behaviour. New
top-level subcommands (connect, remove, --reset, --force) are opt-in.

PRs included since v0.9.14:
  #405 — silent killers: viewer port auto-bump, engine version-match
         warning, stop --force, adopt-on-attach, npx PATH hint
  #402 — agentmemory connect — automate native-plugin install for 8
         agents (claude-code, codex, cursor, gemini-cli, openclaw
         end-to-end; hermes/pi/openhuman stubbed)
  #406 — interactive doctor v2 + agentmemory remove (destruction plan
         + two-confirmation flow)
  #403 — splash banner + agent grid + provider picker + smart-defaults
         preferences + bootLog shim (30+ lines of log spam → 10)

Files bumped (9):
  package.json, packages/mcp/package.json, plugin/.claude-plugin/plugin.json,
  plugin/.codex-plugin/plugin.json, src/version.ts, src/types.ts,
  src/functions/export-import.ts, test/export-import.test.ts,
  CHANGELOG.md
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.

1 participant