neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기An observatory for Git refs and history. Local, read-only, allowlist-scoped.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗An observatory for Git refs and history. Local, read-only, allowlist-scoped.
Refscope watches one Git repository and records what changes — force pushes, rebases, resets, ref movements, commit arrivals — while keeping observed facts separate from any interpretation. It runs entirely on your machine, does not write to the repository, and does not invoke external GPG.
Landing page: https://simota.github.io/refscope/
apps/cli/: refscope CLI — npx -y github:simota/refscope serves the API and the bundled UI on one port. Distributed from this repository, not from the npm registry.apps/api/: read-only Git inspection API (Node.js 22 ESM, no framework).apps/ui/: React + Vite UI. Bundled into the CLI at publish time; developed against the live API in this repository.apps/web/: Astro landing page deployed to GitHub Pages.docs/brand/: brand guidelines, design tokens, voice and tone, microcopy, and the LP specification.docs/spec-v0.md: product and architecture specification.PATH.This repository uses pnpm workspaces from the root. Keep a single root pnpm-lock.yaml committed when dependencies are installed or changed.
Refscope is run directly from this GitHub repository. There is no npm package to install and nothing to clone by hand — Node.js 22 is the only prerequisite.
cd /path/to/your/repo
npx -y github:simota/refscope
Refscope opens at http://127.0.0.1:4175 and observes the current working directory. To watch a different repository:
npx -y github:simota/refscope --repo /absolute/path/to/another/repo
Pin a tag if you want a specific revision: npx -y github:simota/refscope#v0.0.1. Without a tag, npx follows the default branch.
Full options and the CLI security model are in apps/cli/README.md.
Live (the commit timeline as a single calm column), Pulse (a canvas of file-change particles that burst when a file changes), Stream (one row per file change in reverse chronological order).Hotspot (LOC × churn scatter for refactor ROI), Risk Trend (riskScore over time with brush-to-zoom), Risk Heatmap (author × date or date × hour intensity), Co-change (force-directed graph of files that move together), Drift (local branches plotted by ahead/behind and staleness), Outbox (uncommitted / stashed / ahead-of-upstream in three columns).Digest (24h / 7d activity summary across contributors, hotspots, risky commits, and ref activity), Rescue (history-rewritten snapshots with copyable git reflog / branch-recovery commands), Symbol (per-symbol history when a file is opened from a code location).?flight=1 or VITE_REFSCOPE_FLIGHT_RECORDER=1) — a read-only incident timeline for observed ref movements. It separates observed facts (ref, previous hash, current hash, observed time, detection source) from derived explanations, and provides copyable incident notes plus investigation commands. The recorder is memory-only on the server and only covers events observed while Refscope is running.?fleet=1) — a multi-repository overview that polls allowlisted repositories at 30s intervals, aggregates activity across a 1h / 6h / 24h / 7d window, and surfaces per-repo SSE availability and untracked exclusions. Click a row to switch into Detail mode for that repository.The sections below are for working on Refscope itself — the API, the UI, the CLI, and the landing page.
corepack enable
pnpm install
Start the API and UI for this repository with one command:
make dev-self
Open the UI at http://127.0.0.1:5173.
To inspect another Git repository, pass an allowlisted repository path:
make dev-app RTGV_REPOS=viewer=/absolute/path/to/git/repo
make dev-self, make dev-app, and make dev-api validate the repository
path before starting services. If the path is missing, relative, does not exist,
or is not the Git root containing .git, the terminal explains what to fix.
Equivalent explicit two-terminal setup:
RTGV_REPOS=viewer=/absolute/path/to/git/repo pnpm dev:api
VITE_RTGV_API_BASE_URL=http://127.0.0.1:4175 pnpm dev:ui
The API listens on http://127.0.0.1:4175 by default.
The web UI reads the API at http://127.0.0.1:4175 by default. Override it
when the API runs elsewhere:
VITE_RTGV_API_BASE_URL=http://127.0.0.1:4175 pnpm dev:ui
When multiple repositories are allowlisted, the web UI repository selector switches
the active API repository and reloads refs, commits, details, diffs, and SSE
updates for that repository.
The top-bar ref selector and sidebar can switch the commit timeline between
HEAD, API-provided local branches, remote-tracking branches, and tags. Ref
selections are sent to the API as full ref names where available, so a branch
and tag with the same short name do not collide. If the currently selected ref
disappears during realtime polling, the UI reloads the ref list and falls back
to HEAD or another remaining ref.
Annotated tags are reported with their peeled target commit hash instead of the
tag object hash, keeping branch, remote, and tag refs aligned for commit-history
display.
The Command+K / Ctrl+K command palette uses the same API-provided refs and
selected commit state for ref switching, current-hash copy, and clearing active
timeline filters.
Allowlist format:
RTGV_REPOS=repoId=/absolute/path,otherRepo=/absolute/path
Only repoId values from RTGV_REPOS are accepted by API routes. Each
allowlisted path must resolve to a Git working tree root containing a .git
directory or file, and each repoId must be unique. Clients never provide raw
repository paths.
Realtime SSE polling interval can be adjusted when needed:
RTGV_REF_POLL_MS=1000 RTGV_REPOS=viewer=/absolute/path/to/git/repo pnpm dev:api
Numeric runtime settings such as PORT, RTGV_GIT_TIMEOUT_MS,
RTGV_DIFF_MAX_BYTES, and RTGV_REF_POLL_MS must be decimal positive integer
strings. Values using numeric coercion syntax such as 1e3 or 10.5 are
rejected at startup. RTGV_GIT_TIMEOUT_MS and RTGV_REF_POLL_MS must also fit
Node.js timer bounds (1 through 2147483647). RTGV_DIFF_MAX_BYTES defaults to 4000000
(4 MB) and is capped at 16777216 bytes so Git output remains bounded.
When overriding browser origins for CORS, provide comma-separated HTTP(S)
origins only, or set the whole value to * for local unrestricted access:
RTGV_ALLOWED_ORIGINS=http://localhost:5173,https://viewer.example.test
Origins with paths, queries, fragments, credentials, or non-HTTP schemes are rejected during API startup.
Build the API and the UI from the repository root:
pnpm build
Build a specific package:
pnpm build:api # syntax-check the API
pnpm build:ui # build the UI
pnpm build:cli # bundle the CLI (apps/api/src + apps/ui/dist into apps/cli/)
pnpm --filter @realtime-git-viewer/web build # build the landing page
Build and run the unpublished CLI without npm publishing:
pnpm --filter refscope build
node apps/cli/bin/refscope.mjs --repo "$(pwd)" --no-open
pnpm --filter refscope build copies apps/api/src/*.js into apps/cli/src/bundled-api/ and builds the UI with VITE_RTGV_API_BASE_URL="" into apps/cli/src/static/. The same script runs as prepublishOnly, so the published tarball is self-contained and has no workspace dependencies.
pnpm --filter @realtime-git-viewer/web dev # local preview at 127.0.0.1:4321
pnpm --filter @realtime-git-viewer/web build # produce dist/
pnpm capture:web # regenerate captured screenshots and OGP card
The captured media in apps/web/public/media/ is committed; the capture script is for refreshing it after meaningful UI changes. GitHub Pages deployment is automated by .github/workflows/pages.yml on push to main.
Read-only endpoints (none of them write to a repository):
GET /healthGET /api/reposGET /api/repos/:repoId/refsGET /api/repos/:repoId/refs/driftGET /api/repos/:repoId/branches/grouped?prefix=feat/GET /api/repos/:repoId/stashes, /worktrees, /submodules, /state, /worktreeGET /api/repos/:repoId/commits?ref=HEAD&limit=50&search=message&author=name&path=src/app.ts
(mode=pickaxe|regex|message&pattern=... selects the other search modes)GET /api/repos/:repoId/commits/summary?since=...&until=...&groupBy=prefixGET /api/repos/:repoId/commits/:hashGET /api/repos/:repoId/commits/:hash/diffGET /api/repos/:repoId/commits/:hash/riskGET /api/repos/:repoId/commits/:hash/refsGET /api/repos/:repoId/compare?base=main&target=feature/refscopeGET /api/repos/:repoId/compare/cherry?base=main&target=feature/refscopeGET /api/repos/:repoId/files/history?path=...GET /api/repos/:repoId/files/range-history?path=...&lineStart=1&lineEnd=20GET /api/repos/:repoId/files/related?path=...GET /api/repos/:repoId/files/hotspot?ref=HEAD&limit=500&commitCap=200GET /api/repos/:repoId/symbols/history?path=...&funcname=...GET /api/repos/:repoId/eventsGET /api/repos/:repoId/ref-flight/events?limit=100GET /api/fleet/snapshot?window=24h&include=repoA,repoBAllowlist management (see the Origin rules under "Security constraints"):
POST /api/repos with { "id": "...", "path": "/absolute/path" }DELETE /api/repos/:repoId (UI-added repositories only)Merge commits are summarized and diffed against their first parent.
Commit detail responses include metadata, refs, and a bounded changed-file summary
derived from read-only git show --numstat and git show --name-status
commands. Full patch text remains available through the separate diff endpoint.
For renamed files, the summary attaches additions and deletions to the
destination path reported by --name-status.
File statistics use Git's NUL-delimited output, preserving literal file names
containing tabs, newlines, trailing spaces, or => without treating them as
record separators or rename notation. Commit lists, details, comparisons,
period summaries, risk inputs, working-tree totals, and live commit events use
the same numstat parser.
The :hash path parameter for commit detail and diff endpoints must be a full
40-character hexadecimal commit object ID; abbreviated hashes are rejected before
Git execution to avoid ambiguous object resolution. Full object IDs are also
checked with git cat-file -t before detail or diff reads, and non-commit
objects are rejected without returning their contents.
Commit list and detail responses include signed and signatureStatus fields,
but cryptographic signature verification is intentionally not performed by the
API because Git can invoke repository-configured GPG programs for signed
commits. Until offline signature parsing is implemented, signed commits are
reported as signed: false with signatureStatus: "unknown".
Commit list responses include bounded git log --numstat aggregate metadata as
added, deleted, and fileCount, which the timeline uses before loading full
commit details.
The optional commit-list search parameter is a bounded, case-insensitive,
literal search over commit messages. The optional author parameter is a
bounded, case-insensitive literal match against commit authors. Both filters
escape Git regex metacharacters independently so combining them keeps literal
matching semantics. The optional path parameter filters commits to a
repository-relative file or directory path and rejects malformed components such
as empty segments, ., and ...
The optional commit-list ref parameter must resolve to a commit before the
history read runs; the API then reads history from the resolved commit object ID.
Missing refs and non-commit object IDs return a public 404 error.
The optional limit parameter must be a decimal positive integer; accepted
values are clamped to the API maximum of 200 commits and invalid values return a
public 400 error.
Commit-list query parameters are scalar: duplicate ref, limit, search,
, or parameters return a public error instead of being
silently collapsed to one value.
Compare responses summarize with ahead/behind counts,
changed-file totals, added/deleted line totals, merge-base information when
available, and copyable local Git commands for , , and
. The copyable commands keep and as separate revision
tokens, while the backend comparison commands read from the resolved commit
object IDs. Both compare revisions must resolve to commits before any comparison
command runs.
When message, author, or path filters are active and the API returns no
commits, the web UI shows a filter-specific empty state so a zero-result search
is distinguishable from an unfiltered empty ref.
The SSE endpoint keeps an in-memory ref snapshot per connection, polls the allowlisted repository refs, and emits typed events:
connectedref_createdref_updatedref_deletedcommit_addedhistory_rewrittenerrorThe web UI uses history_rewritten events for the realtime notice and the
sidebar alert list. The alert list is event-driven and starts empty; it does not
show synthetic rewrite warnings before the API observes one.
Rewrite alerts show observed facts (ref, previous hash, current hash, observed
time, and detection source) separately from the interpretation, and include a
copyable incident note for team coordination.
When the Flight Recorder flag is enabled, the UI also exposes the in-memory
ref-flight event log as an incident timeline with the same observed/derived
separation. It is read-only, allowlist-scoped, and does not persist server-side
state; restarting the API clears the server-side flight log.
The web UI also marks commits observed through real commit_added SSE events as
new in the timeline after the refreshed commit list includes those hashes. The
highlight state is local to the current browser session and clears when
switching repositories.
Live updates can be paused from the top bar or command palette. While paused,
incoming SSE events are counted and announced through a polite live region, but
the timeline is not refreshed until updates are resumed.
The timeline includes a read-only compare bar for pinning a base ref/commit and
target ref, preserving selected commits across ref switches when possible, and
copying local Git comparison commands.
The timeline also includes a commit activity overview with labeled metrics and
mini bars for commit count, additions, deletions, signed commits, merge commits,
and live-update new commits.
If the SSE stream emits a typed error event, the web UI surfaces the sanitized
API error message in the timeline instead of silently dropping the event.
RTGV_REPOS.repoId values in RTGV_REPOS are rejected at startup instead of
being silently overwritten.400 errors before repository lookup.shell: false.cat-file, cherry, config (read-only lookup), diff,
for-each-ref, log, ls-files, merge-base, rev-list, rev-parse,
show, and the stash list / submodule status / worktree list
subcommands).-c, --git-dir, --work-tree, and --namespace are
rejected before spawn so internal call sites cannot override the hardened
execution context.--output before
spawn, so read-only API call sites cannot accidentally write diff output to
arbitrary filesystem paths.--no-index diff mode before spawn, so diff
reads stay scoped to the allowlisted repository working tree.GIT_* environment variables before
setting safe runtime overrides, so variables such as GIT_DIR cannot redirect
reads away from the allowlisted repository path.--no-pager, rejects explicit pager
options, and overrides inherited pager environment with cat, so API reads do
not invoke user-configured pagers.GIT_CONFIG_GLOBAL to the null device and GIT_CONFIG_NOSYSTEM=1;
repository-local configuration is still read, with unsafe behaviors disabled
by explicit command flags where needed.git log / diff --stat / diff commands with revisions kept as separate tokens.Rescue lens for later recovery.Cmd/Ctrl+K) — operates on the same live ref/commit state as the page, and exposes pause, copy current hash, clear filters, and ref switching.authorpath400base..targetlogdiff --statdiffbasetargetGIT_ATTR_NOSYSTEM=1, so system gitattributes do
not alter API history or diff reads.GIT_NO_LAZY_FETCH=1 and
GIT_TERMINAL_PROMPT=0, so read-only API commands do not fetch missing
promisor objects on demand or block waiting for terminal credentials.SSH_AUTH_SOCK, SSH_AGENT_PID, SSH_ASKPASS, and
SSH_ASKPASS_REQUIRE) so API subprocesses do not receive ambient SSH
credentials.HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, and NO_PROXY, including lowercase
variants) so local read-only API commands do not receive ambient network proxy
configuration or credential-bearing proxy URLs.GCM_*) so credential-helper interaction, storage, and tracing
settings are not passed to API subprocesses.GIT_OPTIONAL_LOCKS=0, so read-only API commands
avoid taking optional repository locks while inspecting allowlisted
repositories.GIT_NO_REPLACE_OBJECTS=1, so repository replacement refs do
not silently rewrite object resolution for displayed history or diffs.--no-ext-diff and --no-textconv, so
repository-configured external diff or textconv commands are not executed by
API reads.core.fsmonitor=false through
GIT_CONFIG_COUNT (which outranks every config file), and reads that compare
against the working tree (worktree changes, the fleet dirty probe) first look
up the repository's filter.<driver> entries and blank their
clean/smudge/process commands for that call, so a repository's own
.git/config cannot make a read run an fsmonitor hook or filter program.
Those reads also pass --ignore-submodules=dirty, so Git does not run
status inside submodules (whose own filters would run); uncommitted edits
inside a submodule are therefore not reported, a moved submodule commit is.
git config is allowed only as that --get-regexp lookup. A side effect is
that worktree diffs show files without their clean filter applied (e.g. Git
LFS content instead of pointers).RTGV_GIT_TIMEOUT_MS.0, Infinity, timer-overflow values, or output bounds above
16777216 bytes.RTGV_DIFF_MAX_BYTES.HEAD and conservative Git ref-like names only,
rejecting malformed components such as empty segments, leading dots, trailing
dots, .lock suffixes, .., and @{ before Git execution. Transient Git
pseudo refs such as AUTO_MERGE, BISECT_HEAD, CHERRY_PICK_HEAD,
FETCH_HEAD, ORIG_HEAD, MERGE_HEAD, MERGE_AUTOSTASH, REBASE_HEAD,
REVERT_HEAD, and BISECT_EXPECTED_REV are rejected for public revision
input. Stash refs such as stash and refs/stash are also rejected because
they can contain unpublished working-tree state. Full refs/ inputs are limited to the
advertised refs/heads/, refs/remotes/, and refs/tags/ surfaces; other
namespaces such as refs/bisect/, refs/changes/, refs/keep-around/,
refs/notes/, refs/original/, refs/prefetch/, refs/pull/,
refs/replace/, refs/rewritten/, and refs/worktree/ are rejected before
Git execution. Same-named branches remain addressable through their full names
such as refs/heads/FETCH_HEAD, refs/heads/stash, or refs/heads/original.
Because Git resolves a short name as refs/<name> first, the ref Git actually
resolved is checked as well: short names such as notes/commits or
pull/1/head, and symbolic refs pointing outside the public namespaces,
return "Ref not found or not a commit".git log.base and target revisions use the same commit-ish resolution
before diff, rev-list, or merge-base commands run, and those comparison
commands use resolved commit object IDs. Rev-list comparison commands express
exclusions with separate --not arguments instead of caret-prefixed revision
strings, while diff and merge-base comparison commands end option parsing
before the resolved commit IDs are passed to Git.., .., and leading -,
then passed to Git as a literal top-level pathspec after --.--no-show-signature, so repository-configured gpg.program commands and
log.showSignature=true do not execute during read-only history requests.git log --numstat through the
same allowlisted, argument-array command runner.limit input is rejected unless it is a decimal positive
integer, then clamped to 200 before reaching Git.base and target inputs must be conservative Git ref-like
names or full 40-character object IDs before any comparison command runs.base and target revisions as separate
argument-array entries rather than concatenating them into executable range
arguments.base and target as separate
revision tokens instead of returning base..target range strings.git log
revision arguments (--not from --end-of-options to) rather than
concatenating range strings, ending option parsing before the positive ref
hash is read.:hash path input must be a full 40-character
hexadecimal object ID; abbreviated or non-hex values are rejected before Git
execution, and full object IDs must resolve to commit objects before detail or
diff output is read.git cat-file -t with option parsing ended
before the validated object ID is passed to Git.git show commands end option parsing before the
validated commit object ID is passed to Git.git merge-base --is-ancestor with option
parsing ended before observed ref hashes are passed to Git.RTGV_REF_POLL_MS.http://localhost:5173 and http://127.0.0.1:5173.
Override with RTGV_ALLOWED_ORIGINS using comma-separated HTTP(S) origins or
the exact wildcard value *.HOST, the API answers only requests whose Host
header is localhost, 127.0.0.0/8, or [::1] (403 otherwise). This blocks
DNS-rebinding pages from reading repository data through the browser. A
public bind (RTGV_BIND_PUBLIC=1 with a non-loopback HOST) disables this
check.POST/DELETE /api/repos require an Origin header that is either in the
allowlist or the API's own origin (same-origin UI, as served by the CLI).
The CLI uses an empty allowlist, so other sites cannot read data from or
register repositories in a running refscope instance.