π°π· νκ΅μ΄λ‘ μ½μΌμλ €λ©΄ β README.ko.md Β· π¬π§ English continues below. The kind little buddy that says "this already exists" before you write it again. Your repo's companion for vibe-coding sessions.
FAQ
lumin-repo-lens is a Claude Code plugin with 3 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes lumin-repo-lens-canon, lumin-repo-lens-write-gate, lumin-repo-lens. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add annyeong844/lumin-repo-lens> /plugin install lumin-repo-lens@annyeong844-marketplace
Repo: annyeong844/lumin-repo-lens
π°π· νκ΅μ΄λ‘ μ½μΌμλ €λ©΄ β README.ko.md Β Β·Β π¬π§ English continues below.
The kind little buddy that says "this already exists" before you write it again. Your repo's companion for vibe-coding sessions.
You ask AI:
"Make me a card-news service"
AI happily spins up a new file β lib/cardNewsService.js β¨
But your repo already had three similar files in lib/cardNews/. π±
With lumin-repo-lens riding along, Claude can say first:
π "Wait β there are already 3 similar files under
lib/cardNews*. Want to look before making a new one?"
Real evidence from your actual repo, not guesses.
1. Add the marketplace and install the plugin in Claude Code
/plugin marketplace add annyeong844/lumin-repo-lens
/plugin install lumin-repo-lens@annyeong844-marketplace
/reload-plugins
2. Run the full first checkup
/lumin-repo-lens:full
β This turns on the parts that make Lumin more than a dead-export sorter: shape index, function-clone cues, call graph, barrel discipline, topology, public-surface policies, and the grounded review profile.
3. Use the write gate when you are about to change code
/lumin-repo-lens:pre-write
# code the change
/lumin-repo-lens:post-write
Claude Code infers the compact intent internally. You do not need to write the intent JSON by hand.
π‘ First run installs parser dependencies once (~30 seconds). After that, fast. For tiny follow-up checks after a fresh baseline,
/lumin-repo-lensuses the quick path.
For very large repos, do not auto-trigger full profile on every edit. Run
:full once per branch, first checkup, or major refactor review, then use
pre-write/post-write and quick follow-ups during the agent loop.
| Command | When to use |
|---|---|
/lumin-repo-lens:full | Full evidence profile β first checkup, post-refactor review, shape/function-clone/call/topology evidence |
/lumin-repo-lens:pre-write | Check before coding. Ask naturally; the assistant infers the compact intent internally. |
/lumin-repo-lens:post-write | Verify after coding β "did my change ripple anywhere else?" |
/lumin-repo-lens | Quick baseline-aware repo lens pass for small follow-up checks over fresh artifacts |
/lumin-repo-lens:refactor-plan | Turn evidence into a cautious cleanup plan |
/lumin-repo-lens:welcome | Get a gentle first-use menu |
Maintainers can also use /lumin-repo-lens:canon-draft and
/lumin-repo-lens:check-canon for canon lifecycle work.
First pass, stale or missing artifacts, explicit review, due diligence,
large refactor planning, and post-refactor review should run --profile full.
Small follow-up checks over a fresh baseline can use the quick path.
In the generated skill package, use the public wrapper:
git clone https://github.com/annyeong844/lumin-repo-lens.git
cd lumin-repo-lens
node skills/lumin-repo-lens/scripts/audit-repo.mjs --root <repo>
LUMIN_REPO_LENS_NO_AUTO_INSTALL=1 node skills/lumin-repo-lens/scripts/audit-repo.mjs --root <repo>
With this set, the tool prints the exact install command instead of running it for you.
The automatic setup command is npm ci --omit=dev --ignore-scripts --no-audit --fund=false.
Stable validation modes are audit, pre-write, post-write, canon-draft,
and check-canon.
Codex users can use the $lumin-repo-lens-codex wrapper, which points at the shared engine.
git clone https://github.com/annyeong844/lumin-repo-lens.git ~/.codex/lumin-repo-lens
macOS / Linux
mkdir -p ~/.codex/skills
ln -sfn ~/.codex/lumin-repo-lens/skills/lumin-repo-lens-codex ~/.codex/skills/lumin-repo-lens-codex
ln -sfn ~/.codex/lumin-repo-lens/skills/lumin-repo-lens ~/.codex/skills/lumin-repo-lens
ln -sfn ~/.codex/lumin-repo-lens/skills/lumin-repo-lens-write-gate ~/.codex/skills/lumin-repo-lens-write-gate
ln -sfn ~/.codex/lumin-repo-lens/skills/lumin-repo-lens-canon ~/.codex/skills/lumin-repo-lens-canon
Windows PowerShell
git clone https://github.com/annyeong844/lumin-repo-lens.git "$env:USERPROFILE\.codex\lumin-repo-lens"
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.codex\skills" | Out-Null
cmd /c mklink /J "%USERPROFILE%\.codex\skills\lumin-repo-lens-codex" "%USERPROFILE%\.codex\lumin-repo-lens\skills\lumin-repo-lens-codex"
cmd /c mklink /J "%USERPROFILE%\.codex\skills\lumin-repo-lens" "%USERPROFILE%\.codex\lumin-repo-lens\skills\lumin-repo-lens"
cmd /c mklink /J "%USERPROFILE%\.codex\skills\lumin-repo-lens-write-gate" "%USERPROFILE%\.codex\lumin-repo-lens\skills\lumin-repo-lens-write-gate"
cmd /c mklink /J "%USERPROFILE%\.codex\skills\lumin-repo-lens-canon" "%USERPROFILE%\.codex\lumin-repo-lens\skills\lumin-repo-lens-canon"
Restart Codex after installing. In Codex, start with $lumin-repo-lens-codex.
The tool scans your repo and collects facts (evidence) only. Judgment is what your AI does after reading those facts.
Your repo β lumin-repo-lens (cold evidence) β AI buddy explains kindly
β β
machine human
The two-stage split is on purpose:
<repo>/.audit/Q. Can I use it without AI, just as a CLI?
Yes β from a clone, run node skills/lumin-repo-lens/scripts/audit-repo.mjs --root <repo>. It writes JSON evidence files, a summary markdown, and a Mermaid topology diagram (when topology data exists). The Mermaid file is a compact human visual companion for cross-submodule flows, cycles, and hub files; precise citations still go through topology.json.
Q. Why does it install npm packages on first run?
To analyze your repo, it needs parser libraries. They're auto-installed once and cached. Disable with LUMIN_REPO_LENS_NO_AUTO_INSTALL=1.
Q. What gets created in my repo?
JSON evidence files, a summary markdown, and topology Mermaid (when applicable) under <repo>/.audit/. Add .audit/ to .gitignore if you don't want them committed.
These artifacts may include repository structure, file paths, symbol names, and analysis metadata.
Q. My repo is large β is it slow? It scales with the files actually scanned and the evidence profile you choose. Small repositories are still quick, but large monorepos can take long enough that they may look stuck if you only expect the small-repo numbers.
| Scan size | Quick profile | Full profile |
|---|---|---|
| 200-500 files | ~10-20 seconds | ~30 seconds-1 minute |
| 1k-2k files | ~30-60 seconds | ~1-3 minutes |
| 3k-5k files | ~1-3 minutes | several minutes |
For a 4k+ file monorepo, a quick scan taking more than a minute can be normal.
Watch the progress lines and check manifest.json before assuming the run is
hung. Use :full for first checkups, branch-level reviews, and major refactor
evidence; use quick/pre-write/post-write for smaller follow-ups.
Q. What are the main evidence limits?
Function-clone cues are review cues, not semantic-equivalence claims. They include exact body, same-structure, same-signature, and near-function evidence when the full profile has function-clones.json. Shape index is exact: nullable or widened types such as email: string versus email: string | null intentionally land in different groups. Start from audit-summary.latest.md, manifest.json, and checklist-facts.json, then open raw JSON artifacts only for the claim being cited.
Q. Does pre-write understand semantic duplicates? No. Pre-write does not claim semantic equivalence from names alone. It surfaces grounded facts such as exact symbol/file matches, exact shape hashes, and exact function signature hashes, then separates weaker agent-review cues from muted token noise.
Exact normalized body-hash cueing is deferred until a body-hash lane exists in the lookup artifacts. When two helpers only share a common verb such as create, the default chat surface stays quiet and the muted cue remains in JSON diagnostics.
Q. Why can post-write feel as expensive as a quick scan?
Post-write refreshes the after-snapshot before comparing it to the matching pre-write advisory, so small edits can still pay the repository walk cost. Reusing the same --output keeps artifacts together; an incremental post-write cache is planned, but the current default favors a fresh comparison over a stale clean result.
Q. Does it call a model or subagent by itself?
No. Full and CI profiles may write audit-review-pack.latest.md, but that file does not call any model or API by itself. In Claude Code, the main assistant can turn a lane into a focused codebase-reading assignment. Subagents should inspect repository files directly and report file:line evidence.
This section is for maintainer checkouts. If you installed the plugin or use the published package, you don't need anything here.
npm run build:plugin # writes dist/lumin-repo-lens-plugin/ (Claude Code plugin root)
npm run build:skill # writes the skill-only directory shape
The skill-triggering harness is maintainer-only.
npm run ci # full check pass
npm run check:skill-triggering # offline prompt/expectation lint
npm run check:behavior # offline answer-level regression check
./test-harness/run-all.sh # live trigger sweeps (requires Claude CLI; opt-in)
docs/README.md β entrypointdocs/product-surface.md β what's user-visibledocs/internal-engine.md β how the engine is shaped internallydocs/history/README.md, docs/spec/README.md, docs/lab/README.md β phase history, specs, labsLab outputs (canonical-draft/, output/, review-output*/, p6-corpus/, audit-artifacts/, .audit/, .claude/) are maintainer-only and not part of the deployable skill package.
Root sibling scripts are internal engine entrypoints. They are intentionally
not the preferred user-facing interface; start from the plugin commands or
skills/lumin-repo-lens/scripts/audit-repo.mjs instead.
Function-clone cues are review cues, not semantic-equivalence proofs; same-signature groups mean "same exported function type contract", not "same behavior". Shape-index matching is exact (a string and a string | null field intentionally land in different groups). For the operational gates that keep dead-code, shape, and barrel claims grounded, see references/false-positive-index.md and references/operational-gates.md.
The Claude Code marketplace package is in public beta before a stable 1.0.0 line. Expect occasional cleanup commits. The engine and plugin surfaces are usable today.
π This buddy doesn't scold. It knocks gently and says "could you take a look at this?"
.claude-plugin/
marketplace.json
plugin.json
.github/
workflows/
ci.yml
.gitignore
CHANGELOG.md
commands/
audit.md
canon-draft.md
check-canon.md
full.md
lumin-repo-lens.md
post-write.md
pre-write.md
refactor-plan.md
welcome.md
hooks/
_runner-utils.mjs
hooks.json
post-tool-batch.mjs
pre-tool-use.mjs
stop.mjs
user-prompt-submit.mjs
LICENSE
README.ko.md
README.md
README.plugin-package.md
skills/
lumin-repo-lens/
lumin-repo-lens-canon/
agents/
openai.yaml
SKILL.md
lumin-repo-lens-write-gate/
agents/
openai.yaml
SKILL.md
_engine/
_README.md
lib/
alias-map.mjs
any-contamination-summary.mjs
any-contamination.mjs
artifacts.mjs
atomic-write.mjs
audit-canon-draft.mjs
audit-check-canon.mjs
audit-manifest.mjs
audit-review-pack.mjs
audit-summary.mjs
blind-zones.mjs
block-clone-artifact.mjs
calibration-corpora.mjs
call-graph-bounded.mjs
canon-draft-helpers.mjs
canon-draft-naming.mjs
canon-draft-topology.mjs
canon-draft-types.mjs
canon-draft-utils.mjs
canon-draft.mjs
check-canon-artifact.mjs
check-canon-helpers.mjs
check-canon-markdown.mjs
check-canon-naming-parser.mjs
check-canon-naming.mjs
check-canon-topology-parser.mjs
check-canon-topology.mjs
check-canon-types.mjs
check-canon-utils.mjs
classify-facts-ast-counter.mjs
classify-facts.mjs
classify-policies.mjs
cli.mjs
collect-files.mjs
contract-pinned-exports.mjs
definition-id.mjs
dependency-guard.mjs
entry-surface.mjs
export-action-safety.mjs
extract-go.mjs
extract-py.mjs
extract-ts-escapes.mjs
extract-ts.mjs
finding-provenance.mjs
framework-policy-facts.mjs
framework-policy-matrix.mjs
framework-resource-surfaces.mjs
function-clone-artifact.mjs
function-signature-hash.mjs
generated-artifact-evidence.mjs
generated-artifact-mode.mjs
generated-blind-zone-relevance.mjs
generated-virtual-surface.mjs
hook-ack-observer.mjs
hook-event-drain.mjs
hook-event-renderer.mjs
hook-event-store.mjs
hook-id-safety.mjs
hook-path-safety.mjs
hook-post-write-lite.mjs
hook-preimage-store.mjs
import-meta-glob-expansion.mjs
incremental-cache-store.mjs
incremental-snapshot.mjs
incremental.mjs
inline-pattern-artifact.mjs
js-module-edge-scanner.mjs
lang.mjs
line-offset.mjs
mdx-consumers.mjs
mode-dispatch.mjs
module-reachability.mjs
p6-measurement.mjs
package-exports.mjs
parse-oxc.mjs
paths.mjs
post-write-artifact.mjs
post-write-delta.mjs
post-write-file-delta.mjs
post-write-render.mjs
pre-write-artifact.mjs
pre-write-canonical-parser.mjs
pre-write-cold-cache.mjs
pre-write-cue-tiers.mjs
pre-write-drift.mjs
pre-write-intent.mjs
pre-write-lookup-dep.mjs
pre-write-lookup-file.mjs
pre-write-lookup-inline-patterns.mjs
pre-write-lookup-name.mjs
pre-write-lookup-shape.mjs
pre-write-render.mjs
pre-write-token-policy.mjs
producer-phase-timing.mjs
public-surface.mjs
python.mjs
ranking.mjs
repo-mode.mjs
resolver-blind-zone-relevance.mjs
resolver-blocked-hints.mjs
resolver-capabilities.mjs
resolver-core.mjs
scan-excludes.mjs
self-audit-excludes.mjs
sfc-consumers.mjs
shape-hash.mjs
shape-index-artifact.mjs
shape-index-schema.mjs
symbol-graph-artifact.mjs
test-paths.mjs
threshold-policies.mjs
topology-mermaid.mjs
tree-sitter-langs.mjs
tsconfig-paths.mjs
unused-deps-artifact.mjs
vocab.mjs
producers/
any-inventory.mjs
audit-repo.mjs
build-block-clone-index.mjs
build-call-graph.mjs
build-entry-surface.mjs
build-framework-resource-surfaces.mjs
build-function-clone-index.mjs
build-inline-pattern-index.mjs
build-module-reachability.mjs
build-resolver-diagnostics.mjs
build-shape-index.mjs
build-symbol-graph.mjs
build-unused-deps.mjs
check-barrel-discipline.mjs
check-canon.mjs
checklist-facts.mjs
classify-dead-exports.mjs
compare-repos.mjs
emit-sarif.mjs
export-action-safety.mjs
generate-canon-draft.mjs
measure-discipline.mjs
measure-staleness.mjs
measure-topology.mjs
merge-runtime-evidence.mjs
p6-measurement.mjs
post-write.mjs
pre-write.mjs
rank-fixes.mjs
resolve-method-calls.mjs
triage-repo.mjs
agents/
openai.yaml
canonical/
any-contamination.md
canon-drift.md
classification-gates.md
fact-model.md
identity-and-alias.md
index.md
invariants.md
mode-contract.md
pre-write-gate.md
package-lock.json
package.json
README.md
references/
cli-options.md
command-routing.md
false-positive-index.md
false-positive-patterns.md
glossary.md
language-support.md
lifecycle-modes.md
operational-gates.md
pre-write-intent-shape.md
refactor-plan-policy.md
structural-review-workflow.md
scripts/
audit-repo.mjs
check-canon.mjs
generate-canon-draft.mjs
post-write.mjs
pre-write.mjs
smoke-test.mjs
SKILL.md
templates/
living-audit-template.md
README.md
refactor-plan-template.md
report-template.md
REVIEW_CHECKLIST_SHORT.md
REVIEW_CHECKLIST.mdΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic