Skip to content

feat(cli): add 'appkit add' and 'appkit registry' commands - #462

Draft
MarioCadenas wants to merge 13 commits into
mainfrom
feat/registry-cli
Draft

feat(cli): add 'appkit add' and 'appkit registry' commands#462
MarioCadenas wants to merge 13 commits into
mainfrom
feat/registry-cli

Conversation

@MarioCadenas

@MarioCadenas MarioCadenas commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator

Add a shadcn-namespaced component registry workflow to the AppKit CLI:

  • appkit add <item...> ensures the @databricks-appkit registry namespace in the consumer's components.json, then delegates to shadcn add @databricks-appkit/<name>. It auto-detects UI components vs server plugins and routes each to the right place (plugins also run plugin sync and get registered in createApp).
  • appkit registry list enumerates items from the registry index, showing each item's type and a marker for verified items.
  • appkit registry search filters items by name / description / type / keywords.

Registry components import primitives from @databricks/appkit-ui (npm peer), so they stay in sync with the installed AppKit version and design tokens.

Paired change

The registry itself is renamed to @databricks-appkit in databricks/appkit-registry#1; this PR's REGISTRY_NAMESPACE matches it.

This pull request and its description were written by Isaac.

@github-actions

Copy link
Copy Markdown
Contributor

🔬  Run evals on this PR  ·  Go to Evals Monitor →

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle size report

Compared against bundle-size-baseline.json (main).

@databricks/appkit

npm tarball (packed): 828 KB (+7 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 855 KB 298 KB
Type declarations 314 KB 109 KB (+9 B)
Source maps 1.7 MB 557 KB
Other 11 KB 3.7 KB
Total 2.8 MB 967 KB (+9 B)
Per-entry composition (own code — deps external (as shipped))
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
. 87 KB 2.5 KB 90 KB external 285 KB
./beta 48 KB 459 B 48 KB external 140 KB
./type-generator 20 KB 0 B 20 KB external 57 KB

Chunks:

Entry Chunk Load Size (gz)
. index.js initial 83 KB
. utils.js initial 4.0 KB
. remote-tunnel-manager.js lazy 2.5 KB
./beta beta.js initial 32 KB
./beta stream-manager.js initial 5.8 KB
./beta wide-event-emitter.js initial 3.2 KB
./beta databricks.js initial 3.0 KB
./beta configuration.js initial 2.1 KB
./beta service-context.js initial 1.3 KB
./beta client.js initial 431 B
./beta client-options.js initial 219 B
./beta supervisor-api.js lazy 194 B
./beta databricks.js lazy 142 B
./beta index.js lazy 123 B
./type-generator index.js initial 20 KB

@databricks/appkit-ui

npm tarball (packed): 309 KB — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 362 KB 121 KB
Type declarations 209 KB 76 KB
Source maps 693 KB 227 KB
CSS 16 KB 3.3 KB
Total 1.3 MB 427 KB
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
./js 4.3 KB 49 KB 54 KB 208 KB 12 KB
./js/beta 20 B 0 B 20 B 0 B 0 B
./react 429 KB 49 KB 478 KB 1.3 MB 168 KB
./react/beta 1.0 KB 0 B 1.0 KB 0 B 1.9 KB

Chunks:

Entry Chunk Load Size (gz)
./js index.js initial 4.2 KB
./js chunk initial 120 B
./js apache-arrow lazy 49 KB
./js/beta beta.js initial 20 B
./react index.js initial 427 KB
./react tslib initial 2.1 KB
./react apache-arrow lazy 49 KB
./react/beta beta.js initial 1.0 KB

@github-actions

Copy link
Copy Markdown
Contributor

This pull request has had no activity for 23 days and has been marked as stale. It will be closed in 7 days if there is no further activity. Add a comment, push a commit, or apply the no-stale label to keep it open.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🤖 AppKit PR bot

🔬 Run evals

Start an eval for this PR from the evals-monitor app: Go to Evals Monitor →

📦 Try this PR's app template

Scaffolds a new app from this PR's SDK build. Run it in any folder (requires the GitHub CLI — gh auth login — and the Databricks CLI):

gh run download 31104666173 -R databricks/appkit -n appkit-template-0.55.0-pr.07743ad-feat-registry-cli-462 -D appkit-pr-462 \
  && unzip -o "appkit-pr-462/appkit-template-0.55.0-pr.07743ad-feat-registry-cli-462.zip" -d "appkit-pr-462" \
  && databricks apps init --template "appkit-pr-462"

The template pins @databricks/appkit and @databricks/appkit-ui to tarballs built from this branch, so the scaffolded app runs against this PR's code.

@github-actions github-actions Bot removed the stale label Aug 4, 2026
Add a shadcn-namespaced component registry workflow to the AppKit CLI:

- 'appkit add <component...>' ensures the @AppKit registry namespace in the
  consumer's components.json, then delegates to 'shadcn add @appkit/<name>'.
- 'appkit registry list' enumerates components from the registry index.

Registry components import primitives from @databricks/appkit-ui (npm peer),
so they stay in sync with the installed AppKit version and design tokens.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Serve the registry directly from the public GitHub repo over
raw.githubusercontent.com instead of a placeholder host — no separate
hosting infra needed.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Fetch registry items ourselves (token-aware) and hand a local file to
'shadcn add', rather than relying on a shadcn namespace — so we control
the auth headers and the internal/private repo works today.

- Token resolved from gh auth token, then APPKIT_REGISTRY_TOKEN /
  GITHUB_TOKEN / GH_TOKEN.
- Private fetch uses the GitHub Contents API (Accept: raw); falls back to
  raw.githubusercontent.com when no token / once the repo is public.
- 'appkit registry list' is token-aware too.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
AppKit registry items are self-contained (import from @databricks/appkit-ui,
no shadcn @/ aliases or registryDependencies), so shadcn's alias resolution
isn't needed. Write item files to their target path directly and install npm
deps with the detected package manager — no components.json required.

- Targets resolved under src/ when present.
- --force to overwrite existing files (refuses by default).
- Warns on any registryDependency rather than silently dropping it.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
'appkit add' is typically run from the repo root, where the frontend lives
in a client/ subdir. Detect the frontend root (dir with components.json or
src/, including common client/frontend/web/app subdirs) and write components
under <frontend>/src/<target>. Install deps into the nearest package.json
(single root package.json in the AppKit app layout). Add --cwd to override.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Server plugins can now be distributed through the same registry as UI
components. 'appkit plugin add <name>' fetches a plugin item, writes it to
plugins/<name>/ (verbatim targets, not under client/src), installs npm deps,
runs 'plugin sync' to register it, and prints the createApp snippet plus any
required env vars.

- Extract shared fetch into registry/client.ts (reused by add + plugin add).
- Detect plugin items by the presence of manifest.json.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
…server/plugins

Remove the separate 'appkit plugin add' command. 'appkit add' now detects the
item kind (plugin = has manifest.json) and routes:
  • UI components → <frontend>/src/components/appkit/
  • server plugins → <server>/plugins/<name>/ (server/ subdir detected)
then installs deps, runs plugin sync for plugins, and prints next steps.
A single call can mix components and plugins.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
After placing a plugin and running sync, 'appkit add' edits the server entry
(server/index.ts etc.) to add the import and insert the plugin into the
createApp({ plugins: [...] }) array, reusing the ast-grep machinery from
'plugin sync'. Best-effort and safe:
  • idempotent — skips if the plugin is already registered
  • only edits the standard plugins:[...] array literal; otherwise falls back
    to printing the manual snippet
  • --no-register opts out of the server edit

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
toPlugin exports are factories, so register as `hello()` (matching server(),
analytics()), not a bare identifier. Insert before the first array element with
its indentation so multi-line plugins arrays keep their formatting instead of
jamming onto the opening-bracket line.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
- 'appkit registry list' shows a VERIFIED ✓ column (from item meta.verified)
  with a --verified filter; JSON output gains a top-level verified field.
- Colorize list + add output with picocolors (green created/registered/✓,
  yellow updated/warnings, red errors, dim hints). Padding is applied before
  coloring so columns stay aligned; picocolors no-ops on non-TTY/NO_COLOR.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Derive a friendly kind per item: a manifest.json marks a plugin; otherwise map
the shadcn registry:* type (component/hook/lib/theme/...). Adds a colorized TYPE
column to the table and a 'kind' field to --json output.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Adds a search subcommand so agents (and people) can match intent to items:
matches all query terms against name, title, description, derived kind, and
item categories. Shares the token-aware index fetch + table/JSON rendering
with 'registry list'. --verified and --json supported.

Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Match the registry rename (registry.json name: appkit -> databricks-appkit)
so `appkit add` writes the @databricks-appkit namespace into components.json
and stripNamespace() strips the same prefix.

Co-authored-by: Isaac
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