diff --git a/.github/workflows/ci-site.yml b/.github/workflows/ci-site.yml new file mode 100644 index 0000000..032da33 --- /dev/null +++ b/.github/workflows/ci-site.yml @@ -0,0 +1,86 @@ +name: CI Site + +on: + pull_request: + paths: + - "site/**" + - ".github/workflows/ci-site.yml" + push: + branches: [main, develop] + paths: + - "site/**" + - ".github/workflows/ci-site.yml" + +permissions: + contents: read + +jobs: + build: + name: Build site + runs-on: ubuntu-latest + defaults: + run: + working-directory: site + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: npm + cache-dependency-path: site/package-lock.json + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + # The site must never regress to the pre-audit claims or dev-grade + # tooling. Fails the build if a forbidden string appears in the output. + # CSS is included on purpose — a CDN font/@import regression would land + # there, not in HTML/JS. \b guards keep Rollup's base64 chunk hashes + # from false-positiving. + - name: Check for forbidden claims + run: | + FORBIDDEN='v0\.5|200\+ languages|21 MB|fsnotify|unpkg\.com|\bbabel\b' + if grep -rniE "$FORBIDDEN" dist/ --include='*.html' --include='*.js' --include='*.css'; then + echo "::error::Forbidden string found in built site (stale claim or dev-grade dependency)" + exit 1 + fi + echo "OK: no forbidden strings in dist/" + + # The site must never advertise a stale OR fake version: the plugin + # version must match plugin.json in this repo, and the server/CLI + # versions must equal the NEWEST release tags — not merely exist. + # "Exists" was the original rule and it was too weak: after + # server/v0.12.3 shipped, a versions.js still saying 0.12.2 passed + # (0.12.2 is a real tag) and the deployed site kept advertising the + # old release. Comparing against the newest tag closes that drift. + - name: Check version consistency + run: | + # Anchor on the full `export const =` declaration: an + # unanchored grep for PLUGIN_VERSION also matches the + # COWORK_PLUGIN_VERSION line, which made $PLUGIN two-valued and + # the comparison below fail unconditionally. + v() { grep -oE "^export const $1 = '[^']+'" src/shared/versions.js | cut -d"'" -f2; } + SERVER=$(v SERVER_VERSION); CLI=$(v CLI_VERSION); PLUGIN=$(v PLUGIN_VERSION) + PLUGIN_JSON=$(node -p "require('../plugins/cix/.claude-plugin/plugin.json').version") + TAGS=$(git ls-remote --tags origin) + # Newest semver tag per release stream. The trailing `$` anchor skips + # the `^{}` peeled refs that annotated tags add to ls-remote output. + newest() { echo "$TAGS" | grep -oE "refs/tags/$1/v[0-9]+\.[0-9]+\.[0-9]+$" | sed "s#refs/tags/$1/v##" | sort -V | tail -n1; } + NEWEST_SERVER=$(newest server); NEWEST_CLI=$(newest cli) + echo "site: server=$SERVER cli=$CLI plugin=$PLUGIN" + echo "repo: server=$NEWEST_SERVER cli=$NEWEST_CLI plugin.json=$PLUGIN_JSON" + FAIL=0 + if [ "$PLUGIN" != "$PLUGIN_JSON" ]; then + echo "::error::versions.js PLUGIN_VERSION ($PLUGIN) != plugins/cix plugin.json ($PLUGIN_JSON)"; FAIL=1 + fi + if [ "$SERVER" != "$NEWEST_SERVER" ]; then + echo "::error::versions.js SERVER_VERSION ($SERVER) != newest release server/v$NEWEST_SERVER — bump it so the site stops advertising a stale version"; FAIL=1 + fi + if [ "$CLI" != "$NEWEST_CLI" ]; then + echo "::error::versions.js CLI_VERSION ($CLI) != newest release cli/v$NEWEST_CLI — bump it so the site stops advertising a stale version"; FAIL=1 + fi + exit $FAIL diff --git a/.github/workflows/prerelease-cli.yml b/.github/workflows/prerelease-cli.yml index 1f6e416..ec55943 100644 --- a/.github/workflows/prerelease-cli.yml +++ b/.github/workflows/prerelease-cli.yml @@ -110,7 +110,7 @@ jobs: --repo "${{ github.repository }}" || true - name: Create develop release - uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1 + uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 with: tag_name: cli/develop target_commitish: develop diff --git a/.github/workflows/prerelease-server.yml b/.github/workflows/prerelease-server.yml index e66cb94..cf66f1e 100644 --- a/.github/workflows/prerelease-server.yml +++ b/.github/workflows/prerelease-server.yml @@ -36,7 +36,7 @@ jobs: run: server/scripts/check-llama-pin.sh server/Dockerfile.cuda - name: Login to Docker Hub - uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0 + uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index 4a48f38..474e9e0 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -97,7 +97,7 @@ jobs: run: echo "version=${GITHUB_REF_NAME#cli/}" >> "$GITHUB_OUTPUT" - name: Create GitHub release - uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1 + uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 with: name: "CLI ${{ steps.ver.outputs.version }}" files: | diff --git a/.github/workflows/release-server.yml b/.github/workflows/release-server.yml index a848eac..b4150db 100644 --- a/.github/workflows/release-server.yml +++ b/.github/workflows/release-server.yml @@ -69,7 +69,7 @@ jobs: uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 - name: Login to Docker Hub - uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0 + uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -134,7 +134,7 @@ jobs: run: server/scripts/check-llama-pin.sh server/Dockerfile.cuda - name: Login to Docker Hub - uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4.3.0 + uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -192,7 +192,7 @@ jobs: run: echo "version=${GITHUB_REF_NAME#server/}" >> "$GITHUB_OUTPUT" - name: Create GitHub release - uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1 + uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2 with: name: "Server ${{ steps.ver.outputs.version }}" generate_release_notes: true diff --git a/.gitignore b/.gitignore index 94f02a6..8fa5f15 100644 --- a/.gitignore +++ b/.gitignore @@ -47,7 +47,13 @@ cli/dist/ # Server build artifacts + runtime logs server/dist/ server/exec.log +# Root scratch dir only — anchored: a bare "tmp" would silently ignore any +# nested file/dir named tmp (same pitfall as the docs/ pattern below). +/tmp/ +# Marketing site (site/) build artifacts +site/node_modules/ +site/dist/ # Dashboard build output — produced by `make dashboard-build`. # A committed `.gitkeep` keeps dist/ non-empty so `//go:embed all:dist` works # on a fresh clone (the embed.FS needs at least one entry). The real @@ -62,11 +68,10 @@ server/internal/httpapi/dashboard/dist/* .python-version # Local docs (top-level docs/ is a notebook directory per CLAUDE.md; -# tracked project documentation lives in doc/). Exception below for the +# tracked project documentation lives in doc/). Anchored to the repo root — +# a bare "docs/" would also swallow nested dirs like site/docs/ and the # embedded Swagger UI bundle inside the Go server package. -docs/ -!server/internal/httpapi/docs/ -!server/internal/httpapi/docs/** +/docs/ # Claude Code .claude/ diff --git a/CITATION.cff b/CITATION.cff index edae24c..296b0ce 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,10 +1,11 @@ cff-version: 1.2.0 -title: "cix — Semantic Code Index" +title: "cix — CodeIndeX (semantic code index)" message: "If you use this software, please cite it as below." type: software authors: - alias: dvcdsys repository-code: "https://github.com/dvcdsys/code-index" +url: "https://codeindex.app" license: MIT keywords: - code-search diff --git a/README.md b/README.md index 7936c5f..b5ae26b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ ██║ ██║ ╚███╔╝ ██║ ██║ ██╔██╗ ╚██████╗██║██╔╝ ██╗ - ╚═════╝╚═╝╚═╝ ╚═╝ Code IndeX + ╚═════╝╚═╝╚═╝ ╚═╝ CodeIndeX ``` [![Release: Server](https://github.com/dvcdsys/code-index/actions/workflows/release-server.yml/badge.svg)](https://github.com/dvcdsys/code-index/actions/workflows/release-server.yml) @@ -17,7 +17,7 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker Hub](https://img.shields.io/docker/pulls/dvcdsys/code-index)](https://hub.docker.com/r/dvcdsys/code-index) -Search your codebase by meaning, not just text. Self-hosted, embeddings-based, works with any agent or terminal — with a full web dashboard and multi-repo workspace search. +**cix — CodeIndeX.** Search your codebase by meaning, not just text. Self-hosted, embeddings-based, works with any agent or terminal — with a full web dashboard and multi-repo workspace search. Website: [codeindex.app](https://codeindex.app) ```bash cix search "authentication middleware" diff --git a/cli/README.md b/cli/README.md index cb60fb7..51ff44c 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,4 +1,4 @@ -# `cix` — Code IndeX CLI +# `cix` — CodeIndeX CLI A thin Go client for the `cix-server` semantic code index. Runs `init`, `search`, `symbols`, `def`, `refs`, `files`, `summary`, `watch`, diff --git a/server/dashboard/package-lock.json b/server/dashboard/package-lock.json index 55d6fe4..f931afc 100644 --- a/server/dashboard/package-lock.json +++ b/server/dashboard/package-lock.json @@ -8,17 +8,17 @@ "name": "cix-dashboard", "version": "0.1.0", "dependencies": { - "@radix-ui/react-dialog": "^1.1.18", - "@radix-ui/react-dropdown-menu": "^2.1.19", + "@radix-ui/react-dialog": "^1.1.19", + "@radix-ui/react-dropdown-menu": "^2.1.20", "@radix-ui/react-label": "^2.1.11", - "@radix-ui/react-radio-group": "^1.4.2", - "@radix-ui/react-scroll-area": "^1.2.13", - "@radix-ui/react-select": "^2.3.2", - "@radix-ui/react-slider": "^1.4.2", + "@radix-ui/react-radio-group": "^1.4.3", + "@radix-ui/react-scroll-area": "^1.2.14", + "@radix-ui/react-select": "^2.3.3", + "@radix-ui/react-slider": "^1.4.3", "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.3.2", - "@radix-ui/react-tabs": "^1.1.16", - "@radix-ui/react-tooltip": "^1.2.11", + "@radix-ui/react-switch": "^1.3.3", + "@radix-ui/react-tabs": "^1.1.17", + "@radix-ui/react-tooltip": "^1.2.12", "@tanstack/react-query": "^5.101.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -30,17 +30,17 @@ "tailwind-merge": "^3.6.0" }, "devDependencies": { - "@types/node": "^22.20.0", + "@types/node": "^22.20.1", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^6.0.3", "autoprefixer": "^10.5.2", "openapi-typescript": "^7.5.2", - "postcss": "^8.5.1", + "postcss": "^8.5.19", "tailwindcss": "^3.4.17", "tailwindcss-animate": "^1.0.7", "typescript": "^5.7.3", - "vite": "^8.1.3" + "vite": "^8.1.4" } }, "node_modules/@alloc/quick-lru": { @@ -266,9 +266,9 @@ "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.5.tgz", + "integrity": "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==", "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { @@ -295,13 +295,13 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.11.tgz", - "integrity": "sha512-djW9+zeg137KQdlPtmE8xnaD+K2rcXXMWFrSg0hsmYZ6HRbdTA7tDHFgpaW9+huWVEu0RCabL+985T4TA0BE7g==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", + "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0" }, @@ -336,9 +336,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", + "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -351,20 +351,20 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.18.tgz", - "integrity": "sha512-apa28mldjMgORmE6g/w3sCcA0Y9UAVeeDVoozN4i7kOw12mLl9RBchfzK3Nn6qxOWjrZhK1Lfy7f07kyzxtnBw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.19.tgz", + "integrity": "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -402,12 +402,12 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.14.tgz", - "integrity": "sha512-4lUhWTWAjbDIqFrAPWJ3WqBOpO5YchVZ88X3nh6H9Lu5AFi5nCUeTPj3D8FSDmabmFeRe9ME0BDA4MwKTha5GQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.15.tgz", + "integrity": "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", @@ -429,16 +429,16 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.19.tgz", - "integrity": "sha512-HZccBkbK0LOi8nYKIp5jll/zIRW0cCOmG6WWyqsSpmXCU+ZlcBbTqIwlBvPCu886C5RVu6c/kHV7xSP8IgYNHw==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.20.tgz", + "integrity": "sha512-slfm+rRaZRuQBvHq60lXvSVUPhid0IPtjSZzIuUlWZMUs01iYZNlGS3mJgRD3ChLQVBAYlKiL/tFyWGX+dz8Xw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.19", + "@radix-ui/react-menu": "2.1.20", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, @@ -473,9 +473,9 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.11.tgz", - "integrity": "sha512-Mn88Vg2whaRocGJNOH+DKFqYm6ySFPQaiwHNxZPyjn99B52KAEJWWY9NP83+nWdk2HM3rdov+STu9AG471Rt9w==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.12.tgz", + "integrity": "sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", @@ -539,25 +539,25 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.19.tgz", - "integrity": "sha512-Mht9BVd1AIsNFVQr4KG3bIK7XQn5IXF0TL/2ObsrzOdc1loaly/+kBDL5roSCYn8j8XZkvpOD0WYLz2FQtH1Eg==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.20.tgz", + "integrity": "sha512-VsUrXxFe9d2ScbZF0fR/oPR1+qjyeLs5p0jzG8h90puMoA9bq4SirYlXbE+USRg9Q2qTeJSFNqjw2nts8jJe4w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", @@ -579,15 +579,15 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.2.tgz", - "integrity": "sha512-3QXNeMkdshed1MR3LNoiCirBywRFPkD8ETJa/HlPuLwSajaQixf2ro+isoDNJlGABg9ug41XuZpINZJIle4XWg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", @@ -635,9 +635,9 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.7.tgz", + "integrity": "sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==", "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" @@ -681,18 +681,18 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.2.tgz", - "integrity": "sha512-W8Uo9riHnlzLLWy+r2mVHUyuEWqD/+be4PZzbEvaGoFSBDHkm+GYWjtcE6u3AmPKNyfanWpnVfpZ2GqPCdzzsw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.3.tgz", + "integrity": "sha512-WwZFjWV4s3aC1QtR3k04R+oANHtX2q6fgKlc7MCEiDNlnTxCZ3H8k3mHtEgVlOejystwk1WQgarQhNOQZ2bK1g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" @@ -713,20 +713,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.14.tgz", - "integrity": "sha512-8Qcnx9447tx/aCBgw6Jenfqg4Skq+vqab9mCBmuGNipIS5YXvL275wbKEu7+ICYHIlAPgCduUMJH1XOYewKF6Q==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.15.tgz", + "integrity": "sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -744,17 +746,17 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.13.tgz", - "integrity": "sha512-7tncSubo2G0UY1e8rk+72qe3XRzrGnOLtZQ1PL1KoBfRUNX0NrJT5akb+0kfwSCc3gVR4wdHqyhAQBDpDNOwDw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.14.tgz", + "integrity": "sha512-bBODCWZK7JTbQLHs0uIP4f73wIWatakK4OS33UzkR1x897wu0PuO658a3f+6P2GEGyDzGYMuHRatMVoAk9WZTw==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2" @@ -775,24 +777,24 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.2.tgz", - "integrity": "sha512-brXD6C/V0fVK0DDbscLVw6LsXrjQ+ay8jdOBaN+tLb4vsHsAMm6Gt6eT77wHX1Eq8GPtD5rJ+RxFtfDozsb4+Q==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.3.tgz", + "integrity": "sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", @@ -819,16 +821,16 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.2.tgz", - "integrity": "sha512-qt5C1ppJz66aUDrH1VccjPrq7aFchK0wBrn6xsxlCHNUyE57dRRQ7lp1QFpF7OscMexZF8MCGBTVBlENHPkNiA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.3.tgz", + "integrity": "sha512-CWVVj+XaTom0SKCqw1EUgb0NuiLwS+N3OFG73mVEezKEjgNIvZiu0EevMelSSU+CbX3owbqJweG2gPU31WGC5A==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -870,14 +872,14 @@ } }, "node_modules/@radix-ui/react-switch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.2.tgz", - "integrity": "sha512-tgRBI3DdNwAJYE4BBZyZcz/HRRCvAsPkRvG1wvKc+41tBGMxPn/a87T/wikXAvyDypNQ9kaZwHbeZe+veHCGpA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.3.tgz", + "integrity": "sha512-1+mlB4/lxJfk5tgJ4g+R5mUCbRpPE1T9+UsEyeLYbGgMtwiMgmuTnfKz4Mw1nHALHjuwyxw4MLd4cSHn6pNSlQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", @@ -899,18 +901,18 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.16.tgz", - "integrity": "sha512-v3Ab2l7z6U7tRB4xA0IyKdq0OsqaO1o9ZjsIEoKKnSZ/l96mZz8aCTX0NCXw+YVHJXr8Km4d+Mn6/Q8YjXa+gw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.17.tgz", + "integrity": "sha512-nRyXnrAVCwjeXcHbvEbLS6ndbTeKHG1RqCP4A8Gw5L4cemDzPXdD8rAmr6wet0v57R69wGvuIIsFjHSVkZiMzQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -929,19 +931,19 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.11.tgz", - "integrity": "sha512-8XZ6Py3y3W2nEzAUGCN5cfVKaUi+CVApcz1d6lrNVVf2hvYEixMRkq8k9ggPKnQUpRRuOV5avt8uvxViH2jLwA==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.12.tgz", + "integrity": "sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -1014,6 +1016,21 @@ } } }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", + "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", @@ -1466,9 +1483,9 @@ } }, "node_modules/@types/node": { - "version": "22.20.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", - "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2725,9 +2742,9 @@ } }, "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", "dev": true, "funding": [ { @@ -3514,16 +3531,16 @@ "license": "MIT" }, "node_modules/vite": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz", - "integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.5", "postcss": "^8.5.16", - "rolldown": "~1.1.3", + "rolldown": "~1.1.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -3592,9 +3609,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { diff --git a/server/dashboard/package.json b/server/dashboard/package.json index dc254ef..e8bc024 100644 --- a/server/dashboard/package.json +++ b/server/dashboard/package.json @@ -13,17 +13,17 @@ "lint": "tsc --noEmit" }, "dependencies": { - "@radix-ui/react-dialog": "^1.1.18", - "@radix-ui/react-dropdown-menu": "^2.1.19", + "@radix-ui/react-dialog": "^1.1.19", + "@radix-ui/react-dropdown-menu": "^2.1.20", "@radix-ui/react-label": "^2.1.11", - "@radix-ui/react-radio-group": "^1.4.2", - "@radix-ui/react-scroll-area": "^1.2.13", - "@radix-ui/react-select": "^2.3.2", - "@radix-ui/react-slider": "^1.4.2", + "@radix-ui/react-radio-group": "^1.4.3", + "@radix-ui/react-scroll-area": "^1.2.14", + "@radix-ui/react-select": "^2.3.3", + "@radix-ui/react-slider": "^1.4.3", "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.3.2", - "@radix-ui/react-tabs": "^1.1.16", - "@radix-ui/react-tooltip": "^1.2.11", + "@radix-ui/react-switch": "^1.3.3", + "@radix-ui/react-tabs": "^1.1.17", + "@radix-ui/react-tooltip": "^1.2.12", "@tanstack/react-query": "^5.101.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -35,17 +35,17 @@ "tailwind-merge": "^3.6.0" }, "devDependencies": { - "@types/node": "^22.20.0", + "@types/node": "^22.20.1", "@types/react": "^18.3.18", "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^6.0.3", "autoprefixer": "^10.5.2", "openapi-typescript": "^7.5.2", - "postcss": "^8.5.1", + "postcss": "^8.5.19", "tailwindcss": "^3.4.17", "tailwindcss-animate": "^1.0.7", "typescript": "^5.7.3", - "vite": "^8.1.3" + "vite": "^8.1.4" }, "overrides": { "js-yaml": "^4.2.0" diff --git a/server/go.mod b/server/go.mod index 38abe48..f677978 100644 --- a/server/go.mod +++ b/server/go.mod @@ -4,15 +4,15 @@ go 1.25.11 require ( github.com/andybalholm/brotli v1.2.2 - github.com/getkin/kin-openapi v0.140.0 - github.com/go-chi/chi/v5 v5.3.0 + github.com/getkin/kin-openapi v0.142.0 + github.com/go-chi/chi/v5 v5.3.1 github.com/go-git/go-git/v5 v5.19.1 github.com/google/uuid v1.6.0 - github.com/oapi-codegen/runtime v1.4.2 + github.com/oapi-codegen/runtime v1.5.0 github.com/philippgille/chromem-go v0.7.0 github.com/tetratelabs/wazero v1.12.0 - golang.org/x/crypto v0.53.0 - golang.org/x/sync v0.21.0 + golang.org/x/crypto v0.54.0 + golang.org/x/sync v0.22.0 golang.org/x/time v0.15.0 modernc.org/sqlite v1.53.0 ) @@ -38,8 +38,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/oapi-codegen/oapi-codegen/v2 v2.7.0 // indirect - github.com/oasdiff/yaml v0.1.0 // indirect - github.com/oasdiff/yaml3 v0.0.13 // indirect + github.com/oasdiff/yaml v0.1.1 // indirect + github.com/oasdiff/yaml3 v0.0.14 // indirect github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect @@ -50,11 +50,11 @@ require ( github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/mod v0.36.0 // indirect - golang.org/x/net v0.55.0 // indirect - golang.org/x/sys v0.46.0 // indirect - golang.org/x/text v0.38.0 // indirect - golang.org/x/tools v0.45.0 // indirect + golang.org/x/mod v0.37.0 // indirect + golang.org/x/net v0.56.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.40.0 // indirect + golang.org/x/tools v0.47.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect modernc.org/libc v1.73.4 // indirect diff --git a/server/go.sum b/server/go.sum index 8496793..9b13573 100644 --- a/server/go.sum +++ b/server/go.sum @@ -40,12 +40,12 @@ github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FM github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getkin/kin-openapi v0.140.0 h1:JFn675aXRFjyiZKa/BFWploGldQlI0gobp4J5k0EZ2g= -github.com/getkin/kin-openapi v0.140.0/go.mod h1:lISrB64F0CPcuDJ3LdtPTMJBY8VENjR9wJBdrcT6J3g= +github.com/getkin/kin-openapi v0.142.0 h1:izj0vBdFprMhitfzaX8sTqztsEQyvwhssBoB6n8NO7w= +github.com/getkin/kin-openapi v0.142.0/go.mod h1:3BH9M9XDe/y9M5DSvEocVYAYq1w0qrhJHjC/vZi0AaY= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= -github.com/go-chi/chi/v5 v5.3.0 h1:halUjDxhshgXHMrao5bB8eNBXo/rnzwr8m5m36glehM= -github.com/go-chi/chi/v5 v5.3.0/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto= +github.com/go-chi/chi/v5 v5.3.1 h1:3j4HZLGZQ3JpMCrPJF/Jl3mYJfWLKBfNJ6quurUGCf8= +github.com/go-chi/chi/v5 v5.3.1/go.mod h1:R+tYY2hNuVUUjxoPtqUdgBqevM9s9njzkTLutVsOCto= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.9.0 h1:jItGXszUDRtR/AlferWPTMN4j38BQ88XnXKbilmmBPA= @@ -112,12 +112,12 @@ github.com/oapi-codegen/nullable v1.1.0 h1:eAh8JVc5430VtYVnq00Hrbpag9PFRGWLjxR1/ github.com/oapi-codegen/nullable v1.1.0/go.mod h1:KUZ3vUzkmEKY90ksAmit2+5juDIhIZhfDl+0PwOQlFY= github.com/oapi-codegen/oapi-codegen/v2 v2.7.0 h1:/8daqIYZfwnsHEAZdHUu9m0D5LA+5DoJCP7zLlT5Cs0= github.com/oapi-codegen/oapi-codegen/v2 v2.7.0/go.mod h1:qzFy6iuobJw/hD1aRILee4G87/ShmhR0xYCwcUtZMCw= -github.com/oapi-codegen/runtime v1.4.2 h1:GMxFVYLzoYLua+/KvzgSphkyK1lLTReQI9Vf4hvATKE= -github.com/oapi-codegen/runtime v1.4.2/go.mod h1:GwV7hC2hviaMzj+ITfHVRESK5J2W/GefVwIND/bMGvU= -github.com/oasdiff/yaml v0.1.0 h1:0bqZjfKc/8S9urj4JuwepX41WX9EoA6ifhU3SV06cXg= -github.com/oasdiff/yaml v0.1.0/go.mod h1:kOlRmMdL2X3vucLCEQO5u61SU22RysnfXvcttrZA1O0= -github.com/oasdiff/yaml3 v0.0.13 h1:06svmvOHOVBqF81+sY2EUScvUI/iS/vl2VIeUUxZQwg= -github.com/oasdiff/yaml3 v0.0.13/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/oapi-codegen/runtime v1.5.0 h1:aiil4QnH+eiWYSO60eaYZ4aur7sJH3rz6BvT5EBFnxc= +github.com/oapi-codegen/runtime v1.5.0/go.mod h1:GwV7hC2hviaMzj+ITfHVRESK5J2W/GefVwIND/bMGvU= +github.com/oasdiff/yaml v0.1.1 h1:6nHx+pn9gBRM6YpBlFZFQGCCd1nuvqOBtTD3KKTgGxY= +github.com/oasdiff/yaml v0.1.1/go.mod h1:EYJNoyktvWMJ0Hmhx+6qTaqMOsalUaRGT8Sj1hNcegU= +github.com/oasdiff/yaml3 v0.0.14 h1:aLJee3hxBK2H5wdXd9iPcIXb93Nty1Ge0pT171eHtkw= +github.com/oasdiff/yaml3 v0.0.14/go.mod h1:csto2xfDjYccdUn/yw/bPjj/cYTdp6HtFA0J4TWG+gg= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -179,13 +179,13 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= -golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= +golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= -golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= +golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= +golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -194,13 +194,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= -golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -219,25 +219,25 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= -golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= -golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= +golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..3f40b98 --- /dev/null +++ b/site/README.md @@ -0,0 +1,50 @@ +# codeindex.app — marketing & docs site + +Static two-page site (landing + `/docs/`) for **cix — CodeIndeX**, built with +Vite + React and deployed to Cloudflare Pages. + +```bash +cd site +npm install +npm run dev # local dev server +npm run build # production build → dist/ +npm run preview # serve the built dist/ locally +``` + +## Deployment (Cloudflare Pages) + +- Root directory: `site` +- Build command: `npm run build` +- Output directory: `dist` +- Production branch: `main` (other branches / PRs get preview URLs) +- Custom domain: `codeindex.app` (canonical). `code-index.app` 301-redirects + to it via a zone-level Redirect Rule (Pages `_redirects` cannot redirect + across domains). + +Headers (caching + CSP) live in [`public/_headers`](public/_headers). + +## Content rules + +1. **Never state a fact you can't point to in the repo.** Every number on the + site (language count, versions, flags, endpoints, scores) was verified + against the codebase when written; keep it that way. The terminal demos are + transcribed from real `cix` runs against this repository — if you change + them, run the command and transcribe, don't invent. +2. **Versions are hand-maintained** in + [`src/shared/versions.js`](src/shared/versions.js). Bump on each + server/CLI/plugin release. +3. **Brand:** the full product name is **CodeIndeX** (one word, capital C-I-X); + `cix` is the CLI command and short form. First mention on any surface pairs + both: “cix — CodeIndeX”. Domain `codeindex.app`, repo `code-index` are the + same name in medium-specific spelling. + +## OG image + +`public/og-image.png` (1200×630) is rendered from [`og/og.html`](og/og.html) +via headless Chrome. To regenerate after editing the card: + +```bash +"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \ + --headless --screenshot=public/og-image.png --window-size=1200,630 \ + --hide-scrollbars "file://$PWD/og/og.html" +``` diff --git a/site/docs/index.html b/site/docs/index.html new file mode 100644 index 0000000..85cc471 --- /dev/null +++ b/site/docs/index.html @@ -0,0 +1,27 @@ + + + + + + cix docs · CodeIndeX — install, CLI, REST API, agents + + + + + + + + + + + + + + + + + +
+ + + diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..d3f65ce --- /dev/null +++ b/site/index.html @@ -0,0 +1,27 @@ + + + + + + cix · CodeIndeX — self-hosted semantic code search + + + + + + + + + + + + + + + + + +
+ + + diff --git a/site/og/og.html b/site/og/og.html new file mode 100644 index 0000000..156e91d --- /dev/null +++ b/site/og/og.html @@ -0,0 +1,81 @@ + + + + + + + + +
+
+ + CodeIndeX +
+
vibecoded
for vibecoding
+
+

Search your codebase
by meaning,
not just text.

+
+
+ self-hosted + MIT + built for agents +
+
codeindex.app
+
+ + diff --git a/site/package-lock.json b/site/package-lock.json new file mode 100644 index 0000000..5ea8e90 --- /dev/null +++ b/site/package-lock.json @@ -0,0 +1,988 @@ +{ + "name": "codeindex-site", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "codeindex-site", + "version": "0.0.0", + "dependencies": { + "@fontsource/jetbrains-mono": "^5.2.5", + "@fontsource/rubik": "^5.2.5", + "@fontsource/shrikhand": "^5.2.5", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^6.0.3", + "vite": "^8.1.4" + }, + "engines": { + "node": ">=20.11" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@fontsource/jetbrains-mono": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", + "integrity": "sha512-6w8/SG4kqvIMu7xd7wt6x3idn1Qux3p9N62s6G3rfldOUYHpWcc2FKrqf+Vo44jRvqWj2oAtTHrZXEP23oSKwQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/rubik": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/rubik/-/rubik-5.2.8.tgz", + "integrity": "sha512-PIc8QR7FqWPcYhbdRiGff56vQlKqg/ytES1YqecSq1GkgxiH4TBshrFvDEOZ9JonUF9m1qQ+qXxJj7wD5zgXEw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/shrikhand": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/shrikhand/-/shrikhand-5.2.8.tgz", + "integrity": "sha512-kOUZfuOgz9qoL84B/rJIAoYfszXT1u9ECAGZXCmPoMggR/8lCd0MQfrCdHJptYLTYLtS85KTTMhFW0X9aBBztg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", + "integrity": "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/vite": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/site/package.json b/site/package.json new file mode 100644 index 0000000..b1ebd81 --- /dev/null +++ b/site/package.json @@ -0,0 +1,25 @@ +{ + "name": "codeindex-site", + "private": true, + "version": "0.0.0", + "type": "module", + "engines": { + "node": ">=20.11" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@fontsource/jetbrains-mono": "^5.2.5", + "@fontsource/rubik": "^5.2.5", + "@fontsource/shrikhand": "^5.2.5", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^6.0.3", + "vite": "^8.1.4" + } +} diff --git a/site/public/_headers b/site/public/_headers new file mode 100644 index 0000000..d6f6b23 --- /dev/null +++ b/site/public/_headers @@ -0,0 +1,14 @@ +/* + X-Content-Type-Options: nosniff + Referrer-Policy: strict-origin-when-cross-origin + X-Frame-Options: DENY + Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none' + +/assets/* + Cache-Control: public, max-age=31536000, immutable + +/favicon.svg + Cache-Control: public, max-age=86400 + +/og-image.png + Cache-Control: public, max-age=86400 diff --git a/site/public/favicon.svg b/site/public/favicon.svg new file mode 100644 index 0000000..e81522a --- /dev/null +++ b/site/public/favicon.svg @@ -0,0 +1,4 @@ + + + cix + diff --git a/site/public/og-image.png b/site/public/og-image.png new file mode 100644 index 0000000..2b30010 Binary files /dev/null and b/site/public/og-image.png differ diff --git a/site/src/docs.css b/site/src/docs.css new file mode 100644 index 0000000..90a007b --- /dev/null +++ b/site/src/docs.css @@ -0,0 +1,215 @@ +/* Docs-only styles — extends styles.css */ + +.docs-layout { + display: grid; + grid-template-columns: 240px 1fr; + gap: 60px; + width: min(1180px, 92vw); + margin: 0 auto; + padding: 50px 0 40px; + align-items: flex-start; + position: relative; + z-index: 2; +} + +.docs-sidebar { + position: sticky; + top: 100px; + align-self: start; +} + +.docs-sidebar-inner { + display: flex; + flex-direction: column; +} + +.toc { + list-style: none; + margin: 0; + padding: 0; + display: grid; + gap: 4px; + border-left: 2.5px solid var(--ink); + padding-left: 16px; +} +.toc li a { + text-decoration: none; + color: var(--ink-soft); + font-weight: 500; + font-size: 14.5px; + padding: 4px 0; + display: inline-block; +} +.toc li a:hover { color: var(--ink); } +.toc li.on a { + color: var(--red); + font-weight: 700; + position: relative; +} +.toc li.on a::before { + content: ""; + position: absolute; + left: -19px; + top: 50%; + transform: translateY(-50%); + width: 5px; + height: 5px; + background: var(--red); + border-radius: 50%; +} + +.docs-hero { + margin-bottom: 64px; + padding-bottom: 40px; + border-bottom: 2px dashed var(--ink); +} +.docs-hero h1 { + font-size: clamp(40px, 5.5vw, 64px); + margin: 14px 0 18px; +} + +.docs-section { + padding: 36px 0 56px; + scroll-margin-top: 100px; +} +.docs-section h2 { + font-size: clamp(28px, 3.5vw, 40px); + margin: 12px 0 22px; +} +.docs-section h3 { + font-size: 19px; + font-weight: 700; + margin: 32px 0 14px; +} +.docs-section p { + color: var(--ink-soft); + margin: 0 0 14px; + text-wrap: pretty; + max-width: 68ch; +} +.docs-section code { + font-family: var(--font-mono); + background: var(--paper); + padding: 1px 7px; + border: 1.5px solid var(--ink); + border-radius: 6px; + font-size: 13px; + color: var(--ink); +} + +.bullets { + margin: 8px 0 14px; + padding-left: 22px; +} +.bullets li { + margin-bottom: 8px; + color: var(--ink-soft); +} +.bullets li b { color: var(--ink); } + +.code-pre { + font-family: var(--font-mono); + background: var(--code-bg); + color: var(--code-fg); + border: 2.5px solid var(--ink); + border-radius: 14px; + padding: 16px 20px; + font-size: 13px; + line-height: 1.65; + overflow-x: auto; + box-shadow: 4px 4px 0 var(--ink); + margin: 14px 0 18px; + max-width: 100%; + min-width: 0; +} + +.docs-main { min-width: 0; } + +.def-list { + display: grid; + gap: 10px; + margin: 8px 0 14px; +} +.def-row { + display: grid; + grid-template-columns: 280px 1fr; + gap: 18px; + padding: 12px 0; + border-bottom: 1.5px dashed rgba(31, 20, 16, 0.2); +} +.def-row:last-child { border-bottom: none; } +.def-row dt { + margin: 0; + font-family: var(--font-mono); + font-size: 13px; + color: var(--red); +} +.def-row dt code { + background: transparent; + border: none; + padding: 0; + color: var(--red); + font-weight: 600; +} +.def-row dd { + margin: 0; + color: var(--ink-soft); + font-size: 14.5px; +} +.def-row dd code { + font-size: 12.5px; + padding: 1px 5px; +} + +.tbl { + width: 100%; + border-collapse: collapse; + margin: 14px 0 18px; + background: var(--paper); + border: 2.5px solid var(--ink); + border-radius: 12px; + overflow: hidden; +} +.tbl th, .tbl td { + padding: 10px 14px; + text-align: left; + border-bottom: 1.5px solid rgba(31, 20, 16, 0.15); + font-size: 14px; +} +.tbl th { + background: var(--bg-2); + font-family: var(--font-mono); + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.08em; + font-weight: 700; + color: var(--ink); +} +.tbl td code { + font-size: 12.5px; + padding: 1px 5px; +} +.tbl tbody tr:last-child td { border-bottom: none; } + +.ascii-diagram { + font-family: var(--font-mono); + font-size: 12.5px; + line-height: 1.5; + color: var(--ink); + margin: 0; + white-space: pre; + overflow-x: auto; +} +.diagram { background: var(--paper); padding: 22px; border-radius: 14px; } + +@media (max-width: 920px) { + .docs-layout { grid-template-columns: 1fr; gap: 24px; padding-top: 24px; } + /* single-column grid items must not size to their widest table/pre */ + .docs-main, .docs-sidebar { min-width: 0; } + .docs-sidebar { position: static; } + .toc { display: flex; flex-wrap: wrap; gap: 12px; border-left: none; padding-left: 0; } + .toc li.on a::before { display: none; } + .def-row { grid-template-columns: 1fr; gap: 4px; } + /* tables can't shrink below min-content (long CIX_* names) — scroll them */ + .tbl { display: block; overflow-x: auto; } +} diff --git a/site/src/docs/docs.jsx b/site/src/docs/docs.jsx new file mode 100644 index 0000000..b54ff2e --- /dev/null +++ b/site/src/docs/docs.jsx @@ -0,0 +1,532 @@ +import { useState, useEffect } from 'react'; +import { CixAscii } from '../shared/ascii.jsx'; +import { Foot } from '../shared/foot.jsx'; +import { + SERVER_VERSION, CLI_VERSION, PLUGIN_VERSION, COWORK_PLUGIN_VERSION, GITHUB_URL, +} from '../shared/versions.js'; + +const TOC = [ + { id: 'overview', label: 'Overview' }, + { id: 'install', label: 'Install' }, + { id: 'cli', label: 'CLI reference' }, + { id: 'tuning', label: 'Tuning search' }, + { id: 'config', label: 'Configuration' }, + { id: 'api', label: 'REST API' }, + { id: 'workspaces', label: 'Workspaces' }, + { id: 'mcp', label: 'MCP · Desktop & Cowork' }, + { id: 'plugin', label: 'Claude Code plugin' }, + { id: 'github', label: 'GitHub repos & tunnels' }, + { id: 'security', label: 'Security & access' }, + { id: 'troubleshoot', label: 'Troubleshooting' }, +]; + +export function DocsApp() { + const [active, setActive] = useState('overview'); + + useEffect(() => { + const obs = new IntersectionObserver(entries => { + entries.forEach(e => { if (e.isIntersecting) setActive(e.target.id); }); + }, { rootMargin: '-30% 0px -55% 0px' }); + TOC.forEach(t => { const el = document.getElementById(t.id); if (el) obs.observe(el); }); + return () => obs.disconnect(); + }, []); + + return ( + <> +
+
+ + + / docs + + +
+
+ +
+ + +
+
+ Documentation +

cix docs

+

cix (CodeIndeX) — everything you need to run a self-hosted semantic index for your code. Deploy, configure, and integrate with agents.

+
+ server v{SERVER_VERSION} + CLI v{CLI_VERSION} + MIT + 31 languages +
+
+ +
+

cix is a single Go binary that exposes an HTTP API and a web dashboard at http://host:21847. It chunks your code with tree-sitter (31 grammars, run in a WASM sandbox), embeds chunks via a local llama-server sidecar, stores vectors in chromem-go, mirrors chunk text into a SQLite FTS5 table for BM25 scoring, and keeps symbols + project metadata in SQLite. Five search modes run on top: semantic, symbols, definitions, references, and files — plus hybrid cross-repo search over workspaces.

+

The three components

+
    +
  • cix-server — the Go binary. Embedded React dashboard. Embedded Swagger UI at /docs. Ships as a distroless container.
  • +
  • llama-server sidecar — a bundled llama.cpp child process that loads CodeRankEmbed-Q8 (GGUF) and answers embedding requests over a Unix socket.
  • +
  • cix CLI — a Go binary you install locally. cix init, cix search, cix watch. The CLI is what your agent calls.
  • +
+ +
+ +
+

Server (Docker, CPU)

+ {`git clone https://github.com/dvcdsys/code-index && cd code-index +cp .env.example .env +# Edit .env: CIX_BOOTSTRAP_ADMIN_EMAIL, CIX_BOOTSTRAP_ADMIN_PASSWORD +docker compose up -d +curl http://localhost:21847/health # → {"status":"ok"}`} + +

Server (CUDA / NVIDIA GPU)

+ {`docker compose -f docker-compose.cuda.yml up -d`} +

Requires an NVIDIA driver ≥ 525 (CUDA 12.x) and the NVIDIA Container Toolkit. The CUDA image sets CIX_N_GPU_LAYERS=99 for full GPU offload.

+ +

Server (native macOS, Apple Silicon)

+

Docker on macOS can't reach the Metal GPU. For full Metal offload, run natively — on macOS the server already defaults to offloading all layers, no extra configuration needed:

+ {`xcode-select --install # if not installed +cd server && make bundle # builds server + downloads Metal-enabled llama-server +cp ../.env.example ../.env # set the bootstrap admin vars +make run`} + +

CLI

+ {`# One-line installer (macOS / Linux) +curl -fsSL https://raw.githubusercontent.com/dvcdsys/code-index/main/install.sh | bash + +# Interactive first-run wizard… +cix config init + +# …or configure by hand (multi-server layout) +cix config set server.local.url http://localhost:21847 +cix config set server.local.key cix_ +cix config set default_server local`} +
+ +
+

Project management

+ + +

Search

+ {`# Semantic — natural language, finds by meaning +cix search [--in ] [--exclude ] [--lang ] + [--limit ] [--min-score <0-1>] + +# Symbols — fast lookup by name +cix symbols [--kind function|class|method|type] [--limit ] + +# Definitions / references (aliases: def, goto · refs, usages) +cix def [--kind ] [--file ] [--limit ] +cix refs [--file ] [--limit ] + +# Files by path pattern +cix files [--limit ] + +# Every command also takes -p or -n +# to target a project other than the current directory.`} + +

External (GitHub-backed) projects

+ [--lines N:M]', "Read a file (or a line range) from the project's server-side checkout."], + ['cix tree [dir]', 'List one directory level of the server-side checkout.'], + ]}/> + +

Workspaces

+ {`cix ws # list workspaces +cix ws create [--description "…"] +cix ws # describe: repos, sizes, sync state +cix ws search "" [--top-projects N] [--top-chunks K] [--json] +cix ws add … # attach indexed projects +cix ws remove … +cix ws rename +cix ws delete [-y]`} + +

Agents (MCP)

+ + +

File watcher

+ +

The watcher uses native filesystem events (FSEvents on macOS, inotify on Linux) with a 5-second debounce. Logs live in ~/.cix/logs/, one file per project (watcher-<hash>.log).

+ +

Configuration

+ ', 'Set a value (see patterns below).'], + ['cix config unset ', 'Remove a server or clear a key.'], + ['cix config keys', 'List every settable key with defaults and env overrides.'], + ['cix config path', 'Print the config file location.'], + ['cix config edit', 'Interactive TUI editor.'], + ['cix config init', 'First-run wizard.'], + ]}/> + {`# Multi-server layout +cix config set server..url https://cix.example.com +cix config set server..key cix_… +cix config set server..header.
# e.g. Cloudflare Access +cix config set default_server `} +
+ +
+

The CLI defaults to --min-score 0.4 (the raw HTTP endpoint defaults lower, 0.2). The threshold is calibrated for CodeRankEmbed-Q8 with the path-aware embedding format. Score ranges look lower than generic models because CodeRankEmbed is asymmetric — queries get a different prefix than passages.

+ + + + + + + + +
Match strengthScore rangeAction
Exact symbol or filename≥ 0.65rare; very high confidence
Strong path-aware concept0.50 – 0.65typical "good" match
Weaker / partial overlap0.40 – 0.50typical for vague queries
Likely unrelated noise< 0.40filtered out by default
+

Lower the threshold when the query returns no results but you know matching code exists (--min-score 0.25), or when exploring an unfamiliar codebase. Raise it when an agent's context is filling with weak matches.

+

Excluding noisy paths

+ {`# One-off +cix search "main entry point" --exclude vendor --exclude bench/fixtures + +# Permanent — add to .cixignore (skips indexing entirely) +echo "vendor/" >> .cixignore +echo "bench/fixtures/" >> .cixignore +cix reindex --full`} +

.cixignore follows .gitignore syntax exactly (it is read by the CLI's file discovery, alongside your .gitignore). A .cixconfig.yaml with ignore: submodules: true additionally excludes all git submodule paths.

+
+ +
+

All server settings use the CIX_* prefix. This is the curated set — the full reference (~40 variables) lives in doc/CONFIG_REFERENCE.md. Tuning values are also editable at runtime from /dashboard/server; env values are the boot-time seed.

+

Core

+ debug|info|warn|error.], + ]}/> +

Storage

+ /sqlite/projects.db', 'Model-independent system DB.'], + ['CIX_CHROMA_PERSIST_DIR', '/chroma', 'Vector store; namespaced per provider/model.'], + ['CIX_REPOS_DIR', '/repos', 'Server-side clones of GitHub-backed projects.'], + ]}/> +

Embeddings & sidecar

+ Model for the local llama.cpp provider — HuggingFace repo or absolute .gguf path. Switch providers (Voyage, OpenAI) from the dashboard.], + ['CIX_EMBEDDINGS_ENABLED', 'true', 'Disable to run symbol/file search only.'], + ['CIX_MAX_EMBEDDING_CONCURRENCY', '5', 'Embedding queue parallelism.'], + ['CIX_EMBED_INCLUDE_PATH', 'true', <>Path/lang/symbol preamble. Toggling needs reindex --full.], + ['CIX_MAX_FILE_SIZE', '524288', 'Skip files larger than this (bytes).'], + ['CIX_N_GPU_LAYERS', '-1 macOS · 0 else', <>-1 = all layers on Metal. The CUDA image bakes 99.], + ['CIX_LLAMA_TRANSPORT', 'unix', <>Sidecar IPC: unix or tcp.], + ['CIX_LLAMA_STARTUP_TIMEOUT', '60', 'Seconds to wait for the sidecar.'], + ]}/> +

GitHub & tunnels

+ +
+ +
+

Full machine-readable schema at /openapi.json; Swagger UI at /docs. Roughly 100 routes, grouped below. Each group is tagged with its access level — see Security & access for what the levels mean.

+ +

Public — no auth

+ {`GET /health liveness +GET /openapi.json · /docs spec + Swagger UI +GET /dashboard embedded web UI +GET /api/v1/auth/bootstrap-status first-run state +POST /api/v1/auth/login email + password → cookie`} + +

Auth & account

+ {`POST /api/v1/auth/logout clear cookie + server-side session +GET /api/v1/auth/me current user +POST /api/v1/auth/change-password forced or voluntary +GET /api/v1/auth/sessions list own sessions +DELETE /api/v1/auth/sessions/{id} revoke a session +GET /api/v1/api-keys list own keys (admin sees all) +POST /api/v1/api-keys mint a new key +DELETE /api/v1/api-keys/{id} revoke +GET /api/v1/status live config snapshot +GET /api/v1/jobs job queue`} + +

Projects — indexing & search

+ {`GET/POST /api/v1/projects +GET/PATCH/DELETE /api/v1/projects/{path} +POST /api/v1/projects/{path}/index/begin|files|finish|cancel +GET /api/v1/projects/{path}/index/status +POST /api/v1/projects/{path}/search semantic +POST /api/v1/projects/{path}/search/symbols|definitions|references|files +POST /api/v1/projects/{path}/file · /tree external projects +GET /api/v1/projects/{path}/summary · /workspaces`} +

Lifecycle & sharing routes use the project's {'{hash}'} (path hash) instead of the encoded path:

+ {`POST /api/v1/projects/{hash}/reindex · /force-stop +GET/PATCH /api/v1/projects/{hash}/git-repo PUT …/git-repo/token +PUT /api/v1/projects/{hash}/owner reassign (admin) +GET/POST /api/v1/projects/{hash}/shares DELETE …/shares/{groupId} +GET /api/v1/projects/{hash}/webhook-info`} + +

Workspaces

+ {`GET/POST /api/v1/workspaces +GET/PATCH/DELETE /api/v1/workspaces/{id} +GET/POST /api/v1/workspaces/{id}/projects +DELETE /api/v1/workspaces/{id}/projects/{hash} +GET /api/v1/workspaces/{id}/search hybrid BM25 + dense +GET/POST /api/v1/workspaces/{id}/shares DELETE …/shares/{groupId}`} + +

Webhooks

+ {`POST /api/v1/webhooks/github/{hash} per-repo HMAC-SHA256 (X-Hub-Signature-256)`} + +

Admin

+ {`POST /api/v1/git-repos register a GitHub-backed project +GET/POST /api/v1/github-tokens PUT/DELETE …/{id} +GET /api/v1/github-tokens/{id}/accounts · /repos +GET /api/v1/github/webhooks/origin POST …/reconcile + +GET/POST /api/v1/groups view-groups (sharing) +GET/PATCH/DELETE /api/v1/groups/{id} +GET/POST /api/v1/groups/{id}/members DELETE …/members/{userId} + +GET /api/v1/tunnels · /tunnels/status · /tunnels/binaries +GET/PUT /api/v1/tunnels/config POST …/restart · /test +POST /api/v1/tunnels/binaries/{provider}/install|update + +GET/POST /api/v1/admin/users PATCH/DELETE …/{id} +POST /api/v1/admin/users/{id}/reset-password +GET/PUT /api/v1/admin/runtime-config +GET /api/v1/admin/models · /login-locks POST …/login-locks/reset +GET /api/v1/admin/embedding-providers GET/PUT …/active · POST …/{kind}/test +POST /api/v1/admin/sidecar/restart GET …/sidecar/status`} +
+ +
+

A workspace is a named group of repositories that cix searches as one corpus. Where cix search is for the project you're cd'd into, a workspace is for tasks that span repos — microservices that talk to each other, a feature whose implementation crosses several services, or any time the answer is "look in N repos, not one".

+

Workspaces clone GitHub repositories server-side (under CIX_REPOS_DIR), index them next to your local projects, and expose a single hybrid search endpoint: a dense (cosine) pass and a BM25 (SQLite FTS5) pass fan out per project, then a two-stage ranker gates the relevant repos and fuses both signals. Defaults are calibrated on a 113-query eval. One query returns ranked projects and the top chunks across all of them — most of an agent's context needs land in a single round-trip.

+

Use it

+

Workspaces ship enabled in every release — no feature flag, nothing to turn on. Point clones at a dedicated volume with CIX_REPOS_DIR if you like, then:

+ {`cix ws create platform --description "Platform services" +cix ws platform add … # attach indexed projects +cix ws platform search "who validates webhook signatures" +cix ws platform search "feature flag rollout" --json # for agents`} +

GitHub-backed repositories are registered by an admin first (dashboard → workspace → Add GitHub repository, or POST /api/v1/git-repos) — with webhook or polling sync so the index follows push. See GitHub repos & tunnels. Full guide: workspaces.md.

+
+ +
+

Claude Desktop and Cowork don't load Claude Code plugins — the supported channel there is MCP (Model Context Protocol). So the CLI doubles as an MCP server: cix mcp speaks JSON-RPC over stdio and is launched by the host app, not by you.

+

One-command install

+ {`cix mcp install claude-desktop # writes the entry, keeps a .bak +# restart Claude Desktop — Cowork picks the tools up too + +cix mcp install claude-desktop --print # dry-run preview +cix mcp uninstall claude-desktop`} +

No secrets are written to the host config — the server URL and API key stay in ~/.cix/config.yaml.

+

The 13 tools

+

cix_search, cix_definitions, cix_references, cix_symbols, cix_files, cix_summary, cix_file, cix_tree, cix_workspace_search, cix_list_workspaces, cix_list_workspace_projects, cix_list_projects, cix_list_servers.

+

The model is deliberately server-centric and multi-server: there is no "current project" and nothing is inferred from a working directory. Every tool except cix_list_servers takes an optional server argument (an alias from your CLI config); the agent names the project or workspace explicitly. cix_file/cix_tree work for external (GitHub-backed) projects, which the server keeps on disk.

+

Optional Cowork skills

+ {`/plugin install cix-cowork@code-index`} +

cix-cowork (v{COWORK_PLUGIN_VERSION}) is a skills-only companion plugin — no hooks, no CLI — that teaches Cowork the cix and cix-workspace research workflows over the MCP tools. The tools work without it.

+
+ +
+

The official Claude Code plugin (v{PLUGIN_VERSION}) ships from the repo's marketplace. It bundles the CLI, eight slash commands, two lazy-loading skills (cix + cix-workspace), a cix-workspace-investigator sub-agent for parallel cross-repo research, and five behavioral hooks.

+

Install

+ {`/plugin marketplace add dvcdsys/code-index +/plugin install cix@code-index`} +

What the hooks do

+ +

Context cost stays small: the session reminder is a single paragraph, and the full cix SKILL.md (~13 KB) enters context at most once per session via native lazy-loading. Cross-repo work loads the cix-workspace skill on demand.

+
+ +
+

External (GitHub-backed) projects

+

cix indexes two kinds of project. Local projects are created by the CLI (cix init) and are private to their owner. External projects are registered by an admin (POST /api/v1/git-repos or the dashboard): the server clones the GitHub repo under CIX_REPOS_DIR, indexes it, and keeps it in sync. Regular users see an external project only when an admin shares it into one of their view-groups.

+

Sync happens per repo in one of three webhook modes:

+
    +
  • auto — the server registers the webhook on GitHub itself, using a stored personal access token (PAT needs repo + admin:repo_hook).
  • +
  • manual — you copy the URL + secret from GET /api/v1/projects/{'{hash}'}/webhook-info into GitHub's settings.
  • +
  • disabled — polling only (interval configurable).
  • +
+

Deliveries hit POST /api/v1/webhooks/github/{'{hash}'} and are authenticated per repo with an HMAC-SHA256 signature over the body (X-Hub-Signature-256) — not with a cix API key. A valid push on the tracked branch enqueues a re-sync + reindex. PATs are stored encrypted and managed under /api/v1/github-tokens (admin-only; the plaintext is never echoed back).

+

Managed tunnels

+

Behind NAT but still want webhooks? The server can orchestrate an outbound tunnel itself (admin-only): Cloudflare Tunnel or ngrok. Configure under Managed Tunnels in the dashboard (or GET/PUT /api/v1/tunnels/config), optionally let the server download the provider binary (CIX_TUNNEL_BIN_MANAGED=true), then test and restart. Webhook URLs use the live tunnel origin when one is up, falling back to CIX_PUBLIC_URL; after enabling a tunnel, POST /api/v1/github/webhooks/reconcile re-registers hooks across all auto repos.

+
+ +
+

Three authentication mechanisms

+
    +
  • Bearer API keyAuthorization: Bearer cix_… for the CLI, agents, and scripts.
  • +
  • Session cookiecix_session (HttpOnly, SameSite=Strict) for the dashboard.
  • +
  • Per-repo HMAC — GitHub webhook deliveries are verified with HMAC-SHA256 against each repo's secret, independent of the other two.
  • +
+

Public paths (no auth): /health, /docs, /openapi.json, /dashboard (the SPA shell), /api/v1/auth/bootstrap-status, /api/v1/auth/login, and the HMAC-guarded webhook receiver. Everything else requires an authenticated principal.

+

Roles & authorization

+

Two roles: admin and user. On top of that, every resource is checked against an ownership + view-group model:

+ + + + + + + + + + +
LevelWho passesExamples
anyone/health, /docs, login
valid per-repo signatureGitHub webhooks
any authenticated user (self-scoped)own sessions, own API keys
resource owner or adminproject settings, workspace edit
owner, view-group member, or adminread/search shared projects
admins onlygit-repos, PATs, groups, tunnels, users
+

Local projects are private to their creator. External (GitHub-backed) projects are ownerless and admin-administered — they reach users only through view-groups (read/search). Reads on resources you can't see return 404, not 403, so existence isn't leaked. Workspace search results are automatically intersected with the projects you're allowed to see.

+
+ +
+ Set both CIX_BOOTSTRAP_ADMIN_EMAIL and CIX_BOOTSTRAP_ADMIN_PASSWORD in .env. They're only used while the users table is empty — drop them after first login.], + ['CLI can’t authenticate', <>Run cix config set server.<name>.key cix_… with a key minted from the dashboard (or run cix config init). Check what's active with cix config show.], + ['"connection refused"', <>Server isn't running. curl http://localhost:21847/health; if it fails, docker compose up -d.], + ['Search returns no results', <>Lower the threshold (--min-score 0.2), verify cix status says Indexed, and confirm cix list shows the project.], + ['"Stale model" on every project', <>The embedding model changed. Reindex each project (after a model change the server automatically promotes it to a full reindex) — or revert the change in Server → Embedding provider.], + ['Workspace endpoints return 503', <>Workspaces ship in every release (no feature flag), so a 503 means the workspaces service failed to wire — usually the encryption layer for GitHub tokens didn't initialize. Check the encryption-key config (doc/WORKSPACES.md); a plain restart won't help.], + ['Locked out of the admin account', <>Another admin can reset you via Users → Reset password (or POST /api/v1/admin/users/{'{id}'}/reset-password) and clear login locks under Login locks. Long-term: keep two admin accounts.], + ]}/> +
+ +
+
+ Something missing or wrong?{' '} + The full docs live in the repo — open a PR. +
+ Docs on GitHub → +
+
+
+ + + + ); +} + +function Section({ id, title, eyebrow, badge, children }) { + return ( +
+ {eyebrow} +

+ {title} + {badge && {badge}} +

+ {children} +
+ ); +} + +function Tag({ t }) { + const colors = { + Public: 'var(--moss)', HMAC: 'var(--plum)', SelfAuth: 'var(--ochre)', + Owner: 'var(--red)', GroupRead: 'var(--red-deep)', Admin: 'var(--ink)', + }; + return ( + {t} + ); +} + +function CodeBlock({ children }) { + return
{children}
; +} + +// Environment-variable table: rows are [name, default (null → —), notes]. +function VarTable({ rows }) { + return ( + + + + {rows.map(([name, def, notes]) => ( + + + + + + ))} + +
VariableDefaultNotes
{name}{def == null ? '—' : {def}}{notes}
+ ); +} + +function DefList({ rows }) { + return ( +
+ {rows.map(([k, v], i) => ( +
+
{k}
+
{v}
+
+ ))} +
+ ); +} + +function Diagram() { + return ( +
+
{`           Browser  →  http://host:21847
+                          │
+                          ▼
+   ┌────────────────────────────────────────────────────┐
+   │  cix-server  (Go, distroless)                      │
+   │  ─────────────────────────────────────────────────│
+   │  HTTP/REST · sessions + Bearer keys · /dashboard   │
+   │  ├── tree-sitter chunker   (31 languages, WASM)    │
+   │  ├── llama-server sidecar  (Unix socket)           │
+   │  ├── chromem-go            (cosine vector store)   │
+   │  ├── SQLite FTS5 mirror    (BM25 → hybrid rank)    │
+   │  └── modernc/sqlite        (symbols + metadata)    │
+   └─────┬─────────────────────────────────────┬────────┘
+         │ HTTP                                │ Unix sock
+         ▼                                     ▼
+    cix CLI (Go)                  llama-server child proc
+    search · symbols · refs       CodeRankEmbed Q8 GGUF`}
+
+ ); +} diff --git a/site/src/docs/main.jsx b/site/src/docs/main.jsx new file mode 100644 index 0000000..13964bd --- /dev/null +++ b/site/src/docs/main.jsx @@ -0,0 +1,8 @@ +import '../shared/fonts.js'; +import '../styles.css'; +import '../docs.css'; + +import { createRoot } from 'react-dom/client'; +import { DocsApp } from './docs.jsx'; + +createRoot(document.getElementById('root')).render(); diff --git a/site/src/landing/app.jsx b/site/src/landing/app.jsx new file mode 100644 index 0000000..0909ee7 --- /dev/null +++ b/site/src/landing/app.jsx @@ -0,0 +1,92 @@ +import { CixAscii } from '../shared/ascii.jsx'; +import { Foot } from '../shared/foot.jsx'; +import { SERVER_VERSION, CLI_VERSION, GITHUB_URL } from '../shared/versions.js'; +import { HeroTerminal } from './terminal.jsx'; +import { Why, Features, Playground, Workspaces, Agent, QuickStart, FAQ } from './sections.jsx'; + +export function App() { + return ( + <> +