-- Generated by eval/release/rockspec.lua — edit the template there, then regenerate.
rockspec_format = "3.0"
package = "luamemo"
version = "0.5.1-1"

source = {
    url = "git+https://github.com/kaio326/luamemo.git",
    tag = "v0.5.1",
}

description = {
    summary  = "Private, local memory for AI agents — an MCP server, with the memo CLI to set it up and govern it",
    detailed = [[
        luamemo gives AI coding agents a memory that lives on your machine. The
        agent writes decisions, facts and plans as it works and finds them again
        in later sessions, through the Model Context Protocol: Claude Code,
        VS Code (Copilot agent mode), Cursor, Claude Desktop and other MCP
        clients use it — every client with the same entry, `memo mcp`. The
        `memo` CLI sets it up and keeps the decisions that belong to people:
        settings, backups, which devices join a team's memory and which
        knowledge the team shares.

        No database server, no Docker, no account: each project's memory is one
        SQLite file in ~/.local/share/luamemo. Runs on LuaJIT with two system
        libraries, libsqlite3 and libsodium (Linux, macOS, Windows through WSL).

          * MCP server (`memo mcp`, 27 tools; MCP 2026-07-28 and earlier
            revisions): write, search (with the knowledge-graph facts the query
            is about), the session brief, recent, update, delete (bulk deletes
            behind a preview + confirmation token), session promotion,
            maintenance, feedback, the learned reranker, the codebase map, the
            secrets vault — and its usage rules, sent to every client.
          * Hybrid search, exact at every size: every vector in scope is scored,
            plus FTS5 full-text ranking, blended and weighted by importance, age
            and tier; multi-scope search, time and metadata filters, rerankers.
          * Embedders: an in-process GGUF model (EmbeddingGemma via llama.cpp,
            no service), Ollama, TEI, OpenAI / Voyage / Cohere / any
            OpenAI-compatible endpoint, and a pure-Lua hash embedder.
          * Codebase index (`memo index`): files, symbols, dependencies and
            commit diffs, so an agent finds where code lives before grepping.
          * Learns from use (opt-in): corrections, rules, praise and retrieval
            misses train a per-scope reranker, promoted only when it beats the
            current one on held-out data.
          * Secrets vault (libsodium): agents use keys via secret_execute
            without ever seeing them.
          * Team memory on your LAN / VPN: an org central, admin-reviewed
            knowledge, devices paired with a key and a spoken code.
          * `memo config` (every setting checked before it is written),
            `memo backup`, `memo export` / `memo import`.
    ]],
    homepage   = "https://github.com/kaio326/luamemo",
    issues_url = "https://github.com/kaio326/luamemo/issues",
    license    = "MIT",
    maintainer = "Kaio Fernandes <contact@kaiofernandes.com>",
    labels     = { "memory", "agents", "ai", "mcp", "embeddings", "rag",
                   "sqlite", "luajit", "ffi", "libsodium", "secrets", "temporal",
                   "code-index", "code-search", "ctags", "federation" },
}

dependencies = {
    -- luamemo runs on LuaJIT (its FFI reaches libsqlite3 and libsodium; memo starts
    -- luajit itself and says what to install when it or a library is missing). Lua
    -- 5.1, not "luajit": the LuaRocks most systems package runs on Lua 5.1 and could
    -- never provide "luajit" — the rock would not install.
    "lua ~> 5.1",
    -- lua-cjson is optional (the bundled dkjson is the fallback); luasec only for https.
    "luasocket >= 3.0",
}

build = {
    type    = "builtin",
    modules = {
        ["luamemo"]                            = "luamemo/init.lua",
        ["luamemo.adapters.anthropic"]         = "luamemo/adapters/anthropic.lua",
        ["luamemo.adapters.cohere"]            = "luamemo/adapters/cohere.lua",
        ["luamemo.adapters.deepseek"]          = "luamemo/adapters/deepseek.lua",
        ["luamemo.adapters.generic"]           = "luamemo/adapters/generic.lua",
        ["luamemo.adapters.ollama"]            = "luamemo/adapters/ollama.lua",
        ["luamemo.adapters.openai"]            = "luamemo/adapters/openai.lua",
        ["luamemo.adapters.openai_compatible"] = "luamemo/adapters/openai_compatible.lua",
        ["luamemo.adapters.tei"]               = "luamemo/adapters/tei.lua",
        ["luamemo.adapters.voyage"]            = "luamemo/adapters/voyage.lua",
        ["luamemo.async"]                      = "luamemo/async.lua",
        ["luamemo.brief"]                      = "luamemo/brief.lua",
        ["luamemo.cli._common"]                = "luamemo/cli/_common.lua",
        ["luamemo.cli.api"]                    = "luamemo/cli/api.lua",
        ["luamemo.cli.backup"]                 = "luamemo/cli/backup.lua",
        ["luamemo.cli.calibrate"]              = "luamemo/cli/calibrate.lua",
        ["luamemo.cli.config"]                 = "luamemo/cli/config.lua",
        ["luamemo.cli.doctor"]                 = "luamemo/cli/doctor.lua",
        ["luamemo.cli.export"]                 = "luamemo/cli/export.lua",
        ["luamemo.cli.gguf"]                   = "luamemo/cli/gguf.lua",
        ["luamemo.cli.import"]                 = "luamemo/cli/import.lua",
        ["luamemo.cli.index"]                  = "luamemo/cli/index.lua",
        ["luamemo.cli.org"]                    = "luamemo/cli/org.lua",
        ["luamemo.cli.ping"]                   = "luamemo/cli/ping.lua",
        ["luamemo.cli.probe"]                  = "luamemo/cli/probe.lua",
        ["luamemo.cli.recommend"]              = "luamemo/cli/recommend.lua",
        ["luamemo.cli.serve"]                  = "luamemo/cli/serve.lua",
        ["luamemo.clients"]                    = "luamemo/clients.lua",
        ["luamemo.consolidate"]                = "luamemo/consolidate.lua",
        ["luamemo.db"]                         = "luamemo/db.lua",
        ["luamemo.digest"]                     = "luamemo/digest.lua",
        ["luamemo.embed"]                      = "luamemo/embed.lua",
        ["luamemo.embedders.gguf_ffi"]         = "luamemo/embedders/gguf_ffi.lua",
        ["luamemo.embedders.hash"]             = "luamemo/embedders/hash.lua",
        ["luamemo.embedders.hash_learned"]     = "luamemo/embedders/hash_learned.lua",
        ["luamemo.embedders.native.bundle"]    = "luamemo/embedders/native/bundle.lua",
        ["luamemo.embedders.native.bundles"]   = "luamemo/embedders/native/bundles.lua",
        ["luamemo.embedders.native.ffi_shim"]  = "luamemo/embedders/native/ffi_shim.lua",
        ["luamemo.embedders.projected"]        = "luamemo/embedders/projected.lua",
        ["luamemo.federation.adopt"]           = "luamemo/federation/adopt.lua",
        ["luamemo.federation.aggregate"]       = "luamemo/federation/aggregate.lua",
        ["luamemo.federation.central"]         = "luamemo/federation/central.lua",
        ["luamemo.federation.channel"]         = "luamemo/federation/channel.lua",
        ["luamemo.federation.client"]          = "luamemo/federation/client.lua",
        ["luamemo.federation.common"]          = "luamemo/federation/common.lua",
        ["luamemo.federation.devs"]            = "luamemo/federation/devs.lua",
        ["luamemo.federation.directives"]      = "luamemo/federation/directives.lua",
        ["luamemo.federation.handlers"]        = "luamemo/federation/handlers.lua",
        ["luamemo.federation.identity"]        = "luamemo/federation/identity.lua",
        ["luamemo.federation.keys"]            = "luamemo/federation/keys.lua",
        ["luamemo.federation.knowledge"]       = "luamemo/federation/knowledge.lua",
        ["luamemo.federation.policy"]          = "luamemo/federation/policy.lua",
        ["luamemo.federation.proposals"]       = "luamemo/federation/proposals.lua",
        ["luamemo.federation.registry"]        = "luamemo/federation/registry.lua",
        ["luamemo.federation.server"]          = "luamemo/federation/server.lua",
        ["luamemo.federation.sessions"]        = "luamemo/federation/sessions.lua",
        ["luamemo.feedback"]                   = "luamemo/feedback.lua",
        ["luamemo.fts"]                        = "luamemo/fts.lua",
        ["luamemo.http"]                       = "luamemo/http.lua",
        ["luamemo.index"]                      = "luamemo/index/init.lua",
        ["luamemo.index.checksum"]             = "luamemo/index/checksum.lua",
        ["luamemo.index.ctags"]                = "luamemo/index/ctags.lua",
        ["luamemo.index.differ"]               = "luamemo/index/differ.lua",
        ["luamemo.index.digester"]             = "luamemo/index/digester.lua",
        ["luamemo.index.format"]               = "luamemo/index/format.lua",
        ["luamemo.index.parser"]               = "luamemo/index/parser.lua",
        ["luamemo.index.parsers.common"]       = "luamemo/index/parsers/common.lua",
        ["luamemo.index.parsers.javascript"]   = "luamemo/index/parsers/javascript.lua",
        ["luamemo.index.parsers.lua"]          = "luamemo/index/parsers/lua.lua",
        ["luamemo.index.parsers.python"]       = "luamemo/index/parsers/python.lua",
        ["luamemo.index.resolver"]             = "luamemo/index/resolver.lua",
        ["luamemo.index.walker"]               = "luamemo/index/walker.lua",
        ["luamemo.json"]                       = "luamemo/json.lua",
        ["luamemo.kg"]                         = "luamemo/kg.lua",
        ["luamemo.learner_store"]              = "luamemo/learner_store.lua",
        ["luamemo.native.loader"]              = "luamemo/native/loader.lua",
        ["luamemo.native.sodium"]              = "luamemo/native/sodium.lua",
        ["luamemo.native.sqlite"]              = "luamemo/native/sqlite.lua",
        ["luamemo.netguard"]                   = "luamemo/netguard.lua",
        ["luamemo.ops"]                        = "luamemo/ops.lua",
        ["luamemo.patterns"]                   = "luamemo/patterns.lua",
        ["luamemo.projection_train"]           = "luamemo/projection_train.lua",
        ["luamemo.promote"]                    = "luamemo/promote.lua",
        ["luamemo.rerank"]                     = "luamemo/rerank.lua",
        ["luamemo.rerank_train"]               = "luamemo/rerank_train.lua",
        ["luamemo.rerankers._common"]          = "luamemo/rerankers/_common.lua",
        ["luamemo.rerankers.cross_encoder"]    = "luamemo/rerankers/cross_encoder.lua",
        ["luamemo.rerankers.learned"]          = "luamemo/rerankers/learned.lua",
        ["luamemo.rerankers.noop"]             = "luamemo/rerankers/noop.lua",
        ["luamemo.rerankers.ollama"]           = "luamemo/rerankers/ollama.lua",
        ["luamemo.rerankers.openai"]           = "luamemo/rerankers/openai.lua",
        ["luamemo.schema"]                     = "luamemo/schema.lua",
        ["luamemo.secrets"]                    = "luamemo/secrets.lua",
        ["luamemo.sensing"]                    = "luamemo/sensing/init.lua",
        ["luamemo.sensing.extract"]            = "luamemo/sensing/extract.lua",
        ["luamemo.sensing.generate"]           = "luamemo/sensing/generate.lua",
        ["luamemo.sensing.heuristics"]         = "luamemo/sensing/heuristics.lua",
        ["luamemo.settings"]                   = "luamemo/settings.lua",
        ["luamemo.store"]                      = "luamemo/store.lua",
        ["luamemo.summarizer"]                 = "luamemo/summarizer.lua",
        ["luamemo.summarizers._common"]        = "luamemo/summarizers/_common.lua",
        ["luamemo.summarizers.noop"]           = "luamemo/summarizers/noop.lua",
        ["luamemo.summarizers.ollama"]         = "luamemo/summarizers/ollama.lua",
        ["luamemo.summarizers.openai"]         = "luamemo/summarizers/openai.lua",
        ["luamemo.temporal"]                   = "luamemo/temporal.lua",
        ["luamemo.transfer"]                   = "luamemo/transfer.lua",
        ["luamemo.tune_weights"]               = "luamemo/tune_weights.lua",
        ["luamemo.util"]                       = "luamemo/util.lua",
        ["luamemo.vectors"]                    = "luamemo/vectors.lua",
        ["luamemo.vendor.dkjson"]              = "luamemo/vendor/dkjson.lua",
    },
    install = {
        bin = { ["memo"] = "cli/memo" },
    },
    -- mcp/: the server and its usage rules (instructions.md); hooks/: the Claude Code
    -- capture hooks; luamemo/embedders/native: the GGUF shim's source and build.sh
    -- (built on demand — a built gguf_shim.so is never shipped).
    copy_directories = { "examples", "hooks", "mcp", "luamemo/embedders/native" },
}
