Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
8d0e3da
feat(server): PR1 — workspaces skeleton (CRUD + encrypted GitHub tokens)
dvcdsys May 11, 2026
fabafb0
feat(server): PR2 — workspace_repos + jobs + clone/index pipeline
dvcdsys May 11, 2026
e598b23
feat(server): PR3 — GitHub webhooks (HMAC receiver + optional auto-re…
dvcdsys May 11, 2026
f244643
feat(server): PR4 — call_edges + eval harness
dvcdsys May 11, 2026
ec32744
feat(server): PR5 — Louvain communities + workspace centroids
dvcdsys May 11, 2026
207bfaf
feat(server): PR6 — two-stage workspace search endpoint
dvcdsys May 11, 2026
e1aa785
feat: PR7 — workspace CLI + skill + dashboard search dialog
dvcdsys May 11, 2026
5db28fd
feat: PR8 — workspace discovery (name-first CLI grammar + dashboard e…
dvcdsys May 11, 2026
57e091d
fix(github-tokens): derive scopes from GitHub instead of user input
dvcdsys May 11, 2026
58756f8
feat(workspaces): in-dashboard add-repo flow with live progress
dvcdsys May 11, 2026
0a3a21d
feat(workspaces): account/org selector in add-repo flow
dvcdsys May 11, 2026
51ddf7e
fix(workspaces): truncate long repo names in the picker row
dvcdsys May 11, 2026
f00e3d3
feat(chunksfts): add FTS5 BM25 mirror of every indexed chunk
dvcdsys May 12, 2026
575d325
feat(workspaces): hybrid BM25+dense workspace search + project gate
dvcdsys May 12, 2026
5c27abc
feat(workspaces): flag pre-FTS-mirror repos so the dashboard prompts …
dvcdsys May 12, 2026
a982f40
docs(skills): rewrite cix-workspace skill around hybrid + 3-question …
dvcdsys May 12, 2026
eb37f60
chore(privacy): anonymize examples in tests and docs
dvcdsys May 12, 2026
96b487d
feat(workspaces): calibrate search defaults, fix chunks/panel consist…
dvcdsys May 13, 2026
8ec4493
feat(skills/cix-workspace): trust rules + cix-workspace-investigator …
dvcdsys May 13, 2026
9a78e1d
docs(workspaces): add workspaces.md guide + README dashboard notes
dvcdsys May 13, 2026
5d69fa8
ci(prerelease): add CUDA-only develop image build + gate develop PRs
dvcdsys May 13, 2026
a2b60f2
fix(server): restore dashboard/dist/.gitkeep dropped in 33da39b
dvcdsys May 13, 2026
c5a1bd9
feat(plugins): add cix plugin sources from feat/claude-code-plugin sn…
dvcdsys May 13, 2026
7e22ba7
fix(plugins/cix): match Bash grep/rg in PreToolUse hook
dvcdsys May 13, 2026
af6f4b6
feat(plugins/cix): bundle cix-workspace skill + investigator sub-agen…
dvcdsys May 13, 2026
92dd135
ci(prerelease): add CLI develop channel + install-develop.sh
dvcdsys May 13, 2026
e433fee
refactor(workspaces): split workspace_repos into git_repos + workspac…
dvcdsys May 14, 2026
6a27620
chore(dashboard): untrack tsconfig.tsbuildinfo
dvcdsys May 14, 2026
b5c66dd
fix(cli): port workspace commands to /workspaces/{id}/projects API
dvcdsys May 14, 2026
3d413ad
fix(dashboard): align ProjectWorkspaceEntry type with server payload
dvcdsys May 14, 2026
19226aa
fix(db): crash-safe split migration + schema_migrations versioning
dvcdsys May 14, 2026
9dac327
feat(server): startup audit for stale webhook URLs (4a)
dvcdsys May 14, 2026
95e5716
fix(server): compensating delete + atomic Link for gitrepos/workspace…
dvcdsys May 14, 2026
903d48f
fix(server): tighten webhook validation + zero PAT after use
dvcdsys May 14, 2026
b264af2
docs(workspaces): align prose with new schema + dedupe SKILL.md
dvcdsys May 14, 2026
bff374b
chore(server): gitignore the cix-server binary at server root
dvcdsys May 14, 2026
596748e
feat(dashboard): Reindex button + indexing indicator on project page
dvcdsys May 14, 2026
f621aca
fix(plugin): switch grep-nudge to PostToolUse, add find, drop slash-c…
dvcdsys May 14, 2026
b650a47
build: add `make plugin-reload-local` for end-to-end plugin reinstall
dvcdsys May 14, 2026
93e4964
fix(server): flip project status to indexing synchronously in Reindex…
dvcdsys May 14, 2026
6477d3f
docs: refactor README (-33%) and sync /doc/ with develop features
dvcdsys May 15, 2026
6e760f8
feat(cli): add --name/-n flag for exact project lookup by registered ID
dvcdsys May 18, 2026
64d7b00
docs(skill): teach cix-workspace + investigator about remote-only pro…
dvcdsys May 18, 2026
b619a59
chore(server): drop obsolete dashboard/dist/.gitkeep marker
dvcdsys May 18, 2026
c0a64b4
fix(plugin): repair hook regression tests + docs; widen grep-nudge de…
dvcdsys May 18, 2026
3c5fc5a
ci(plugin): include develop branch in bats workflow triggers
dvcdsys May 18, 2026
551a55f
docs(contributing): document branch model, commit style, plugin testing
dvcdsys May 19, 2026
c530d65
feat(server): incremental reindex via git tree.Diff + always-on works…
dvcdsys May 20, 2026
bb1aae6
fix(server): restore dashboard/dist/.gitkeep so CI go vet doesn't fail
dvcdsys May 20, 2026
0c68166
feat(plugin): token-economy guidance + optional CIX_MAX_OUTPUT_LINES cap
dvcdsys May 20, 2026
3a724d1
fix(plugin): pin auto-installer + three-state cix-status cache (Phase 5)
dvcdsys May 20, 2026
01bed1a
feat(server): configurable log level via CIX_LOG_LEVEL
dvcdsys May 20, 2026
2300997
feat(server): Managed Tunnels (Cloudflare + ngrok) for webhook ingres…
dvcdsys May 20, 2026
09dfd2e
fix(server): address PR #45 review — auth, secret handling, installer…
dvcdsys May 20, 2026
f6c3b46
feat(server): git polling sync as webhook alternative for non-admin r…
dvcdsys May 20, 2026
f07d632
fix(server): address PR #46 review — gofmt + migration-number comments
dvcdsys May 20, 2026
98c2290
fix(dashboard): treat CIX_PUBLIC_URL as a valid webhook origin (tunne…
dvcdsys May 20, 2026
b0aa920
feat(dashboard): manage project sync method from the project page
dvcdsys May 20, 2026
c48bf0c
fix(dashboard): make Webhook actually configurable from the project page
dvcdsys May 20, 2026
d3c322b
fix(server): admin-gate sync switcher + preserve manual webhooks
dvcdsys May 20, 2026
3bd1d4e
feat(server): Sync + Force Stop for external projects
dvcdsys May 20, 2026
65a0701
fix(dashboard): stop vite build from deleting dist/.gitkeep
dvcdsys May 20, 2026
1e676b8
feat(dashboard): live indexing progress for external projects
dvcdsys May 20, 2026
82fa246
fix(dashboard): use stable composite key for current-files list
dvcdsys May 20, 2026
989fe48
feat(dashboard): confirm before full reindex
dvcdsys May 20, 2026
bb42a05
feat(config): CIX_REPOS_DIR to set the GitHub clone directory
dvcdsys May 20, 2026
21d243d
sync btn on project card
dvcdsys May 21, 2026
e275c4a
feat(auth): ownership + view-group access model and per-machine proje…
dvcdsys May 22, 2026
626894b
fix(server/cuda): pin llama.cpp by digest + copy all /app libs
dvcdsys May 22, 2026
58846a8
ci(server/cuda): warn when the pinned llama.cpp digest goes stale
dvcdsys May 22, 2026
e4d1ab3
fix(httpapi): admin-gate tunnels read endpoints and webhooks/origin
dvcdsys May 25, 2026
b51c454
fix(dashboard): hide GitHub Integration page + Add-repo button from n…
dvcdsys May 25, 2026
46059ac
fix(httpapi): gate ListProjectWorkspaces on project access + filter t…
dvcdsys May 25, 2026
5025ebb
fix(httpapi): expose owner_user_id in project + workspace JSON responses
dvcdsys May 25, 2026
7ef6888
fix(openapi): make owner_user_id required-but-nullable on Project + W…
dvcdsys May 25, 2026
4fd85de
fix(httpapi): allow group-shared users to read /projects/{hash}/index…
dvcdsys May 25, 2026
4536ac1
fix(server/deps): bump x/crypto v0.52.0 + Go 1.25.10 to clear 9 govul…
dvcdsys May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"$schema": "https://json.schemastore.org/claude-code-marketplace.json",
"name": "code-index",
"owner": {
"name": "dvcdsys",
"email": "dvcdsys@gmail.com"
},
"description": "Marketplace for cix — semantic code search and navigation tooling for Claude Code",
"plugins": [
{
"name": "cix",
"source": "./plugins/cix",
"description": "Semantic code search and navigation. Bundles the cix CLI, slash commands, behavioral hooks, and the experimental cix-workspace skill + cix-workspace-investigator sub-agent for cross-project research across cix workspaces.",
"author": {
"name": "dvcdsys"
},
"homepage": "https://github.com/dvcdsys/code-index",
"repository": "https://github.com/dvcdsys/code-index",
"license": "MIT",
"keywords": ["search", "code-search", "semantic", "navigation", "indexing", "embeddings", "workspace", "cross-project", "sub-agent"],
"category": "developer-tools",
"tags": ["search", "indexing", "ai", "embeddings", "workspace", "cross-project"]
}
]
}
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ CIX_PORT=21847
CIX_CHROMA_PERSIST_DIR=~/.cix/data/chroma
CIX_SQLITE_PATH=~/.cix/data/sqlite/projects.db
CIX_GGUF_CACHE_DIR=~/.cix/data/models
# Base dir for cloned GitHub repos (each clone lives at <dir>/repos/<hash>/).
# Defaults to <CIX_SQLITE_PATH parent>/repos. Point at a dedicated volume —
# cloned repos can be large. (Legacy alias: CIX_WORKSPACES_DATA_DIR.)
# CIX_REPOS_DIR=/data/cix-repos

# ── Indexing ──────────────────────────────────────────────────────────────
CIX_EMBEDDING_MODEL=awhiteside/CodeRankEmbed-Q8_0-GGUF
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ name: "CI: CLI"

on:
push:
branches: [main]
branches: [main, develop]
paths:
- "cli/**"
- ".github/workflows/ci-cli.yml"
pull_request:
branches: [main]
branches: [main, develop]
paths:
- "cli/**"
- ".github/workflows/ci-cli.yml"
Expand Down
78 changes: 78 additions & 0 deletions .github/workflows/ci-plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Plugin Tests

# Trigger only when plugin files change — server/CLI/dashboard work
# is unaffected and shouldn't run plugin tests. Branch list matches
# ci-cli.yml / ci-server.yml so plugin work lands on equal footing
# (the integration branch is `develop`, not feature branches).
on:
push:
branches: [main, develop]
paths:
- 'plugins/cix/**'
- '.claude-plugin/**'
- '.github/workflows/ci-plugin.yml'
pull_request:
branches: [main, develop]
paths:
- 'plugins/cix/**'
- '.claude-plugin/**'
- '.github/workflows/ci-plugin.yml'

# Minimum permissions required by the workflow (CodeQL workflow-permissions advisory).
# Read-only on repo contents is enough — we don't push code, comments, or releases.
permissions:
contents: read

jobs:
test:
name: bats + shellcheck on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]

steps:
- uses: actions/checkout@v4

- name: Install bats, jq, shellcheck (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y bats jq shellcheck

- name: Install bats, jq, shellcheck (macOS)
if: runner.os == 'macOS'
run: |
brew install bats-core jq shellcheck

- name: Verify bats version
run: bats --version

- name: Run bats test suites
run: bats --tap plugins/cix/tests/*.bats

- name: ShellCheck on hook scripts
run: |
# `--severity=warning` filters out style nags; `-x` follows
# sourced files (we don't source any in v0.1, but defensive).
shellcheck --severity=warning plugins/cix/scripts/*.sh

- name: Validate JSON manifests with jq
run: |
jq . .claude-plugin/marketplace.json
jq . plugins/cix/.claude-plugin/plugin.json
jq . plugins/cix/hooks/hooks.json

- name: Verify symlink integrity
run: |
# The bin/cix symlink MUST point at scripts/cix-wrapper.sh.
if [[ ! -L plugins/cix/bin/cix ]]; then
echo "::error::plugins/cix/bin/cix is not a symlink"
exit 1
fi
target=$(readlink plugins/cix/bin/cix)
if [[ "$target" != "../scripts/cix-wrapper.sh" ]]; then
echo "::error::bin/cix points to '$target' (expected '../scripts/cix-wrapper.sh')"
exit 1
fi
4 changes: 2 additions & 2 deletions .github/workflows/ci-server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ name: "CI: Server"

on:
push:
branches: [main]
branches: [main, develop]
paths:
- "server/**"
- ".github/workflows/ci-server.yml"
pull_request:
branches: [main]
branches: [main, develop]
paths:
- "server/**"
- ".github/workflows/ci-server.yml"
Expand Down
65 changes: 65 additions & 0 deletions .github/workflows/llama-pin-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: "llama.cpp pin freshness"

# The CUDA image pins ghcr.io/ggml-org/llama.cpp:server-cuda by digest for
# reproducible builds (see server/Dockerfile.cuda). That pin would otherwise
# rot silently. This job checks weekly whether upstream has shipped a newer
# build and, if so, opens (or updates) a tracking issue so the bump doesn't
# get forgotten. The same check also runs on every CUDA image build as a
# build-log annotation — this workflow is the persistent, can't-miss reminder.
on:
schedule:
- cron: "0 8 * * 1" # Mondays 08:00 UTC
workflow_dispatch:

permissions:
contents: read
issues: write

jobs:
check:
name: Check pinned llama.cpp digest
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Buildx
uses: docker/setup-buildx-action@v3
Comment thread
dvcdsys marked this conversation as resolved.
Dismissed

- name: Compare pinned vs upstream digest
id: check
run: server/scripts/check-llama-pin.sh server/Dockerfile.cuda

- name: Open or update reminder issue
if: steps.check.outputs.stale == 'true'
env:
GH_TOKEN: ${{ github.token }}
PINNED: ${{ steps.check.outputs.pinned }}
CURRENT: ${{ steps.check.outputs.current }}
run: |
set -euo pipefail
title="chore(server/cuda): bump pinned llama.cpp digest"
body="$(cat <<EOF
Upstream \`ghcr.io/ggml-org/llama.cpp:server-cuda\` has moved past the digest pinned in \`server/Dockerfile.cuda\`.

| | digest |
|---|---|
| pinned | \`${PINNED}\` |
| current | \`${CURRENT}\` |

### To update
1. Bump the \`FROM ghcr.io/ggml-org/llama.cpp:server-cuda@sha256:…\` digest in \`server/Dockerfile.cuda\` to \`${CURRENT}\`.
2. \`cd server && make scout-cuda\` to rebuild + scan (the shared-lib layout may have changed — the Dockerfile copies all \`/app/*.so*\` to stay robust).
3. Confirm \`/app/llama-server\` still resolves all libs, then promote.

_Auto-filed by the weekly \`llama.cpp pin freshness\` workflow._
EOF
)"
existing="$(gh issue list --state open --search "$title in:title" --json number --jq '.[0].number // empty')"
if [ -n "$existing" ]; then
echo "Updating existing issue #$existing"
gh issue comment "$existing" --body "$body"
else
echo "Opening new reminder issue"
gh issue create --title "$title" --body "$body"
fi
136 changes: 136 additions & 0 deletions .github/workflows/prerelease-cli.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
name: "Pre-release: CLI (develop)"

# Triggered on push to `develop` (i.e. PR merges; direct pushes are blocked
# by branch protection) with CLI-touching changes. Force-updates the floating
# `cli/develop` GitHub release with fresh artifacts for all four platforms so
# `install-develop.sh` always pulls the latest develop build.
#
# Stable releases live under `cli/v*` and are handled by release-cli.yml —
# this workflow never touches those tags. The floating tag has no leading
# `v`, so install.sh's `^cli/v` filter naturally ignores it.
on:
push:
branches: [develop]
paths:
- "cli/**"
- ".github/workflows/prerelease-cli.yml"

permissions:
contents: write

jobs:
build:
name: Build (${{ matrix.target }})
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- target: linux-amd64
runner: ubuntu-latest
goos: linux
goarch: amd64
cgo: "0"
- target: linux-arm64
runner: ubuntu-latest
goos: linux
goarch: arm64
cgo: "0"
- target: darwin-amd64
runner: macos-latest
goos: darwin
goarch: amd64
cgo: "1"
- target: darwin-arm64
runner: macos-latest
goos: darwin
goarch: arm64
cgo: "1"
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: cli/go.mod
cache-dependency-path: cli/go.sum

- name: Build
working-directory: cli
env:
GOOS: ${{ matrix.goos }}
GOARCH: ${{ matrix.goarch }}
CGO_ENABLED: ${{ matrix.cgo }}
run: |
# Stamp short SHA so `cix --version` distinguishes one dev build
# from another even though the tag is floating.
VERSION="develop-${GITHUB_SHA::7}"
go build \
-ldflags="-s -w -X 'github.com/anthropics/code-index/cli/cmd.Version=${VERSION}'" \
-o "dist/cix" .

- name: Package
working-directory: cli/dist
run: |
tar -czf "cix-${{ matrix.target }}.tar.gz" cix
rm cix

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: cix-${{ matrix.target }}
path: cli/dist/cix-${{ matrix.target }}.tar.gz

release:
name: Publish develop release
needs: [build]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true

- name: Compute checksums
working-directory: artifacts
run: sha256sum * > checksums.txt

- name: Delete previous develop release + tag
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# `|| true` because the release/tag may not exist on the first run.
gh release delete cli/develop \
--cleanup-tag --yes \
--repo "${{ github.repository }}" || true

- name: Create develop release
uses: softprops/action-gh-release@v2
Comment thread
dvcdsys marked this conversation as resolved.
Dismissed
with:
tag_name: cli/develop
target_commitish: develop
name: "CLI develop (${{ github.sha }})"
prerelease: true
make_latest: "false"
files: |
artifacts/*.tar.gz
artifacts/checksums.txt
body: |
**Floating develop release** — force-updated on every merge to
`develop` that touches `cli/**`. Not a stable release.

Built from commit ${{ github.sha }}.

## Install

```bash
curl -fsSL https://raw.githubusercontent.com/dvcdsys/code-index/main/install-develop.sh | bash
```

Re-run the same command later to pick up the next develop build.
For stable, use [`install.sh`](https://github.com/dvcdsys/code-index/blob/main/install.sh) instead.
Loading
Loading