Contributions to QQL are welcome. This guide covers how to set up your environment, the project structure, and the PR workflow.
Project Structure
Section titled “Project Structure”cmd/qql-go/ CLI entrypointinternal/ ast/ AST node definitions lexer/ Tokenizer parser/ Pratt parser filters/ WHERE clause → Qdrant Filter conversion cli/commands/ Command handlers repl/ Interactive REPL embedding/ OpenAI-compatible embedding client sparse/ BM25 sparse vector generation script/ .qql script execution dump/ Collection dump config/ Connection config persistence pipeline/ DAG node types convert/ REST JSON → QQL converterpkg/qql/ Public Go SDKserver/ Connect RPC gatewayproto/ Protobuf service definitiongen/ Generated protobuf Go codesdks/python/ Python SDKsdks/typescript/ TypeScript SDKskills/qql-skill/ Agent skill packageexamples/ Runnable example workflowsdocs/ Reference documentationdocs-ui/ Documentation site source (you are here)Development Setup
Section titled “Development Setup”See Development Guide for the full setup.
git clone https://github.com/srimon12/qql-go.git cd qql-go go test ./... go build ./cmd/qql-goIssue Guidelines
Section titled “Issue Guidelines”Before submitting a new issue:
- Check existing issues and the CHANGELOG for your concern
- Search the codebase if it looks like a missing feature
Bug reports should include:
- QQL version (
qql-go version) - Qdrant version
- The QQL statement that caused the issue
- Expected vs actual behavior
- Any error output
Feature requests should describe the use case, not just the solution.
PR Workflow
Section titled “PR Workflow”- Fork the repository
- Create a branch:
feat/<your-feature>orfix/<issue-number>-description - Write tests
- Run
gofmt,go vet, andgo test ./... - Open a pull request against
main
PR Requirements
Section titled “PR Requirements”- All tests pass (
go test ./...) - No
gofmtdifferences go vetclean- New features include parser/executor/pipeline tests
- New syntax additions update
docs/syntax.mdandskills/qql-skill/SKILL.md
Parser Contribution Guide
Section titled “Parser Contribution Guide”The parser is a recursive descent Pratt parser in internal/parser/. When adding a new statement:
- Add the token kind(s) to
internal/lexer/ - Add the AST node to
internal/ast/ - Add the parse function in
internal/parser/ - Add the executor case in
internal/cli/commands/executor.go - Add tests in
internal/parser/parse_*_test.go
Code Style
Section titled “Code Style”gofmt— always- No
reflectin hot paths (parser, filters, pipeline) - No allocations in keyword lookup (use
asciiEqual/asciiEqualLower) - Add
_test.gofiles alongside every new internal package - Comments in exported functions and types