nikcli 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-typecheck.log +1 -0
- package/AGENTS.md +27 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/nikcli +84 -0
- package/config.json +13 -0
- package/docs/tailscale-mobile/01-tailscale-setup.md +94 -0
- package/docs/tailscale-mobile/02-host-setup.md +115 -0
- package/docs/tailscale-mobile/03-phone-and-serve.md +134 -0
- package/docs/tailscale-mobile/README.md +59 -0
- package/examples/README.md +54 -0
- package/package.json +147 -0
- package/parsers-config.ts +253 -0
- package/script/build.ts +179 -0
- package/script/postinstall.mjs +125 -0
- package/script/publish-registries.ts +187 -0
- package/script/publish.ts +100 -0
- package/script/schema.ts +47 -0
- package/script/seed-e2e.ts +50 -0
- package/sequential-prancing-forest.md +373 -0
- package/src/acp/README.md +164 -0
- package/src/acp/agent.ts +1303 -0
- package/src/acp/session.ts +105 -0
- package/src/acp/types.ts +22 -0
- package/src/agent/agent.ts +528 -0
- package/src/agent/generate.txt +32 -0
- package/src/agent/prompt/compaction.txt +14 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +11 -0
- package/src/agent/prompt/title.txt +44 -0
- package/src/auth/index.ts +73 -0
- package/src/bun/index.ts +119 -0
- package/src/bun/registry.ts +54 -0
- package/src/bus/bus-event.ts +43 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +105 -0
- package/src/chatbot/handlers.ts +150 -0
- package/src/chatbot/index.ts +132 -0
- package/src/cli/bootstrap.ts +17 -0
- package/src/cli/cmd/acp.ts +69 -0
- package/src/cli/cmd/ads.ts +377 -0
- package/src/cli/cmd/agent.ts +259 -0
- package/src/cli/cmd/auth.ts +400 -0
- package/src/cli/cmd/chatbot.ts +420 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/companion.ts +81 -0
- package/src/cli/cmd/connectors.ts +593 -0
- package/src/cli/cmd/debug/agent.ts +166 -0
- package/src/cli/cmd/debug/config.ts +16 -0
- package/src/cli/cmd/debug/file.ts +97 -0
- package/src/cli/cmd/debug/index.ts +48 -0
- package/src/cli/cmd/debug/lsp.ts +52 -0
- package/src/cli/cmd/debug/ripgrep.ts +87 -0
- package/src/cli/cmd/debug/scrap.ts +16 -0
- package/src/cli/cmd/debug/skill.ts +16 -0
- package/src/cli/cmd/debug/snapshot.ts +52 -0
- package/src/cli/cmd/export.ts +88 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +412 -0
- package/src/cli/cmd/image-model.ts +128 -0
- package/src/cli/cmd/import.ts +201 -0
- package/src/cli/cmd/lovable.ts +128 -0
- package/src/cli/cmd/mcp.ts +738 -0
- package/src/cli/cmd/mobile.ts +223 -0
- package/src/cli/cmd/models.ts +77 -0
- package/src/cli/cmd/plug.ts +231 -0
- package/src/cli/cmd/pr.ts +104 -0
- package/src/cli/cmd/rag-model.ts +167 -0
- package/src/cli/cmd/remote.ts +416 -0
- package/src/cli/cmd/run.ts +589 -0
- package/src/cli/cmd/serve.ts +51 -0
- package/src/cli/cmd/session.ts +133 -0
- package/src/cli/cmd/speak-model.ts +204 -0
- package/src/cli/cmd/stats.ts +402 -0
- package/src/cli/cmd/tui/app.tsx +841 -0
- package/src/cli/cmd/tui/attach.ts +31 -0
- package/src/cli/cmd/tui/component/border.tsx +75 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +172 -0
- package/src/cli/cmd/tui/component/dialog-config.tsx +291 -0
- package/src/cli/cmd/tui/component/dialog-connectors.tsx +440 -0
- package/src/cli/cmd/tui/component/dialog-image-model.tsx +97 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +234 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +260 -0
- package/src/cli/cmd/tui/component/dialog-rag-model.tsx +217 -0
- package/src/cli/cmd/tui/component/dialog-remote.tsx +489 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +170 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-settings/index.tsx +59 -0
- package/src/cli/cmd/tui/component/dialog-settings/prompt.tsx +40 -0
- package/src/cli/cmd/tui/component/dialog-settings/sidebar.tsx +39 -0
- package/src/cli/cmd/tui/component/dialog-settings/spinner.tsx +62 -0
- package/src/cli/cmd/tui/component/dialog-settings/ui.tsx +58 -0
- package/src/cli/cmd/tui/component/dialog-skills.tsx +117 -0
- package/src/cli/cmd/tui/component/dialog-speak-model.tsx +304 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +165 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-create.tsx +717 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +52 -0
- package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +350 -0
- package/src/cli/cmd/tui/component/error-component.tsx +91 -0
- package/src/cli/cmd/tui/component/logo.tsx +103 -0
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +669 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +89 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +2165 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +63 -0
- package/src/cli/cmd/tui/component/spinner.tsx +24 -0
- package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
- package/src/cli/cmd/tui/component/table/markdown-table.tsx +267 -0
- package/src/cli/cmd/tui/component/table-db/db/connections.ts +75 -0
- package/src/cli/cmd/tui/component/table-db/db/db-connection.ts +223 -0
- package/src/cli/cmd/tui/component/table-db/db/db-preview.ts +202 -0
- package/src/cli/cmd/tui/component/table-db/db/factory.ts +77 -0
- package/src/cli/cmd/tui/component/table-db/db/index.ts +9 -0
- package/src/cli/cmd/tui/component/table-db/db/mysql-connection.ts +330 -0
- package/src/cli/cmd/tui/component/table-db/db/postgres-connection.ts +338 -0
- package/src/cli/cmd/tui/component/table-db/db/sqlite-connection.ts +302 -0
- package/src/cli/cmd/tui/component/table-db/db/types.ts +108 -0
- package/src/cli/cmd/tui/component/table-db/table/dbedit-hooks.ts +74 -0
- package/src/cli/cmd/tui/component/table-db/table/index.ts +15 -0
- package/src/cli/cmd/tui/component/table-db/table/table-events.ts +54 -0
- package/src/cli/cmd/tui/component/table-db/table/table-formatters.ts +191 -0
- package/src/cli/cmd/tui/component/table-db/table/table-hooks.ts +105 -0
- package/src/cli/cmd/tui/component/table-db/table/table-keyboard-handler.ts +255 -0
- package/src/cli/cmd/tui/component/table-db/table/table-layout-engine.ts +208 -0
- package/src/cli/cmd/tui/component/table-db/table/table-renderable.ts +486 -0
- package/src/cli/cmd/tui/component/table-db/table/table-selection-manager.ts +136 -0
- package/src/cli/cmd/tui/component/table-db/table/table-state.ts +198 -0
- package/src/cli/cmd/tui/component/table-db/table/types.ts +69 -0
- package/src/cli/cmd/tui/component/table-db/ui/db-visualizer.tsx +71 -0
- package/src/cli/cmd/tui/component/table-db/ui/index.ts +2 -0
- package/src/cli/cmd/tui/component/table-db/ui/table-renderer.ts +607 -0
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
- package/src/cli/cmd/tui/component/tips.tsx +195 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/context/args.tsx +14 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +24 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +102 -0
- package/src/cli/cmd/tui/context/kv.tsx +52 -0
- package/src/cli/cmd/tui/context/local.tsx +458 -0
- package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +54 -0
- package/src/cli/cmd/tui/context/sdk.tsx +128 -0
- package/src/cli/cmd/tui/context/server.tsx +8 -0
- package/src/cli/cmd/tui/context/sync.tsx +510 -0
- package/src/cli/cmd/tui/context/theme/abyss.json +233 -0
- package/src/cli/cmd/tui/context/theme/apple.json +235 -0
- package/src/cli/cmd/tui/context/theme/arctic.json +232 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/ayuai.json +229 -0
- package/src/cli/cmd/tui/context/theme/blood.json +229 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catmoe.json +235 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-latte.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +259 -0
- package/src/cli/cmd/tui/context/theme/charcoal.json +230 -0
- package/src/cli/cmd/tui/context/theme/chromatic.json +235 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/cosmic.json +234 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/cyber.json +235 -0
- package/src/cli/cmd/tui/context/theme/dawnfox.json +229 -0
- package/src/cli/cmd/tui/context/theme/dimension.json +235 -0
- package/src/cli/cmd/tui/context/theme/dracula-official.json +222 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/dream.json +235 -0
- package/src/cli/cmd/tui/context/theme/duo.json +235 -0
- package/src/cli/cmd/tui/context/theme/dusk.json +235 -0
- package/src/cli/cmd/tui/context/theme/ebony.json +232 -0
- package/src/cli/cmd/tui/context/theme/equilibrium.json +232 -0
- package/src/cli/cmd/tui/context/theme/ethereal.json +235 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/fusion.json +235 -0
- package/src/cli/cmd/tui/context/theme/ghost.json +235 -0
- package/src/cli/cmd/tui/context/theme/github-dark.json +229 -0
- package/src/cli/cmd/tui/context/theme/github-dimmed.json +231 -0
- package/src/cli/cmd/tui/context/theme/github-light.json +229 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/glass.json +235 -0
- package/src/cli/cmd/tui/context/theme/gold.json +235 -0
- package/src/cli/cmd/tui/context/theme/gone.json +234 -0
- package/src/cli/cmd/tui/context/theme/greyscale.json +229 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
- package/src/cli/cmd/tui/context/theme/hacker.json +229 -0
- package/src/cli/cmd/tui/context/theme/holo.json +235 -0
- package/src/cli/cmd/tui/context/theme/ink.json +235 -0
- package/src/cli/cmd/tui/context/theme/jet.json +233 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +227 -0
- package/src/cli/cmd/tui/context/theme/lavender.json +236 -0
- package/src/cli/cmd/tui/context/theme/lightph.json +235 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
- package/src/cli/cmd/tui/context/theme/material-ocean.json +230 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +227 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +245 -0
- package/src/cli/cmd/tui/context/theme/midnight.json +235 -0
- package/src/cli/cmd/tui/context/theme/modern.json +235 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/muted.json +229 -0
- package/src/cli/cmd/tui/context/theme/neon.json +229 -0
- package/src/cli/cmd/tui/context/theme/neonfusion.json +235 -0
- package/src/cli/cmd/tui/context/theme/neutral.json +235 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nikcli.json +245 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/nordic.json +235 -0
- package/src/cli/cmd/tui/context/theme/nova.json +235 -0
- package/src/cli/cmd/tui/context/theme/obsidian.json +234 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +231 -0
- package/src/cli/cmd/tui/context/theme/one-pro.json +229 -0
- package/src/cli/cmd/tui/context/theme/onyx.json +233 -0
- package/src/cli/cmd/tui/context/theme/orng.json +249 -0
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +240 -0
- package/src/cli/cmd/tui/context/theme/oxocarbon.json +229 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/poimandres.json +230 -0
- package/src/cli/cmd/tui/context/theme/prism.json +235 -0
- package/src/cli/cmd/tui/context/theme/radiant.json +235 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/shadow.json +235 -0
- package/src/cli/cmd/tui/context/theme/silicon.json +235 -0
- package/src/cli/cmd/tui/context/theme/slate.json +233 -0
- package/src/cli/cmd/tui/context/theme/soft.json +235 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/spectrum.json +235 -0
- package/src/cli/cmd/tui/context/theme/starlight.json +233 -0
- package/src/cli/cmd/tui/context/theme/sunrise.json +235 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tech.json +235 -0
- package/src/cli/cmd/tui/context/theme/tokyonight-storm.json +245 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vapor.json +235 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/vivid.json +232 -0
- package/src/cli/cmd/tui/context/theme/void.json +235 -0
- package/src/cli/cmd/tui/context/theme/vscode.json +235 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme/zinc.json +236 -0
- package/src/cli/cmd/tui/context/theme.tsx +1303 -0
- package/src/cli/cmd/tui/event.ts +48 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +152 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +50 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +63 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +96 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +48 -0
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +288 -0
- package/src/cli/cmd/tui/plugin/api.tsx +407 -0
- package/src/cli/cmd/tui/plugin/index.ts +3 -0
- package/src/cli/cmd/tui/plugin/internal.ts +25 -0
- package/src/cli/cmd/tui/plugin/runtime.ts +1048 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +61 -0
- package/src/cli/cmd/tui/routes/home.tsx +153 -0
- package/src/cli/cmd/tui/routes/session/dbedit.tsx +474 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +65 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +110 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +105 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +75 -0
- package/src/cli/cmd/tui/routes/session/header.tsx +177 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +2280 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +540 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +435 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +313 -0
- package/src/cli/cmd/tui/thread.ts +174 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +102 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +389 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +180 -0
- package/src/cli/cmd/tui/ui/link.tsx +34 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +138 -0
- package/src/cli/cmd/tui/util/clipboard.ts +154 -0
- package/src/cli/cmd/tui/util/editor.ts +32 -0
- package/src/cli/cmd/tui/util/signal.ts +7 -0
- package/src/cli/cmd/tui/util/terminal.ts +114 -0
- package/src/cli/cmd/tui/util/transcript.ts +98 -0
- package/src/cli/cmd/tui/win32.ts +110 -0
- package/src/cli/cmd/tui/worker.ts +156 -0
- package/src/cli/cmd/uninstall.ts +357 -0
- package/src/cli/cmd/upgrade.ts +72 -0
- package/src/cli/cmd/web.ts +87 -0
- package/src/cli/cmd/workspace-serve.ts +16 -0
- package/src/cli/error.ts +57 -0
- package/src/cli/network.ts +55 -0
- package/src/cli/remote/index.ts +36 -0
- package/src/cli/remote/notifications.ts +104 -0
- package/src/cli/remote/qr-renderer.ts +86 -0
- package/src/cli/remote/remote-service.ts +757 -0
- package/src/cli/remote/session-manager.ts +284 -0
- package/src/cli/remote/subagent-hooks.ts +151 -0
- package/src/cli/remote/types.ts +121 -0
- package/src/cli/ui.ts +96 -0
- package/src/cli/upgrade.ts +25 -0
- package/src/command/index.ts +174 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +99 -0
- package/src/config/config.ts +1760 -0
- package/src/config/markdown.ts +88 -0
- package/src/config/migrate-tui-config.ts +155 -0
- package/src/config/paths.ts +174 -0
- package/src/config/tui-schema.ts +36 -0
- package/src/config/tui.ts +209 -0
- package/src/connectors/api/base.ts +75 -0
- package/src/connectors/api/figma.ts +103 -0
- package/src/connectors/api/github.ts +247 -0
- package/src/connectors/api/lovable.ts +126 -0
- package/src/connectors/api/slack.ts +137 -0
- package/src/connectors/auth.ts +68 -0
- package/src/connectors/cache.ts +119 -0
- package/src/connectors/credentials.ts +81 -0
- package/src/connectors/index.ts +202 -0
- package/src/connectors/registry.ts +358 -0
- package/src/docs/context.ts +120 -0
- package/src/docs/library.ts +189 -0
- package/src/env/index.ts +26 -0
- package/src/file/ignore.ts +83 -0
- package/src/file/index.ts +411 -0
- package/src/file/ripgrep.ts +402 -0
- package/src/file/time.ts +65 -0
- package/src/file/watcher.ts +127 -0
- package/src/flag/flag.ts +128 -0
- package/src/format/formatter.ts +356 -0
- package/src/format/index.ts +137 -0
- package/src/global/index.ts +57 -0
- package/src/id/id.ts +83 -0
- package/src/ide/index.ts +76 -0
- package/src/index.ts +184 -0
- package/src/installation/index.ts +246 -0
- package/src/lsp/client.ts +250 -0
- package/src/lsp/index.ts +483 -0
- package/src/lsp/language.ts +119 -0
- package/src/lsp/server.ts +2046 -0
- package/src/mcp/auth.ts +121 -0
- package/src/mcp/index.ts +860 -0
- package/src/mcp/oauth-callback.ts +198 -0
- package/src/mcp/oauth-provider.ts +148 -0
- package/src/mobile/auth.ts +97 -0
- package/src/mobile/github-repo.ts +185 -0
- package/src/patch/index.ts +631 -0
- package/src/permission/arity.ts +150 -0
- package/src/permission/dbedit.ts +236 -0
- package/src/permission/index.ts +210 -0
- package/src/permission/next.ts +287 -0
- package/src/plugin/codex.ts +493 -0
- package/src/plugin/copilot.ts +261 -0
- package/src/plugin/index.ts +714 -0
- package/src/plugin/install.ts +379 -0
- package/src/plugin/meta.ts +165 -0
- package/src/plugin/shared.ts +188 -0
- package/src/project/bootstrap.ts +35 -0
- package/src/project/instance.ts +84 -0
- package/src/project/project.ts +373 -0
- package/src/project/state.ts +66 -0
- package/src/project/vcs.ts +76 -0
- package/src/prompt/stash-store.ts +93 -0
- package/src/provider/auth.ts +147 -0
- package/src/provider/models-macro.ts +22 -0
- package/src/provider/models.ts +216 -0
- package/src/provider/provider.ts +1483 -0
- package/src/provider/sdk/openai-compatible/src/README.md +5 -0
- package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1732 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
- package/src/provider/transform.ts +828 -0
- package/src/pty/index.ts +241 -0
- package/src/question/index.ts +171 -0
- package/src/rag/chunk.ts +43 -0
- package/src/rag/embed.ts +179 -0
- package/src/rag/index.ts +376 -0
- package/src/rag/storage.ts +76 -0
- package/src/scheduler/index.ts +61 -0
- package/src/server/error.ts +36 -0
- package/src/server/event.ts +7 -0
- package/src/server/mdns.ts +59 -0
- package/src/server/routes/chatbot.ts +205 -0
- package/src/server/routes/companion.ts +729 -0
- package/src/server/routes/config.ts +92 -0
- package/src/server/routes/connectors.ts +121 -0
- package/src/server/routes/dbedit.ts +76 -0
- package/src/server/routes/experimental.ts +210 -0
- package/src/server/routes/file.ts +197 -0
- package/src/server/routes/global.ts +135 -0
- package/src/server/routes/mcp.ts +225 -0
- package/src/server/routes/mobile.ts +2044 -0
- package/src/server/routes/permission.ts +68 -0
- package/src/server/routes/project.ts +82 -0
- package/src/server/routes/provider.ts +235 -0
- package/src/server/routes/pty.ts +169 -0
- package/src/server/routes/question.ts +98 -0
- package/src/server/routes/session.ts +968 -0
- package/src/server/routes/tui.ts +379 -0
- package/src/server/routes/workspace.ts +104 -0
- package/src/server/server.ts +761 -0
- package/src/server/ssh.ts +207 -0
- package/src/session/auth.ts +402 -0
- package/src/session/compaction.ts +253 -0
- package/src/session/generate.ts +38 -0
- package/src/session/index.ts +598 -0
- package/src/session/llm.ts +273 -0
- package/src/session/message-v2.ts +836 -0
- package/src/session/message.ts +189 -0
- package/src/session/processor.ts +408 -0
- package/src/session/prompt/anthropic-20250930.txt +165 -0
- package/src/session/prompt/anthropic.txt +105 -0
- package/src/session/prompt/anthropic_spoof.txt +1 -0
- package/src/session/prompt/beast.txt +147 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex_header.txt +79 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
- package/src/session/prompt/plan.txt +25 -0
- package/src/session/prompt/qwen.txt +108 -0
- package/src/session/prompt.ts +1942 -0
- package/src/session/retry.ts +90 -0
- package/src/session/revert.ts +120 -0
- package/src/session/stats.ts +404 -0
- package/src/session/status.ts +84 -0
- package/src/session/summary.ts +184 -0
- package/src/session/system.ts +195 -0
- package/src/session/toast.tsx +105 -0
- package/src/session/todo.ts +258 -0
- package/src/session/uninstall.ts +357 -0
- package/src/share/share-next.ts +421 -0
- package/src/share/share.ts +92 -0
- package/src/shell/shell.ts +65 -0
- package/src/skill/index.ts +1 -0
- package/src/skill/skill.ts +232 -0
- package/src/snapshot/index.ts +297 -0
- package/src/storage/storage.ts +227 -0
- package/src/tool/apply_patch.ts +288 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/bash.ts +252 -0
- package/src/tool/bash.txt +115 -0
- package/src/tool/batch.ts +175 -0
- package/src/tool/batch.txt +24 -0
- package/src/tool/codesearch.ts +132 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/context_collect.ts +152 -0
- package/src/tool/context_collect.txt +9 -0
- package/src/tool/context_diagnostics.ts +81 -0
- package/src/tool/context_diagnostics.txt +5 -0
- package/src/tool/context_related.ts +117 -0
- package/src/tool/context_related.txt +5 -0
- package/src/tool/context_search.ts +108 -0
- package/src/tool/context_search.txt +8 -0
- package/src/tool/db-diff.ts +434 -0
- package/src/tool/db-table.txt +15 -0
- package/src/tool/docs_add.ts +50 -0
- package/src/tool/docs_add.txt +5 -0
- package/src/tool/docs_context.ts +56 -0
- package/src/tool/docs_context.txt +4 -0
- package/src/tool/docs_gap_report.ts +79 -0
- package/src/tool/docs_gap_report.txt +7 -0
- package/src/tool/docs_load.ts +41 -0
- package/src/tool/docs_load.txt +4 -0
- package/src/tool/docs_request.ts +129 -0
- package/src/tool/docs_request.txt +7 -0
- package/src/tool/docs_search.ts +51 -0
- package/src/tool/docs_search.txt +6 -0
- package/src/tool/docs_unload.ts +38 -0
- package/src/tool/docs_unload.txt +5 -0
- package/src/tool/edit.ts +614 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +32 -0
- package/src/tool/generate_image.ts +174 -0
- package/src/tool/generate_image.txt +12 -0
- package/src/tool/glob.ts +79 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +153 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +116 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp.ts +96 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/memory_search.ts +141 -0
- package/src/tool/memory_search.txt +8 -0
- package/src/tool/multiedit.ts +46 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/plan-enter.txt +14 -0
- package/src/tool/plan-exit.txt +13 -0
- package/src/tool/plan.ts +130 -0
- package/src/tool/question.ts +33 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/rag_index.ts +77 -0
- package/src/tool/rag_index.txt +10 -0
- package/src/tool/rag_reset.ts +26 -0
- package/src/tool/rag_reset.txt +4 -0
- package/src/tool/rag_search.ts +62 -0
- package/src/tool/rag_search.txt +6 -0
- package/src/tool/rag_status.ts +45 -0
- package/src/tool/rag_status.txt +4 -0
- package/src/tool/read.ts +203 -0
- package/src/tool/read.txt +12 -0
- package/src/tool/registry.ts +214 -0
- package/src/tool/skill.ts +169 -0
- package/src/tool/skill.txt +3 -0
- package/src/tool/smart_docs.ts +74 -0
- package/src/tool/smart_docs.txt +7 -0
- package/src/tool/speak/elevenlabs.ts +201 -0
- package/src/tool/speak/openrouter.ts +240 -0
- package/src/tool/speak/provider.ts +83 -0
- package/src/tool/speak.ts +440 -0
- package/src/tool/task.ts +194 -0
- package/src/tool/task.txt +60 -0
- package/src/tool/todo.ts +53 -0
- package/src/tool/todoread.txt +14 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +87 -0
- package/src/tool/tree.ts +218 -0
- package/src/tool/tree.txt +8 -0
- package/src/tool/truncation.ts +106 -0
- package/src/tool/use-connector.ts +47 -0
- package/src/tool/voice.ts +188 -0
- package/src/tool/webfetch.ts +205 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +150 -0
- package/src/tool/websearch.txt +14 -0
- package/src/tool/write.ts +80 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +16 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/defer.ts +12 -0
- package/src/util/error.ts +77 -0
- package/src/util/eventloop.ts +20 -0
- package/src/util/filesystem.ts +125 -0
- package/src/util/flock.ts +329 -0
- package/src/util/fn.ts +11 -0
- package/src/util/format.ts +20 -0
- package/src/util/hash.ts +7 -0
- package/src/util/iife.ts +3 -0
- package/src/util/keybind.ts +103 -0
- package/src/util/lazy.ts +18 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +180 -0
- package/src/util/network.ts +9 -0
- package/src/util/process.ts +15 -0
- package/src/util/queue.ts +32 -0
- package/src/util/record.ts +3 -0
- package/src/util/rpc.ts +66 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +7 -0
- package/src/util/wildcard.ts +56 -0
- package/src/workspace/adaptors/index.ts +271 -0
- package/src/workspace/adaptors/types.ts +14 -0
- package/src/workspace/adaptors/worktree.ts +31 -0
- package/src/workspace/config.ts +19 -0
- package/src/workspace/index.ts +223 -0
- package/src/workspace/session-proxy-middleware.ts +97 -0
- package/src/workspace/sse.ts +66 -0
- package/src/workspace/workspace-context.ts +23 -0
- package/src/workspace/workspace-server/routes.ts +33 -0
- package/src/workspace/workspace-server/server.ts +47 -0
- package/src/worktree/index.ts +487 -0
- package/sst-env.d.ts +10 -0
- package/test/benchmark.test.ts +121 -0
- package/test/build-optimizations.test.ts +124 -0
- package/test/id-benchmark.test.ts +132 -0
- package/test/optimizations.test.ts +302 -0
- package/test/preload.ts +1 -0
- package/test/solidjs-benchmark.test.ts +262 -0
- package/test/solidjs-optimizations.test.ts +259 -0
- package/test/tui-benchmark.test.ts +230 -0
- package/test/wildcard-benchmark.test.ts +180 -0
- package/tsconfig.json +26 -0
package/src/flag/flag.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
function truthy(key: string) {
|
|
2
|
+
const value = process.env[key]?.toLowerCase()
|
|
3
|
+
return value === "true" || value === "1"
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export namespace Flag {
|
|
7
|
+
export const NIKCLI_AUTO_SHARE = truthy("NIKCLI_AUTO_SHARE")
|
|
8
|
+
export const NIKCLI_GIT_BASH_PATH = process.env["NIKCLI_GIT_BASH_PATH"]
|
|
9
|
+
export const NIKCLI_CONFIG = process.env["NIKCLI_CONFIG"]
|
|
10
|
+
export declare const NIKCLI_CONFIG_DIR: string | undefined
|
|
11
|
+
export const NIKCLI_CONFIG_CONTENT = process.env["NIKCLI_CONFIG_CONTENT"]
|
|
12
|
+
export const NIKCLI_DISABLE_AUTOUPDATE = truthy("NIKCLI_DISABLE_AUTOUPDATE")
|
|
13
|
+
export const NIKCLI_DISABLE_PRUNE = truthy("NIKCLI_DISABLE_PRUNE")
|
|
14
|
+
export const NIKCLI_DISABLE_TERMINAL_TITLE = truthy("NIKCLI_DISABLE_TERMINAL_TITLE")
|
|
15
|
+
export const NIKCLI_PERMISSION = process.env["NIKCLI_PERMISSION"]
|
|
16
|
+
export const NIKCLI_DISABLE_DEFAULT_PLUGINS = truthy("NIKCLI_DISABLE_DEFAULT_PLUGINS")
|
|
17
|
+
export const NIKCLI_DISABLE_LSP_DOWNLOAD = truthy("NIKCLI_DISABLE_LSP_DOWNLOAD")
|
|
18
|
+
export const NIKCLI_ENABLE_EXPERIMENTAL_MODELS = truthy("NIKCLI_ENABLE_EXPERIMENTAL_MODELS")
|
|
19
|
+
export const NIKCLI_DISABLE_AUTOCOMPACT = truthy("NIKCLI_DISABLE_AUTOCOMPACT")
|
|
20
|
+
export const NIKCLI_DISABLE_MODELS_FETCH = truthy("NIKCLI_DISABLE_MODELS_FETCH")
|
|
21
|
+
export const NIKCLI_DISABLE_CLAUDE_CODE = truthy("NIKCLI_DISABLE_CLAUDE_CODE")
|
|
22
|
+
export const NIKCLI_DISABLE_CLAUDE_CODE_PROMPT =
|
|
23
|
+
NIKCLI_DISABLE_CLAUDE_CODE || truthy("NIKCLI_DISABLE_CLAUDE_CODE_PROMPT")
|
|
24
|
+
export const NIKCLI_DISABLE_CLAUDE_CODE_SKILLS =
|
|
25
|
+
NIKCLI_DISABLE_CLAUDE_CODE || truthy("NIKCLI_DISABLE_CLAUDE_CODE_SKILLS")
|
|
26
|
+
export const NIKCLI_DISABLE_EXTERNAL_SKILLS =
|
|
27
|
+
NIKCLI_DISABLE_CLAUDE_CODE_SKILLS || truthy("NIKCLI_DISABLE_EXTERNAL_SKILLS")
|
|
28
|
+
export declare const NIKCLI_DISABLE_PROJECT_CONFIG: boolean
|
|
29
|
+
export const NIKCLI_FAKE_VCS = process.env["NIKCLI_FAKE_VCS"]
|
|
30
|
+
export const NIKCLI_CLIENT = process.env["NIKCLI_CLIENT"] ?? "cli"
|
|
31
|
+
export const NIKCLI_SERVER_PASSWORD = process.env["NIKCLI_SERVER_PASSWORD"]
|
|
32
|
+
export const NIKCLI_SERVER_USERNAME = process.env["NIKCLI_SERVER_USERNAME"]
|
|
33
|
+
export const NIKCLI_SERVER_TAILSCALE_AUTH = truthy("NIKCLI_SERVER_TAILSCALE_AUTH")
|
|
34
|
+
export const NIKCLI_SERVER_TAILSCALE_USERS = process.env["NIKCLI_SERVER_TAILSCALE_USERS"]
|
|
35
|
+
|
|
36
|
+
// SSH Server
|
|
37
|
+
export const NIKCLI_SERVER_SSH_ENABLED = truthy("NIKCLI_SERVER_SSH_ENABLED")
|
|
38
|
+
export const NIKCLI_SERVER_SSH_PORT = parseInt(process.env["NIKCLI_SERVER_SSH_PORT"] ?? "2222")
|
|
39
|
+
export const NIKCLI_SERVER_SSH_HOST = process.env["NIKCLI_SERVER_SSH_HOST"] ?? "0.0.0.0"
|
|
40
|
+
|
|
41
|
+
// Connectors
|
|
42
|
+
export const NIKCLI_FIGMA_TOKEN = process.env["NIKCLI_FIGMA_TOKEN"]
|
|
43
|
+
export const NIKCLI_SLACK_BOT_TOKEN = process.env["NIKCLI_SLACK_BOT_TOKEN"]
|
|
44
|
+
export const NIKCLI_GITHUB_TOKEN = process.env["NIKCLI_GITHUB_TOKEN"]
|
|
45
|
+
export const NIKCLI_GITHUB_OAUTH_CLIENT_ID = process.env["NIKCLI_GITHUB_OAUTH_CLIENT_ID"] ?? process.env["GITHUB_CLIENT_ID_CONSOLE"] ?? process.env["GITHUB_CLIENT_ID"] ?? undefined
|
|
46
|
+
export const NIKCLI_LOVABLE_TOKEN = process.env["NIKCLI_LOVABLE_TOKEN"] ?? process.env["NIKCLI_LOVABLE_API_KEY"]
|
|
47
|
+
export const NIKCLI_LOVABLE_API_KEY = process.env["NIKCLI_LOVABLE_API_KEY"]
|
|
48
|
+
|
|
49
|
+
// Notifications
|
|
50
|
+
export const NIKCLI_SLACK_CHANNEL =
|
|
51
|
+
process.env["NIKCLI_SLACK_CHANNEL"] ?? process.env["SLACK_DEFAULT_CHANNEL"] ?? process.env["SLACK_CHANNEL"]
|
|
52
|
+
export const NIKCLI_DISCORD_WEBHOOK_URL =
|
|
53
|
+
process.env["NIKCLI_DISCORD_WEBHOOK_URL"] ?? process.env["DISCORD_WEBHOOK_URL"]
|
|
54
|
+
export const NIKCLI_TODO_NOTIFICATIONS = truthy("NIKCLI_TODO_NOTIFICATIONS")
|
|
55
|
+
export const NIKCLI_SLACK_TASK_NOTIFICATIONS =
|
|
56
|
+
truthy("NIKCLI_SLACK_TASK_NOTIFICATIONS") || truthy("SLACK_TASK_NOTIFICATIONS")
|
|
57
|
+
export const NIKCLI_DISCORD_TASK_NOTIFICATIONS =
|
|
58
|
+
truthy("NIKCLI_DISCORD_TASK_NOTIFICATIONS") || truthy("DISCORD_TASK_NOTIFICATIONS")
|
|
59
|
+
|
|
60
|
+
// TUI plugin system
|
|
61
|
+
export declare const NIKCLI_TUI_CONFIG: string | undefined
|
|
62
|
+
export const NIKCLI_PURE = truthy("NIKCLI_PURE")
|
|
63
|
+
export const NIKCLI_PLUGIN_META_FILE = process.env["NIKCLI_PLUGIN_META_FILE"]
|
|
64
|
+
|
|
65
|
+
// Experimental
|
|
66
|
+
export const NIKCLI_EXPERIMENTAL = truthy("NIKCLI_EXPERIMENTAL")
|
|
67
|
+
export const NIKCLI_EXPERIMENTAL_FILEWATCHER = truthy("NIKCLI_EXPERIMENTAL_FILEWATCHER")
|
|
68
|
+
export const NIKCLI_EXPERIMENTAL_DISABLE_FILEWATCHER = truthy("NIKCLI_EXPERIMENTAL_DISABLE_FILEWATCHER")
|
|
69
|
+
export const NIKCLI_EXPERIMENTAL_ICON_DISCOVERY = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_ICON_DISCOVERY")
|
|
70
|
+
export const NIKCLI_EXPERIMENTAL_DISABLE_COPY_ON_SELECT = truthy("NIKCLI_EXPERIMENTAL_DISABLE_COPY_ON_SELECT")
|
|
71
|
+
export const NIKCLI_ENABLE_EXA =
|
|
72
|
+
truthy("NIKCLI_ENABLE_EXA") || NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_EXA")
|
|
73
|
+
export const NIKCLI_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH = number("NIKCLI_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH")
|
|
74
|
+
export const NIKCLI_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS = number("NIKCLI_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS")
|
|
75
|
+
export const NIKCLI_EXPERIMENTAL_OUTPUT_TOKEN_MAX = number("NIKCLI_EXPERIMENTAL_OUTPUT_TOKEN_MAX")
|
|
76
|
+
export const NIKCLI_EXPERIMENTAL_OXFMT = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_OXFMT")
|
|
77
|
+
export const NIKCLI_EXPERIMENTAL_LSP_TY = truthy("NIKCLI_EXPERIMENTAL_LSP_TY")
|
|
78
|
+
export const NIKCLI_EXPERIMENTAL_LSP_TOOL = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_LSP_TOOL")
|
|
79
|
+
export const NIKCLI_DISABLE_FILETIME_CHECK = truthy("NIKCLI_DISABLE_FILETIME_CHECK")
|
|
80
|
+
export const NIKCLI_EXPERIMENTAL_PLAN_MODE = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_PLAN_MODE")
|
|
81
|
+
export const NIKCLI_EXPERIMENTAL_WORKSPACES_TUI = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_WORKSPACES_TUI")
|
|
82
|
+
export const NIKCLI_EXPERIMENTAL_SECURITY_TOOL = NIKCLI_EXPERIMENTAL || truthy("NIKCLI_EXPERIMENTAL_SECURITY_TOOL")
|
|
83
|
+
|
|
84
|
+
function number(key: string) {
|
|
85
|
+
const value = process.env[key]
|
|
86
|
+
if (!value) return undefined
|
|
87
|
+
const parsed = Number(value)
|
|
88
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Dynamic getter for NIKCLI_DISABLE_PROJECT_CONFIG
|
|
93
|
+
Object.defineProperty(Flag, "NIKCLI_DISABLE_PROJECT_CONFIG", {
|
|
94
|
+
get() {
|
|
95
|
+
return truthy("NIKCLI_DISABLE_PROJECT_CONFIG")
|
|
96
|
+
},
|
|
97
|
+
enumerable: true,
|
|
98
|
+
configurable: false,
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
// Dynamic getter for NIKCLI_CONFIG_DIR
|
|
102
|
+
Object.defineProperty(Flag, "NIKCLI_CONFIG_DIR", {
|
|
103
|
+
get() {
|
|
104
|
+
return process.env["NIKCLI_CONFIG_DIR"]
|
|
105
|
+
},
|
|
106
|
+
enumerable: true,
|
|
107
|
+
configurable: false,
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
Object.defineProperty(Flag, "NIKCLI_TUI_CONFIG", {
|
|
111
|
+
get() {
|
|
112
|
+
return process.env["NIKCLI_TUI_CONFIG"]
|
|
113
|
+
},
|
|
114
|
+
enumerable: true,
|
|
115
|
+
configurable: false,
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
Object.defineProperty(Flag, "NIKCLI_GITHUB_OAUTH_CLIENT_ID", {
|
|
119
|
+
get() {
|
|
120
|
+
return (
|
|
121
|
+
process.env["NIKCLI_GITHUB_OAUTH_CLIENT_ID"] ??
|
|
122
|
+
process.env["GITHUB_CLIENT_ID_CONSOLE"] ??
|
|
123
|
+
process.env["GITHUB_CLIENT_ID"]
|
|
124
|
+
)
|
|
125
|
+
},
|
|
126
|
+
enumerable: true,
|
|
127
|
+
configurable: false,
|
|
128
|
+
})
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { readableStreamToText } from "bun"
|
|
2
|
+
import { BunProc } from "../bun"
|
|
3
|
+
import { Instance } from "../project/instance"
|
|
4
|
+
import { Filesystem } from "../util/filesystem"
|
|
5
|
+
import { Flag } from "@/flag/flag"
|
|
6
|
+
|
|
7
|
+
export interface Info {
|
|
8
|
+
name: string
|
|
9
|
+
command: string[]
|
|
10
|
+
environment?: Record<string, string>
|
|
11
|
+
extensions: string[]
|
|
12
|
+
enabled(): Promise<boolean>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const gofmt: Info = {
|
|
16
|
+
name: "gofmt",
|
|
17
|
+
command: ["gofmt", "-w", "$FILE"],
|
|
18
|
+
extensions: [".go"],
|
|
19
|
+
async enabled() {
|
|
20
|
+
return Bun.which("gofmt") !== null
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const mix: Info = {
|
|
25
|
+
name: "mix",
|
|
26
|
+
command: ["mix", "format", "$FILE"],
|
|
27
|
+
extensions: [".ex", ".exs", ".eex", ".heex", ".leex", ".neex", ".sface"],
|
|
28
|
+
async enabled() {
|
|
29
|
+
return Bun.which("mix") !== null
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const prettier: Info = {
|
|
34
|
+
name: "prettier",
|
|
35
|
+
command: [BunProc.which(), "x", "prettier", "--write", "$FILE"],
|
|
36
|
+
environment: {
|
|
37
|
+
BUN_BE_BUN: "1",
|
|
38
|
+
},
|
|
39
|
+
extensions: [
|
|
40
|
+
".js",
|
|
41
|
+
".jsx",
|
|
42
|
+
".mjs",
|
|
43
|
+
".cjs",
|
|
44
|
+
".ts",
|
|
45
|
+
".tsx",
|
|
46
|
+
".mts",
|
|
47
|
+
".cts",
|
|
48
|
+
".html",
|
|
49
|
+
".htm",
|
|
50
|
+
".css",
|
|
51
|
+
".scss",
|
|
52
|
+
".sass",
|
|
53
|
+
".less",
|
|
54
|
+
".vue",
|
|
55
|
+
".svelte",
|
|
56
|
+
".json",
|
|
57
|
+
".jsonc",
|
|
58
|
+
".yaml",
|
|
59
|
+
".yml",
|
|
60
|
+
".toml",
|
|
61
|
+
".xml",
|
|
62
|
+
".md",
|
|
63
|
+
".mdx",
|
|
64
|
+
".graphql",
|
|
65
|
+
".gql",
|
|
66
|
+
],
|
|
67
|
+
async enabled() {
|
|
68
|
+
const items = await Filesystem.findUp("package.json", Instance.directory, Instance.worktree)
|
|
69
|
+
for (const item of items) {
|
|
70
|
+
const json = await Bun.file(item).json()
|
|
71
|
+
if (json.dependencies?.prettier) return true
|
|
72
|
+
if (json.devDependencies?.prettier) return true
|
|
73
|
+
}
|
|
74
|
+
return false
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export const oxfmt: Info = {
|
|
79
|
+
name: "oxfmt",
|
|
80
|
+
command: [BunProc.which(), "x", "oxfmt", "$FILE"],
|
|
81
|
+
environment: {
|
|
82
|
+
BUN_BE_BUN: "1",
|
|
83
|
+
},
|
|
84
|
+
extensions: [".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".mts", ".cts"],
|
|
85
|
+
async enabled() {
|
|
86
|
+
if (!Flag.NIKCLI_EXPERIMENTAL_OXFMT) return false
|
|
87
|
+
const items = await Filesystem.findUp("package.json", Instance.directory, Instance.worktree)
|
|
88
|
+
for (const item of items) {
|
|
89
|
+
const json = await Bun.file(item).json()
|
|
90
|
+
if (json.dependencies?.oxfmt) return true
|
|
91
|
+
if (json.devDependencies?.oxfmt) return true
|
|
92
|
+
}
|
|
93
|
+
return false
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const biome: Info = {
|
|
98
|
+
name: "biome",
|
|
99
|
+
command: [BunProc.which(), "x", "@biomejs/biome", "check", "--write", "$FILE"],
|
|
100
|
+
environment: {
|
|
101
|
+
BUN_BE_BUN: "1",
|
|
102
|
+
},
|
|
103
|
+
extensions: [
|
|
104
|
+
".js",
|
|
105
|
+
".jsx",
|
|
106
|
+
".mjs",
|
|
107
|
+
".cjs",
|
|
108
|
+
".ts",
|
|
109
|
+
".tsx",
|
|
110
|
+
".mts",
|
|
111
|
+
".cts",
|
|
112
|
+
".html",
|
|
113
|
+
".htm",
|
|
114
|
+
".css",
|
|
115
|
+
".scss",
|
|
116
|
+
".sass",
|
|
117
|
+
".less",
|
|
118
|
+
".vue",
|
|
119
|
+
".svelte",
|
|
120
|
+
".json",
|
|
121
|
+
".jsonc",
|
|
122
|
+
".yaml",
|
|
123
|
+
".yml",
|
|
124
|
+
".toml",
|
|
125
|
+
".xml",
|
|
126
|
+
".md",
|
|
127
|
+
".mdx",
|
|
128
|
+
".graphql",
|
|
129
|
+
".gql",
|
|
130
|
+
],
|
|
131
|
+
async enabled() {
|
|
132
|
+
const configs = ["biome.json", "biome.jsonc"]
|
|
133
|
+
for (const config of configs) {
|
|
134
|
+
const found = await Filesystem.findUp(config, Instance.directory, Instance.worktree)
|
|
135
|
+
if (found.length > 0) {
|
|
136
|
+
return true
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return false
|
|
140
|
+
},
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const zig: Info = {
|
|
144
|
+
name: "zig",
|
|
145
|
+
command: ["zig", "fmt", "$FILE"],
|
|
146
|
+
extensions: [".zig", ".zon"],
|
|
147
|
+
async enabled() {
|
|
148
|
+
return Bun.which("zig") !== null
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export const clang: Info = {
|
|
153
|
+
name: "clang-format",
|
|
154
|
+
command: ["clang-format", "-i", "$FILE"],
|
|
155
|
+
extensions: [".c", ".cc", ".cpp", ".cxx", ".c++", ".h", ".hh", ".hpp", ".hxx", ".h++", ".ino", ".C", ".H"],
|
|
156
|
+
async enabled() {
|
|
157
|
+
const items = await Filesystem.findUp(".clang-format", Instance.directory, Instance.worktree)
|
|
158
|
+
return items.length > 0
|
|
159
|
+
},
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export const ktlint: Info = {
|
|
163
|
+
name: "ktlint",
|
|
164
|
+
command: ["ktlint", "-F", "$FILE"],
|
|
165
|
+
extensions: [".kt", ".kts"],
|
|
166
|
+
async enabled() {
|
|
167
|
+
return Bun.which("ktlint") !== null
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export const ruff: Info = {
|
|
172
|
+
name: "ruff",
|
|
173
|
+
command: ["ruff", "format", "$FILE"],
|
|
174
|
+
extensions: [".py", ".pyi"],
|
|
175
|
+
async enabled() {
|
|
176
|
+
if (!Bun.which("ruff")) return false
|
|
177
|
+
const configs = ["pyproject.toml", "ruff.toml", ".ruff.toml"]
|
|
178
|
+
for (const config of configs) {
|
|
179
|
+
const found = await Filesystem.findUp(config, Instance.directory, Instance.worktree)
|
|
180
|
+
if (found.length > 0) {
|
|
181
|
+
if (config === "pyproject.toml") {
|
|
182
|
+
const content = await Bun.file(found[0]).text()
|
|
183
|
+
if (content.includes("[tool.ruff]")) return true
|
|
184
|
+
} else {
|
|
185
|
+
return true
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const deps = ["requirements.txt", "pyproject.toml", "Pipfile"]
|
|
190
|
+
for (const dep of deps) {
|
|
191
|
+
const found = await Filesystem.findUp(dep, Instance.directory, Instance.worktree)
|
|
192
|
+
if (found.length > 0) {
|
|
193
|
+
const content = await Bun.file(found[0]).text()
|
|
194
|
+
if (content.includes("ruff")) return true
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return false
|
|
198
|
+
},
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export const rlang: Info = {
|
|
202
|
+
name: "air",
|
|
203
|
+
command: ["air", "format", "$FILE"],
|
|
204
|
+
extensions: [".R"],
|
|
205
|
+
async enabled() {
|
|
206
|
+
const airPath = Bun.which("air")
|
|
207
|
+
if (airPath == null) return false
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
const proc = Bun.spawn(["air", "--help"], {
|
|
211
|
+
stdout: "pipe",
|
|
212
|
+
stderr: "pipe",
|
|
213
|
+
})
|
|
214
|
+
await proc.exited
|
|
215
|
+
const output = await readableStreamToText(proc.stdout)
|
|
216
|
+
|
|
217
|
+
const firstLine = output.split("\n")[0]
|
|
218
|
+
const hasR = firstLine.includes("R language")
|
|
219
|
+
const hasFormatter = firstLine.includes("formatter")
|
|
220
|
+
return hasR && hasFormatter
|
|
221
|
+
} catch (error) {
|
|
222
|
+
return false
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export const uvformat: Info = {
|
|
228
|
+
name: "uv",
|
|
229
|
+
command: ["uv", "format", "--", "$FILE"],
|
|
230
|
+
extensions: [".py", ".pyi"],
|
|
231
|
+
async enabled() {
|
|
232
|
+
if (await ruff.enabled()) return false
|
|
233
|
+
if (Bun.which("uv") !== null) {
|
|
234
|
+
const proc = Bun.spawn(["uv", "format", "--help"], { stderr: "pipe", stdout: "pipe" })
|
|
235
|
+
const code = await proc.exited
|
|
236
|
+
return code === 0
|
|
237
|
+
}
|
|
238
|
+
return false
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export const rubocop: Info = {
|
|
243
|
+
name: "rubocop",
|
|
244
|
+
command: ["rubocop", "--autocorrect", "$FILE"],
|
|
245
|
+
extensions: [".rb", ".rake", ".gemspec", ".ru"],
|
|
246
|
+
async enabled() {
|
|
247
|
+
return Bun.which("rubocop") !== null
|
|
248
|
+
},
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export const standardrb: Info = {
|
|
252
|
+
name: "standardrb",
|
|
253
|
+
command: ["standardrb", "--fix", "$FILE"],
|
|
254
|
+
extensions: [".rb", ".rake", ".gemspec", ".ru"],
|
|
255
|
+
async enabled() {
|
|
256
|
+
return Bun.which("standardrb") !== null
|
|
257
|
+
},
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export const htmlbeautifier: Info = {
|
|
261
|
+
name: "htmlbeautifier",
|
|
262
|
+
command: ["htmlbeautifier", "$FILE"],
|
|
263
|
+
extensions: [".erb", ".html.erb"],
|
|
264
|
+
async enabled() {
|
|
265
|
+
return Bun.which("htmlbeautifier") !== null
|
|
266
|
+
},
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export const dart: Info = {
|
|
270
|
+
name: "dart",
|
|
271
|
+
command: ["dart", "format", "$FILE"],
|
|
272
|
+
extensions: [".dart"],
|
|
273
|
+
async enabled() {
|
|
274
|
+
return Bun.which("dart") !== null
|
|
275
|
+
},
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export const ocamlformat: Info = {
|
|
279
|
+
name: "ocamlformat",
|
|
280
|
+
command: ["ocamlformat", "-i", "$FILE"],
|
|
281
|
+
extensions: [".ml", ".mli"],
|
|
282
|
+
async enabled() {
|
|
283
|
+
if (!Bun.which("ocamlformat")) return false
|
|
284
|
+
const items = await Filesystem.findUp(".ocamlformat", Instance.directory, Instance.worktree)
|
|
285
|
+
return items.length > 0
|
|
286
|
+
},
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export const terraform: Info = {
|
|
290
|
+
name: "terraform",
|
|
291
|
+
command: ["terraform", "fmt", "$FILE"],
|
|
292
|
+
extensions: [".tf", ".tfvars"],
|
|
293
|
+
async enabled() {
|
|
294
|
+
return Bun.which("terraform") !== null
|
|
295
|
+
},
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export const latexindent: Info = {
|
|
299
|
+
name: "latexindent",
|
|
300
|
+
command: ["latexindent", "-w", "-s", "$FILE"],
|
|
301
|
+
extensions: [".tex"],
|
|
302
|
+
async enabled() {
|
|
303
|
+
return Bun.which("latexindent") !== null
|
|
304
|
+
},
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export const gleam: Info = {
|
|
308
|
+
name: "gleam",
|
|
309
|
+
command: ["gleam", "format", "$FILE"],
|
|
310
|
+
extensions: [".gleam"],
|
|
311
|
+
async enabled() {
|
|
312
|
+
return Bun.which("gleam") !== null
|
|
313
|
+
},
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export const shfmt: Info = {
|
|
317
|
+
name: "shfmt",
|
|
318
|
+
command: ["shfmt", "-w", "$FILE"],
|
|
319
|
+
extensions: [".sh", ".bash"],
|
|
320
|
+
async enabled() {
|
|
321
|
+
return Bun.which("shfmt") !== null
|
|
322
|
+
},
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export const nixfmt: Info = {
|
|
326
|
+
name: "nixfmt",
|
|
327
|
+
command: ["nixfmt", "$FILE"],
|
|
328
|
+
extensions: [".nix"],
|
|
329
|
+
async enabled() {
|
|
330
|
+
return Bun.which("nixfmt") !== null
|
|
331
|
+
},
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export const rustfmt: Info = {
|
|
335
|
+
name: "rustfmt",
|
|
336
|
+
command: ["rustfmt", "$FILE"],
|
|
337
|
+
extensions: [".rs"],
|
|
338
|
+
async enabled() {
|
|
339
|
+
return Bun.which("rustfmt") !== null
|
|
340
|
+
},
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export const pint: Info = {
|
|
344
|
+
name: "pint",
|
|
345
|
+
command: ["./vendor/bin/pint", "$FILE"],
|
|
346
|
+
extensions: [".php"],
|
|
347
|
+
async enabled() {
|
|
348
|
+
const items = await Filesystem.findUp("composer.json", Instance.directory, Instance.worktree)
|
|
349
|
+
for (const item of items) {
|
|
350
|
+
const json = await Bun.file(item).json()
|
|
351
|
+
if (json.require?.["laravel/pint"]) return true
|
|
352
|
+
if (json["require-dev"]?.["laravel/pint"]) return true
|
|
353
|
+
}
|
|
354
|
+
return false
|
|
355
|
+
},
|
|
356
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Bus } from "../bus"
|
|
2
|
+
import { File } from "../file"
|
|
3
|
+
import { Log } from "../util/log"
|
|
4
|
+
import path from "path"
|
|
5
|
+
import z from "zod"
|
|
6
|
+
|
|
7
|
+
import * as Formatter from "./formatter"
|
|
8
|
+
import { Config } from "../config/config"
|
|
9
|
+
import { mergeDeep } from "remeda"
|
|
10
|
+
import { Instance } from "../project/instance"
|
|
11
|
+
|
|
12
|
+
export namespace Format {
|
|
13
|
+
const log = Log.create({ service: "format" })
|
|
14
|
+
|
|
15
|
+
export const Status = z
|
|
16
|
+
.object({
|
|
17
|
+
name: z.string(),
|
|
18
|
+
extensions: z.string().array(),
|
|
19
|
+
enabled: z.boolean(),
|
|
20
|
+
})
|
|
21
|
+
.meta({
|
|
22
|
+
ref: "FormatterStatus",
|
|
23
|
+
})
|
|
24
|
+
export type Status = z.infer<typeof Status>
|
|
25
|
+
|
|
26
|
+
const state = Instance.state(async () => {
|
|
27
|
+
const enabled: Record<string, boolean> = {}
|
|
28
|
+
const cfg = await Config.get()
|
|
29
|
+
|
|
30
|
+
const formatters: Record<string, Formatter.Info> = {}
|
|
31
|
+
if (cfg.formatter === false) {
|
|
32
|
+
log.info("all formatters are disabled")
|
|
33
|
+
return {
|
|
34
|
+
enabled,
|
|
35
|
+
formatters,
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for (const item of Object.values(Formatter)) {
|
|
40
|
+
formatters[item.name] = item
|
|
41
|
+
}
|
|
42
|
+
for (const [name, item] of Object.entries(cfg.formatter ?? {})) {
|
|
43
|
+
if (item.disabled) {
|
|
44
|
+
delete formatters[name]
|
|
45
|
+
continue
|
|
46
|
+
}
|
|
47
|
+
const result: Formatter.Info = mergeDeep(formatters[name] ?? {}, {
|
|
48
|
+
command: [],
|
|
49
|
+
extensions: [],
|
|
50
|
+
...item,
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
if (result.command.length === 0) continue
|
|
54
|
+
|
|
55
|
+
result.enabled = async () => true
|
|
56
|
+
result.name = name
|
|
57
|
+
formatters[name] = result
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
enabled,
|
|
62
|
+
formatters,
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
async function isEnabled(item: Formatter.Info) {
|
|
67
|
+
const s = await state()
|
|
68
|
+
let status = s.enabled[item.name]
|
|
69
|
+
if (status === undefined) {
|
|
70
|
+
status = await item.enabled()
|
|
71
|
+
s.enabled[item.name] = status
|
|
72
|
+
}
|
|
73
|
+
return status
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function getFormatter(ext: string) {
|
|
77
|
+
const formatters = await state().then((x) => x.formatters)
|
|
78
|
+
const result = []
|
|
79
|
+
for (const item of Object.values(formatters)) {
|
|
80
|
+
log.info("checking", { name: item.name, ext })
|
|
81
|
+
if (!item.extensions.includes(ext)) continue
|
|
82
|
+
if (!(await isEnabled(item))) continue
|
|
83
|
+
log.info("enabled", { name: item.name, ext })
|
|
84
|
+
result.push(item)
|
|
85
|
+
}
|
|
86
|
+
return result
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function status() {
|
|
90
|
+
const s = await state()
|
|
91
|
+
const result: Status[] = []
|
|
92
|
+
for (const formatter of Object.values(s.formatters)) {
|
|
93
|
+
const enabled = await isEnabled(formatter)
|
|
94
|
+
result.push({
|
|
95
|
+
name: formatter.name,
|
|
96
|
+
extensions: formatter.extensions,
|
|
97
|
+
enabled,
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
return result
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function init() {
|
|
104
|
+
log.info("init")
|
|
105
|
+
Bus.subscribe(File.Event.Edited, async (payload) => {
|
|
106
|
+
const file = payload.properties.file
|
|
107
|
+
log.info("formatting", { file })
|
|
108
|
+
const ext = path.extname(file)
|
|
109
|
+
|
|
110
|
+
for (const item of await getFormatter(ext)) {
|
|
111
|
+
log.info("running", { command: item.command })
|
|
112
|
+
try {
|
|
113
|
+
const proc = Bun.spawn({
|
|
114
|
+
cmd: item.command.map((x) => x.replace("$FILE", file)),
|
|
115
|
+
cwd: Instance.directory,
|
|
116
|
+
env: { ...process.env, ...item.environment },
|
|
117
|
+
stdout: "ignore",
|
|
118
|
+
stderr: "ignore",
|
|
119
|
+
})
|
|
120
|
+
const exit = await proc.exited
|
|
121
|
+
if (exit !== 0)
|
|
122
|
+
log.error("failed", {
|
|
123
|
+
command: item.command,
|
|
124
|
+
...item.environment,
|
|
125
|
+
})
|
|
126
|
+
} catch (error) {
|
|
127
|
+
log.error("failed to format file", {
|
|
128
|
+
error,
|
|
129
|
+
command: item.command,
|
|
130
|
+
...item.environment,
|
|
131
|
+
file,
|
|
132
|
+
})
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from "fs/promises"
|
|
2
|
+
import { xdgData, xdgCache, xdgConfig, xdgState } from "xdg-basedir"
|
|
3
|
+
import path from "path"
|
|
4
|
+
import os from "os"
|
|
5
|
+
|
|
6
|
+
const app = "nikcli"
|
|
7
|
+
|
|
8
|
+
const data = path.join(xdgData!, app)
|
|
9
|
+
const cache = path.join(xdgCache!, app)
|
|
10
|
+
const config = path.join(xdgConfig!, app)
|
|
11
|
+
const state = path.join(xdgState!, app)
|
|
12
|
+
|
|
13
|
+
export namespace Global {
|
|
14
|
+
export const Path = {
|
|
15
|
+
get home() {
|
|
16
|
+
return process.env.NIKCLI_TEST_HOME || os.homedir()
|
|
17
|
+
},
|
|
18
|
+
data,
|
|
19
|
+
bin: path.join(data, "bin"),
|
|
20
|
+
log: path.join(data, "log"),
|
|
21
|
+
cache,
|
|
22
|
+
config,
|
|
23
|
+
state,
|
|
24
|
+
get modelsDevUrl() {
|
|
25
|
+
return process.env.NIKCLI_MODELS_URL || "https://models.dev"
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
await Promise.all([
|
|
31
|
+
fs.mkdir(Global.Path.data, { recursive: true }),
|
|
32
|
+
fs.mkdir(Global.Path.config, { recursive: true }),
|
|
33
|
+
fs.mkdir(Global.Path.state, { recursive: true }),
|
|
34
|
+
fs.mkdir(Global.Path.log, { recursive: true }),
|
|
35
|
+
fs.mkdir(Global.Path.bin, { recursive: true }),
|
|
36
|
+
])
|
|
37
|
+
|
|
38
|
+
const CACHE_VERSION = "18"
|
|
39
|
+
|
|
40
|
+
const version = await Bun.file(path.join(Global.Path.cache, "version"))
|
|
41
|
+
.text()
|
|
42
|
+
.catch(() => "0")
|
|
43
|
+
|
|
44
|
+
if (version !== CACHE_VERSION) {
|
|
45
|
+
try {
|
|
46
|
+
const contents = await fs.readdir(Global.Path.cache)
|
|
47
|
+
await Promise.all(
|
|
48
|
+
contents.map((item) =>
|
|
49
|
+
fs.rm(path.join(Global.Path.cache, item), {
|
|
50
|
+
recursive: true,
|
|
51
|
+
force: true,
|
|
52
|
+
}),
|
|
53
|
+
),
|
|
54
|
+
)
|
|
55
|
+
} catch (e) {}
|
|
56
|
+
await Bun.file(path.join(Global.Path.cache, "version")).write(CACHE_VERSION)
|
|
57
|
+
}
|