본문으로 건너뛰기
cccskills
무료GitHub에 공개

connection-import-wasm

Implement and debug onetcli connection importers packaged as WebAssembly components. The skill covers parsing application settings, manifests and packaging, host integration, local visibility, password handling, and import preview issues.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Use when implementing, debugging, packaging, or host-enabling onetcli WASM connection importers such as DBeaver, Navicat, Navicat Lite, Termius, connection-import.wit components, wasm32-wasip2 importers, composite extension manifests, local importer visibility, or connection import UI freezes.

feigeCode/navop스타 1,941(GitHub 1,941 + cccskills 0)

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • Adding an importer for a database application
  • Debugging a WASM importer that is not listed
  • Packaging and installing a composite extension
  • Investigating frozen connection import previews
  • Checking safe handling of imported passwords

포함된 파일(8)

  • SKILL.md10.6 KB
  • agents/openai.yaml208 B
  • references/database-importers.md3.3 KB
  • references/manifest-and-packaging.md3.3 KB
  • references/new-application-playbook.md6.3 KB
  • references/protocol-and-records.md4.0 KB
  • references/source-discovery.md3.3 KB
  • references/testing-and-troubleshooting.md3.6 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Connection Import WASM

Overview

Build one connection importer as one WASM component. Keep parser logic in the extension repo, keep host capabilities generic in ../onetcli, and verify the whole path from WIT contract to local composite extension visibility.

Use DBeaver as the reference implementation, but avoid baking DBeaver-specific assumptions into the host.

Reference Library

When developing an importer for a new application, read the playbook first, then load the topic references needed by the app's storage format and output kind:

NeedReference
End-to-end workflow for a new applicationNew Application Playbook
Finding app config files across macOS, Windows, and LinuxSource Discovery
Mapping parser output to host protocol JSONProtocol and Records
Writing extension.json, root manifest entries, and local installsManifest and Packaging
Fixtures, tests, local host checks, and release verificationTesting and Troubleshooting
Database importer patterns such as DBeaver and Navicat LiteDatabase Importers
SSH importer patterns such as OpenSSH config and known_hostsssh-connection-import

Repo Map

AreaPath
Extension workspaceonetcli-extensions
Importer cratesextensions/wasm/<tool>-importer
Shared extension WITwit/connection-import.wit
Marketplace entrymanifest.json with "kind": "composite"
Composite packagingscripts/package-composite-extension.sh, scripts/verify-composite-package.sh, scripts/release-driver.mjs
Host repo../onetcli
Host WITcrates/extension-api/wit/connection-import.wit
Host WASM runtimecrates/extension-wasm/src/connection_import.rs
Host manifest/providercrates/extension-runtime/src/connection_import_provider.rs, crates/extension-runtime/src/extension/composite_provider.rs
Import UImain/src/home/connection_import_*

Implementation Workflow

  1. Implement one tool per WASM component. Prefer extensions/wasm/<tool>-importer, with src/component.rs for WIT bindings and src/<tool>.rs for parser logic.
  2. Keep connection-import.wit vendored in this repo under wit/. Do not make extension crates import the host repo WIT directly. Add or keep drift checks against ../onetcli when the host repo is present.
  3. Generate bindings from ../../../wit in each importer crate:
wit_bindgen::generate!({
    path: "../../../wit",
    world: "connection-importer",
});
  1. Export descriptor, scan, and preview. Return JSON matching connection-import-protocol. Use structured parsers such as serde_json, plist, or product-specific parsers; avoid ad hoc string slicing for config formats.
  2. Gate secrets strictly. If ImportOptions.include_passwords is false, never return plaintext passwords even when they exist in config files.
  3. Declare candidates and permissions in extension.json. Include all product paths per platform, for example macOS ~/... and Windows %APPDATA%/....
  4. Register the importer in root manifest.json as a composite extension. Composite importers install under ~/.config/one-hub/extensions/composite/<extension-id>.
  5. Package and install locally before host debugging. The installed folder must contain extension.json and wasm/<module>.wasm.

Host Capability Checklist

When an importer fails in the host, fix the host generically:

  • WASI Preview2: crates/extension-wasm/src/connection_import.rs must add wasmtime_wasi::p2::add_to_linker_async, store WasiCtx, and implement WasiView with a ResourceTable. A wasm32-wasip2 component commonly imports wasi:io/poll@0.2.6.
  • Manifest permissions: %APPDATA%/... and ~/... file permissions must validate in extension/manifest/security_rules.rs.
  • Candidate path expansion: connection_import_provider.rs must expand ~/ and %VAR%/... before reading files.
  • Local visibility: CompositeExtensionProvider uses load_and_check; host version checks must use the app version, not the extension-runtime crate version.
  • UI responsiveness: never call futures::executor::block_on from GPUI import actions/dialogs. Open the preview dialog in a loading state and run preview work through one_core::gpui_tokio::Tokio.
  • Feature wiring: main must enable extension-runtime with features = ["wasm-components"], including --no-default-features builds when the app should still expose WASM importers.

Manifest Pattern

Use a composite manifest shape like this:

{
  "schema_version": 1,
  "id": "com.onetcli.importer.<tool>",
  "name": "<Tool> Importer",
  "version": "0.1.0",
  "engines": { "onetcli": ">=0.7.0" },
  "runtime": {
    "wasm": [{
      "id": "<tool>-importer",
      "module": "wasm/<tool>_importer_wasm.wasm",
      "kind": "component"
    }]
  },
  "permissions": [
    "fs:read:~/Library/...",
    "fs:read:%APPDATA%/..."
  ],
  "contributes": {
    "connectionImporters": [{
      "id": "<tool>",
      "runtimeId": "<tool>-importer",
      "displayName": "<Tool>",
      "outputKinds": ["database"],
      "platforms": ["macos", "windows"],
      "candidateFiles": [{
        "id": "<tool>-macos-config",
        "platform": "macos",
        "path": "~/Library/..."
      }]
    }]
  }
}

Database Importer Notes

For database tools, fixtures from one product edition are not enough. Check every edition and platform path the importer claims in extension.json.

Navicat-specific rules:

  • Premium Lite stores shared connection data at macOS ~/Library/Application Support/PremiumSoft CyberTech/Navicat CC/Common/conn.plist.
  • The Windows analogue is expected under %APPDATA%/PremiumSoft CyberTech/Navicat CC/Common/conn.plist; declare it separately from the classic Navicat paths.
  • Navicat plist files may be XML or binary. Use plist::Value::from_reader(Cursor::new(bytes)) when binary support matters, not XML-only parsing.
  • Lite records may use lowercase fields such as host, port, username, and defaultdatabase.
  • serviceprovider = Default is not a database type. Infer the database type from stable path/key segments such as MySQL, PostgreSQL, Oracle, or SQL Server-specific containers.
  • Skip nested parameter dictionaries that are not database connections, including ssh_param, http_param, ssl_param, and compatibility_param.

Add focused fixtures for each schema variant. At minimum, cover classic Navicat entries and Lite conn.plist entries with lowercase fields and path-derived database types.

For SSH-focused importers, use ssh-connection-import. Keep this skill for shared WASM packaging, manifests, host capability, and database importer behavior.

Testing

Extension repo:

rtk cargo test -p <tool>_importer_wasm
rtk cargo fmt --all --check
rtk cargo build --release -p <tool>_importer_wasm --target wasm32-wasip2
rtk node --test tests/scripts.test.mjs
rtk node scripts/release-driver.mjs <tool>-importer 0.1.0 --target universal --artifact-dir artifacts

Host repo:

rtk cargo test -p extension-wasm
rtk cargo test -p extension-runtime connection_import
rtk cargo test -p extension-runtime composite_provider_lists_connection_importer_with_windows_env_permission
rtk cargo check -p main
rtk cargo check -p main --no-default-features
rtk cargo build -p main

Add focused tests for every host ability that was missing. Useful examples include:

  • A real or fixture wasm32-wasip2 component that reproduces wasi:io/poll@0.2.6 linker failures.
  • A manifest with %APPDATA%/... permissions and candidate files.
  • A provider/listing test proving the local composite importer appears in Installed extensions.
  • A preview-provider test that runs DBeaver/Termius fixture components.
  • A parser fixture for every product edition/path variant declared in the manifest.
  • A serialized JSON assertion for any field backed by a host serde enum or externally tagged protocol shape.

Troubleshooting

SymptomLikely causeFix
component imports instance wasi:io/poll@0.2.6Connection-import runtime lacks WASI Preview2 linkerAdd wasmtime_wasi::p2::add_to_linker_async plus WasiView state.
Local importer not visibleManifest rejected by permissions or host version checkValidate %APPDATA% fs permissions and ensure app version is used for engines.onetcli.
Preview dialog freezesUI thread is running WASM/filesystem workReplace block_on with Tokio::spawn and loading-state entity updates.
Records import passwords when disabledParser ignores include_passwordsEnsure parser omits config and credential passwords unless enabled.
Component returns zero recordsCandidate id, permission, or path mismatchCheck candidateFiles, fs:read:*, platform filtering, and host path expansion.
Navicat Lite returns zero recordsLite path/schema differs from classic NavicatAdd Navicat CC/Common/conn.plist, lowercase field handling, path-derived database type inference, and plist binary/XML parsing.
Source is visible but preview has no rowsAvailability only proves manifest/candidate visibilityCheck host logs for file read, WASM output, and connection import preview failed decode errors.
unknown variant kind during previewImporter emitted an internally tagged enum shape rejected by connection-import-protocolMatch the host serde JSON shape exactly; for SSH auth use ssh-connection-import.

Guardrails

  • Do not combine DBeaver, Navicat, and Termius into one component unless the product explicitly shares storage and parsing semantics. Independent tools should remain separate WASM importers.
  • Do not special-case product ids in the host. Add generic manifest, permission, WIT, or runtime capability support.
  • Do not let the extension repo depend on ../onetcli at build time. Use vendored WIT and drift verification.
  • Do not claim local installation works until the installed composite folder is present and the host provider can list it.
  • Do not leave long-running dev app processes active after build/test work unless the user asked to run the app.
  • Do not trust display labels such as Default as database types when the product stores type information in surrounding keys or path segments.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

gpui

무료

Use this skill while building or maintaining GPUI applications. It provides focused references for framework APIs and patterns, including keybindings, async tasks, state, events, layout, focus, custom elements, and tests.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Finding the right GPUI API for a feature
  • Implementing keyboard actions and focus navigation
  • Managing entities, events, or global state
feigeCode/navop1.9천2026년 10월 26일 업데이트

Build GPUI interfaces with gpui-component by choosing suitable controls, handling component state and themes, and following its design and coding guides. The references also cover layout, interaction states, interface copy, and application structure.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Choosing a component for a UI need
  • Setting up gpui-component in a GPUI app
  • Handling component state and theming
feigeCode/navop1.9천2026년 10월 26일 업데이트

Design, implement, review, or debug onetcli IPC database drivers. Work from the `driver.json` manifest and JSON-RPC protocol contract through schema metadata, SQL-building methods, import and export, tests, and packaging, with guidance that applies across implementation languages.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Creating or reviewing an onetcli IPC database driver
  • Defining driver.json methods and capabilities
  • Implementing schema metadata and DDL builders
feigeCode/navop1.9천2026년 10월 26일 업데이트

navop

무료

Use the Navop CLI to discover and operate resources exposed by a running Navop desktop app. The skill checks live tools, permissions, and schemas before commands, then follows Navop’s approval decisions for operations.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Checking which Navop tools are currently available
  • Inspecting a tool’s live schema before using it
  • Running a supported read or write operation
feigeCode/navop1.9천2026년 10월 26일 업데이트

Prepare and review bilingual Chinese and English release notes for Navop. Maintain `CHANGELOG.md` as the source of truth, then check that tagged entries provide consistent content for GitHub Releases and the R2 updater manifest when a release is published or synchronized.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Drafting bilingual notes for a Navop version
  • Reviewing a CHANGELOG.md release entry
  • Checking release notes before creating a version tag
feigeCode/navop1.9천2026년 10월 26일 업데이트

Create GPUI UI components that follow the project’s existing implementation and Shadcn UI styling patterns. Choose a stateless or stateful design, keep the component API consistent with other elements, and add documentation and stories for the new component.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Building a new GPUI UI element
  • Choosing whether a component needs internal state
  • Matching an existing component API and style
feigeCode/navop1.9천2026년 10월 26일 업데이트

feigeCode의 스킬 모두 보기

이 스킬의 문제 신고