LuminaCode is a local general-purpose Agent. It uses a Go backend and a TypeScript TUI, with project context, tools, skills, MCP, memory, sessions, and Agent Teams.
概要
LuminaCode is a local general-purpose Agent. It uses a Go backend and a TypeScript TUI, with project context, tools, skills, MCP, memory, sessions, and Agent Teams.
README
LuminaCode
LuminaCode is a local general-purpose Agent. It uses a Go backend and a TypeScript TUI, with project context, tools, skills, MCP, memory, sessions, and Agent Teams.
Agent Capabilities
- Uses the launch directory as the default project root.
- Reads
LUMINA.md/AGENTS.md, with user-level fallback under/config/instructions. - Loads project, user, and bundled skills.
- Runs file, shell, web, MCP, memory, and task tools with permission controls.
- Keeps resumable sessions with transcript, state, tasks, tool results, skill recovery, and session memory.
- Records runtime activity as ordered, replayable events with crash recovery and idempotent submit commands.
- Supports OpenAI-compatible and Anthropic-compatible streaming APIs.
- Keeps visible chat separate from tool payloads, tool results, and runtime records.
- Supports sub-agents, Agent Teams, headless mode, and benchmark harnesses.
Architecture
The installed command is split into two processes:
lumina: the TypeScript terminal frontend and default user entry point.lumina-backend: the Go runtime that owns agent execution, tools, skills, MCP, memory, sessions, and headless/benchmark modes.
Interactive sessions use localhost WebSocket:
/state/run/backend.json
The backend listens on 127.0.0.1, requires an auth token, supports multiple
sessions, and serializes submits within each session. Headless paths are handled
by lumina-backend.
Durable Runtime Journal
Each interactive session has one authoritative SQLite journal:
/data/sessions/active/{session-id}/runtime.sqlite
The journal uses WAL mode and records session, run, step, message, model, tool, task, Team, memory, usage, warning, and checkpoint events. Events have a global sequence and a per-stream sequence; optimistic stream checks prevent conflicting writes. Large payloads can be stored in a content-addressed blob table, while rebuildable projections and consumer offsets track replay progress.
Runtime behavior is assembled through typed capabilities and deterministic hooks. Memory preparation, skill context, MCP registration, context compilation, model responses, permissions, tools, and sub-agents share the same session scope without being coupled to the TUI.
The WebSocket protocol publishes durable v3 events with their journal sequence.
If the TUI detects a gap, it calls session.events and reduces the missing
events before applying the live event. Submit commands carry an idempotency key,
so reconnect retries return the original result instead of starting duplicate
runs.
On resume, open runs, steps, and tools are closed with explicit interrupted events. Task state is rebuilt from lifecycle events, and Team child streams use lossless runtime checkpoints. Older JSON/JSONL session files and Team sidecars are imported once with a backup; new sessions do not create those sidecars.
Multi-instance cluster mode
Local mode remains the default and continues to use the SQLite runtime journal above. Cluster mode is explicit and fail-closed:
- PostgreSQL is the durable source of truth for Session streams, events, checkpoints, command results, blobs, consumer offsets, Team checkpoints, and Memory Fabric data.
- Redis stores expiring instance registrations and Session leases, monotonically increasing fencing tokens, Redis Streams RPC envelopes, and low-latency event notifications. Pub/Sub is never treated as durable state.
- Any Hertz gateway can accept a WebSocket and transparently forward work to the Session owner. Team, sub-agent, permission, artifact, and A2A work inherits the parent’s owner and fencing token.
- Every PostgreSQL runtime write checks its fencing token, so a former owner cannot commit after another instance takes ownership.
- The TUI uses UUID request IDs and
Authorization: Bearer. It reconnects to any gateway for up to 30 seconds, resumes the Session, fills event gaps by sequence, and retries confirmed mutations with the same UUID. /healthzreports liveness./readyzadditionally checks Redis, PostgreSQL, schema state, and instance registration.
Configure cluster mode in user settings.json or with the corresponding
LUMINA_* environment variables:
{
"session_runtime_backend": "cluster",
"memory_fabric_store": "postgres",
"cluster_id": "production",
"instance_id": "backend-1",
"cluster_listen_addr": "0.0.0.0:8080",
"cluster_advertise_addr": "backend-1:8080",
"redis_url": "redis://...",
"postgres_url": "postgres://...",
"jwt_issuer": "https://issuer.example",
"jwt_audience": "lumina",
"jwt_jwks_url": "https://issuer.example/.well-known/jwks.json"
}
Connection URLs, private keys, and JWTs must come from user settings or a
secret manager; they are not written to defaults, endpoint files, or
diagnostics. JWT validation accepts only RS256, ES256, and EdDSA and requires
exp, iss, aud, sub, and the tenant claim. Reads and writes require
lumina:session:read and lumina:session:write; shutdown and drain require
lumina:admin.
For a local multi-process cluster, generate an Ed25519 key pair and admin token:
lumina-backend cluster init-local --tenant local
export LUMINA_JWT="$(cat /config/cluster/admin.jwt)"
export LUMINA_BACKEND_URL=ws://127.0.0.1:8080/v1/ws
PostgreSQL 15+ with pgvector 0.8.6+ and Redis 7.2+ are required. Runtime
dependencies are pinned to Hertz 0.10.6, go-redis 9.20.0, pgx 5.10.0,
pgvector-go 0.4.1, and golang-jwt 5.3.1. Hertz uses the Go standard transport
and its official HTTP adaptor around the existing gorilla/websocket handlers.
Repeatable schemas and deployment examples are under deploy/.
Cluster instances must see the same project workspace through shared persistent
storage or an external Git/object-storage workflow; source files and artifacts
are intentionally not stored in Redis or PostgreSQL.
Long-Term Memory
In local mode, Memory Fabric keeps durable cross-session state in two SQLite databases and builds a third, replaceable BGE-M3 retrieval index:
/data/memory/fabric/ledger.sqlite
/data/memory/fabric/index.sqlite
/data/memory/fabric/retrieval-bge-m3.sqlite
In cluster mode, the ledger, nodes, conflicts, resolutions, jobs, generated
FTS, semantic vector(1024), event-window halfvec(1024), learned-sparse
postings, graph edges, and index build state are tenant/project-scoped in
PostgreSQL. Spaces below 50,000 vectors use exact cosine search; larger spaces
use HNSW with request-scaled ef_search. Model changes rebuild derived indexes
without rewriting durable evidence.
Memory Write Flow
- Durable evidence ingest commits visible user, assistant, and tool events as immutable, source-addressable ledger rows before any semantic work.
- Context and provenance binding records the project space, context, session, actor, timestamp, turn order, checksum, and source offsets needed to reconstruct each event.
- Semantic compilation optionally uses the configured API model to select durable memories and produce grounded nodes, identities, slots, temporal scope, retrieval cues, and conflict candidates. Every node must cite source events and pass local grounding validation.
- Conflict resolution applies local authority and time rules to clear updates. Ambiguous cases remain pending or use the configured adjudicator; raw evidence is never overwritten.
- Local BGE-M3 indexing creates dense vectors and the event/span dense, learned-sparse, FTS, and graph representations used by retrieval.
- Recoverable publication checkpoints background jobs and atomically publishes derived indexes. Model, tokenizer, or schema changes rebuild derived data from the ledger without re-ingesting the conversation.
Memory Retrieval Flow
Retrieval is fully local and runs the same pipeline for every ordinary natural-language query:
- Alignment verifies the retrieval index model, tokenizer, schema, and ledger checksum, then incrementally catches up missing events when needed.
- Query encoding produces BGE-M3 dense, learned-sparse, and full-token representations.
- Candidate recall runs span FTS5, event dense, and learned-sparse channels, each with up to 128 candidates.
- Fusion and graph expansion use reciprocal-rank fusion for the recall pool and Personalized PageRank over event, context, semantic, and sparse-concept links.
- Exact span scoring applies BGE-M3 dense, learned-sparse, and full-token
ColBERT MaxSim with the fixed
1.0 : 0.3 : 1.0fusion. - Evidence selection deduplicates source events and uses a submodular objective to maximize relevance and coverage under the configured item and token budgets.
- Context assembly applies reference-time and conflict-state filters, groups evidence coherently, and preserves timestamps, actors, contexts, source IDs, and span positions for the answer model.
Identifiers, paths, and quoted text are lexical candidate features only; query content never routes around BGE-M3. Search has no remote query expansion, question-type routing, benchmark-specific entities, or local answer bypass.
LongMemEval-S
On the complete 500-question LongMemEval-S full-haystack evaluation,
LuminaCode’s Memory Fabric, using local BGE-M3 retrieval, scored
83.00% (415/500) with mimo-v2.5-pro as both answer model and official
evaluator.
| Question type | Correct | Accuracy |
|---|---|---|
| Knowledge update | 74/78 | 94.87% |
| Single-session user | 65/70 | 92.86% |
| Temporal reasoning | 114/133 | 85.71% |
| Multi-session | 103/133 | 77.44% |
| Single-session assistant | 40/56 | 71.43% |
| Single-session preference | 19/30 | 63.33% |
End-to-end retrieval averaged 1.02 seconds (P50 0.99 seconds, P95 1.29 seconds).
Published LongMemEval accuracy, sorted for orientation:
| System | Accuracy | Reported evaluation |
|---|---|---|
| Exabase M-1 | 96.4% | Gemini 3 Flash, Top 50; vendor-reported |
| Mastra Observational Memory | 94.87% | GPT-5-mini; open implementation and runner |
| Mem0 Platform | 94.8% | Mem0 current benchmark, Top 50 |
| Honcho | 92.6% | Publicly reported; full run configuration not disclosed |
| Engram | 91.6% | GPT-5 composer, GPT-4o judge; prompt and run artifacts published |
| Hindsight | 91.4% | Gemini 3 Pro; benchmark repository published |
| HydraDB | 90.79% | Gemini 3 Pro; paper-reported |
| LuminaCode (LongMemEval-S) | 83.0% | Full haystack; mimo-v2.5-pro answer and official evaluator; 500 questions |
| LiCoMemory | 73.8% | GPT-4o-mini, five-run mean |
| Mem0-G | 64.8% | GPT-4o-mini controlled baseline |
| Mem0 | 62.6% | GPT-4o-mini controlled baseline |
| Zep | 58.6% | GPT-4o-mini controlled baseline |
| A-Mem | 55.0% | GPT-4o-mini controlled baseline |
| MemOS | 51.2% | GPT-4o-mini controlled baseline |
Sources: LongMemEval, Mem0 benchmark, LiCoMemory paper, Mastra Observational Memory, Hindsight benchmarks, Engram benchmark, HydraDB paper, Honcho, and the Exabase M-1 announcement. Exabase and Honcho scores are included as publicly reported results with less complete reproduction material. Reader, retrieval depth, context budget, answer model, and judge differ across reports, so this table is not a strict apples-to-apples leaderboard.
Agent Team
Agent Team mode runs a task through isolated specialist agents. Each member has its own prompt, skills, context, task state, and A2A inbox/outbox while sharing the same backend runtime and tool system.
Commands:
/Team choose an installed team and enter Team mode
/TeamOut leave Team mode
/NewTeam create a new editable team template
The TUI shows Team dialogue as a group chat. Raw tool payloads, full tool results, MCP payloads, and hidden reasoning stay in runtime logs.
Runtime summary:
- Loop: observe -> plan -> dispatch -> agent work -> collect -> gate -> finalize.
- Stop policy: user interrupt or task complete.
- Failures become recovery inputs for the next loop.
- Ordinary Agent context and Team Agent contexts remain isolated.
- Team dialogue, activity, artifacts, gates, and member state are checkpointed
in child streams inside the parent session’s
runtime.sqlitejournal. - Existing file-based Team runtime data remains readable as a one-time migration source; new Team sessions do not write per-Team runtime directories.
Built-in Teams
Installed under /app/resources/teams/:
product-development: full-stack delivery withteam-leader,research,frontend,backend,qa,reviewer,devops, andux-design. Uses contract, QA, reviewer, task-policy, and follow-up/deferral gates.deep-research: research team withteam-leader,scope-planner,search-strategist,source-reader,evidence-analyst,report-writer,qa, andreviewer. Uses SearxNGWebSearch/WebFetchand arXiv MCP; can export report and evidence files.
Team lookup order is project .Lumina/TEAM, user /config/teams, then
installed /app/resources/teams.
Creating a Team
/NewTeam asks for a display name and creates:
/config/teams/{team_name}/
├── team.yaml
├── team-system.md
├── shared-prompt.md
├── completion-policy.md
└── team-leader/
├── agent.yaml
├── system.md
└── skills/
The template starts with only team-leader. Add new agent directories and list
their ids in team.yaml.
Team Configuration
Minimal team.yaml shape:
name: my-team
display_name: My Team
entry_agent: team-leader
loop:
max_iterations: 0
max_parallel_agents: 2
completion_policy: team_leader_only
stop_policy: user_interrupt_or_task_complete_only
gates:
require_contract: false
checks: []
transcript:
show_member_dialogue: true
show_tool_details: false
show_thinking: false
agents:
- team-leader
Agent agent.yaml:
name: team-leader
display_name: Team Leader
communicates_with: all
model: inherit
tools: inherit
max_turns_per_task: 0
private_skills: true
communicates_with can be all or a list of agent ids. Private skills live in
that agent’s skills/ directory.
Quick Start
Install the CLI:
# macOS/Linux
make install
On Windows PowerShell:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-windows.ps1
Start LuminaCode from any project directory:
cd /path/to/project
lumina
Single prompt:
lumina -p "Summarize this repository"
List sessions:
lumina --list
Resume:
lumina --resume
The launch directory is the default working directory.
API Configuration
No default model is hard-coded. Configure via env, flags, or
/config/settings.json:
export LUMINA_API_KEY="..."
export LUMINA_API_BASE_URL="https://api.deepseek.com/anthropic"
export LUMINA_API_MODEL="deepseek-v4-pro[1m]"
export LUMINA_API_TYPE="anthropic"
Generic LLM_* variables are also accepted; LUMINA_* wins. Equivalent flags:
lumina \
--api-key "$LUMINA_API_KEY" \
--base-url "https://api.deepseek.com/anthropic" \
--api-type anthropic \
--model "deepseek-v4-pro[1m]" \
--max-tokens 1000000
Configuration precedence is: compiled defaults, user
config/settings.json, project .Lumina/CONFIG/defaults.json, environment,
then CLI flags. Default paths are derived by apppaths and are not written to
user settings.
--api-type: anthropic, openai_compatible, or auto.
An optional global fallback can use a different endpoint and model:
{
"fallback_api_enabled": true,
"fallback_api_key": "...",
"fallback_api_base_url": "https://api.example.com/anthropic",
"fallback_api_model": "fallback-model",
"fallback_api_type": "anthropic"
}
After the primary client’s retries are exhausted, Lumina switches only for 429, 5xx, timeout, EOF, and transport failures. It does not hide invalid keys, invalid requests, or model configuration errors, and never switches after the primary stream has produced visible output or a tool call. Config changes are hot-read at the next turn.
--max-tokens is the local context-window size used for accounting and the 80%
compression threshold. LuminaCode does not force provider-side completion
max_tokens. Runtime config is hot-read before each agent turn.
Remote Memory Models
BGE-M3 embeddings and an optional reranker can use independent remote
OpenAI-compatible credentials in /config/settings.json:
{
"memory_bge_provider": "openai_compatible",
"memory_bge_api_key": "...",
"memory_bge_base_url": "https://models.example.com/v1",
"memory_bge_model": "BAAI/bge-m3",
"memory_reranker_enabled": true,
"memory_reranker_provider": "openai_compatible",
"memory_reranker_api_key": "...",
"memory_reranker_base_url": "https://models.example.com/v1",
"memory_reranker_model": "BAAI/bge-reranker-v2-m3"
}
The embedding service must implement POST /v1/embeddings and return
1024-dimensional float embeddings. The reranker uses an OpenAI-compatible
rerank extension with query, documents, and top_n; both /rerank and
/reranks responses may use results[].relevance_score or data[].score.
Alibaba Model Studio compatible-mode/v1 base URLs are normalized to its
documented compatible-api/v1/reranks endpoint.
Changing the embedding endpoint or model changes the retrieval fingerprint, so
derived vectors are rebuilt instead of mixing embedding spaces. API keys are
never included in that fingerprint or diagnostics.
These memory-model fields are read only from the user settings.json; project
defaults and environment variables cannot override them.
Project Instructions
Read order:
{cwd}/LUMINA.md{cwd}/AGENTS.md/config/instructions/LUMINA.md/config/instructions/AGENTS.md
All files are optional.
Skills
Skills are SKILL.md instruction packages loaded from:
{project_root}/skills/{project_root}/.Lumina/PROJECT_SKILLS//config/skills//app/resources/skills/
Invoked skill context is injected into the model request without entering the visible transcript.
/review inspect the authentication flow
Tools and Permissions
Tools cover file edits, shell, tasks, memory, web search/fetch, and MCP. Risky operations and project MCP servers can require approval.
MCP
Project MCP config: .mcp.json. Trust records:
/data/projects/{project-id}/trust/mcp.json
Use /mcp to inspect registered MCP tools.
Sessions and Runtime Data
AppRoot uses five ownership layers:
/
app/: atomically replaceable application payload and bundled resourcesconfig/: user settings, MCP config, instructions, skills, and teamsdata/: memory, sessions, project manifests/trust/team data, and legacy datastate/: endpoint, logs, services, migrations, and per-session tool resultscache/: models, downloads, and temporary rebuildable files
Project runtime data:
/data/projects/{project-id}/
project.jsontrust/mcp.jsonteams/(legacy Team runtime data, imported when encountered)
Project-authored resources:
{project_root}/skills/{project_root}/.Lumina/PROJECT_SKILLS/
Active session history uses /data/sessions/active by default; archived
sessions use /data/sessions/archive:
{session_dir}/{session_id}/
runtime.sqlite: authoritative event journal and runtime checkpointsmeta.json: small, rebuildable session-list projectionmigration-v2.json: migration report, when a legacy session was imported.migration-backup/v1/: preserved legacy source files, when imported
runtime.sqlite-wal and runtime.sqlite-shm can exist while the database is
open. Legacy transcript.jsonl, state.json, tasks.json,
skill-recovery*.json, and session.sqlite files are migration inputs rather
than the source of truth once runtime.sqlite exists.
Large background outputs:
/state/projects/{project-id}/tool-results/{session-id}/
Cluster migration is explicit and never dual-writes:
lumina-backend session migrate --from local --to cluster --tenant TENANT --all --dry-run
lumina-backend session migrate --from local --to cluster --tenant TENANT --all
lumina-backend session export --from cluster --to local --tenant TENANT --session ID --output NEW_DIR
lumina-backend memory migrate --from sqlite --to postgres --tenant TENANT --project PROJECT --dry-run
lumina-backend memory migrate --from sqlite --to postgres --tenant TENANT --project PROJECT
lumina-backend memory export --from postgres --to sqlite --tenant TENANT --project PROJECT --output NEW_DIR
Migration copies durable facts only, validates counts and canonical checksums, then rebuilds FTS/vector/sparse derived indexes with the current models. Source SQLite files remain in place and receive a read-only migration marker only after target verification. Export always requires a new directory.
CLI Reference
lumina [flags]
lumina starts the TS frontend. Direct backend usage:
lumina-backend -p "Summarize this repository"
lumina-backend --list
lumina-backend daemon --host 127.0.0.1 --port 0
Inspect the runtime assembly and event journal:
lumina-backend runtime dump --session
lumina-backend session migrate --check [--session ]
lumina-backend session migrate --all [--session ]
lumina-backend session migrate --status [--session ]
Common flags:
-p,-prompt: run a single prompt and exit-resume: resume a previous session by ID-list: list saved sessions-cwd: explicitly set the working directory-model: model name-api-key: API key-base-url: API base URL-api-type:openai_compatible,anthropic, orauto-max-tokens: context-window token limit used for local accounting-yolo: skip permission prompts and OS sandbox isolation-bare: disable auto-memory and other persistent features-verbose,-v: enable debug output
Interactive mode uses the TypeScript frontend; headless mode uses lumina
passthrough or lumina-backend.
Installation
Default AppRoot resolution is $HOME/.lumina on macOS/Linux and
%LOCALAPPDATA%\LuminaCode on Windows, falling back to
%USERPROFILE%\.lumina. LUMINA_APP_ROOT is the only root override;
LUMINA_RESOURCE_ROOT changes bundled resources only. See
AppRoot layout for the complete storage and migration
contract.
macOS/Linux:
make install
To use remote memory models and skip the local model download:
make install MEMORY_USE_API=1
This writes all remote memory fields to settings.json with empty credential
and model values. Fill them after installation. The default local install is
selected with MEMORY_USE_API=0; upgrades reuse the provider already recorded
in settings when this argument is omitted.
The default install first checks the host hardware, required toolchain, free
space, and usable execution provider. It then downloads a revision- and
SHA-256-pinned BGE-M3 profile from ModelScope: MLX INT8 with the managed Metal
runtime on Apple Silicon, ONNX INT8 for CPU, or ONNX FP16 for a supported
managed accelerator runtime. It replaces the installed application only after
the model, tokenizer, linear heads, native runtime, and inference probe pass.
In local mode, installation fails without a valid BGE-M3 model and does not
fall back to another embedding space.
LUMINA_MEMORY_EMBEDDING_DEVICE selects a device explicitly, while
LUMINA_MEMORY_MODEL_VARIANT=metal-int8|cpu-int8|accelerator-fp16 pins a
packaging profile.
Installation output is streamed to the terminal and an install log. If any
stage fails, the installer exits nonzero and reports the failed stage, original
error message, exit code, log path, and rollback state. An incomplete
app.new is removed and an application swap is restored automatically.
For unattended installs that must not edit a shell profile, use
make install NO_PATH_UPDATE=1. The Windows equivalent is -NoPathUpdate.
Windows:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-windows.ps1
Pass -MemoryUseApi on Windows to select the same remote-memory installation
mode.
Doctor:
make doctor
lumina layout paths --json
lumina layout doctor --json
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\doctor-windows.ps1
Uninstall:
make uninstall
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\uninstall-windows.ps1
make uninstall shuts down backend/MCP/SearxNG, removes installed commands and
the installer-owned app/cache/state layers. It preserves config, data,
layout.json, shell rc files, and project-local .Lumina. Permanent removal is
explicit:
make purge
# or: make uninstall PURGE=1
.\scripts\uninstall-windows.ps1 -Purge
Development
Test:
go test ./...
npm --prefix frontend test
make integration-test # requires Docker; starts Redis 8 and pgvector 0.8.6
Compile-time dependency wiring is generated with the repository-pinned Wire
v0.7.0 tool:
make generate
make wire-check
# equivalent generation command: go tool wire gen ./...
Commit every wire.go injector together with its generated wire_gen.go. Run
make generate after changing providers or injector signatures, and run
make wire-check before submitting changes. No global Wire installation is
required. Because the upstream Wire repository is archived,
the version remains pinned and CI treats both wire check and wire diff as
required consistency checks. Wire owns static application roots; session-,
team-, and agent-scoped objects whose IDs or working directories are known only
at runtime are created through the injected factories.
Build:
# macOS/Linux
make build
Install:
# macOS/Linux
make install
Windows source-tree setup:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\setup-windows.ps1
.\tmp\lumina.cmd --help
Repository Layout
agent/: agent loop, state, permissions, memory injection, and tool executionagentContext/: context compression and injection pipelineapppaths/: cross-platform AppRoot, project identity, doctor, and migrationapi/: streaming LLM clients and provider protocol normalizationbackend/: WebSocket daemon, session manager, and frontend IPC bridgecluster/: Redis leases, fencing ownership, command streams, and event notificationscli/: slash command classification and completion helpersconfig/: configuration loading, environment overrides, and path resolutionfrontend/: TypeScript terminal frontenddeploy/: repeatable PostgreSQL schemas and container/Kubernetes examplesharness/: durable event contracts, scopes, hooks, projections, and storesmcp/: MCP config, trust, and dynamic tool registrationmemory/: SQLite and PostgreSQL/pgvector Memory Fabric implementationssecurity/: command and path safety checkssession/: SQLite/PostgreSQL runtime stores, migration, projections, and crash recoverysessionmemory/: per-session memory commit log and history toolsskills/: skill loading, prompt processing, discovery, and executionteam/: Agent Team configuration, runtime loop, A2A dialogue, gates, and journal checkpointstools/: built-in toolsui/: shared runtime frame model and legacy renderer teststest/: parity and regression tests
推奨ツール
別のキーワードを試すか、フィルタを外してください。
インストール
npx skillfish add gongshichen/luminacode