Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
8e48469
feat(internal): the llm providers config options enabled
Dead-Bytes May 13, 2026
385104b
fix(internal): call sites pass on llm-context according to prev commit
Dead-Bytes May 13, 2026
286412a
feat(internal): enhance GitHub worker with pullfactory for pulls
Dead-Bytes May 13, 2026
d0fbbfa
feat(internal): enhance GitHub ingestion with new pipeline and LLM su…
Dead-Bytes May 13, 2026
a4cb935
feat(interactive): brscnh fetching
bharatsachya May 13, 2026
dd1946c
feat(interactive): build fixes and linting fixes
bharatsachya May 14, 2026
983218d
fix(boot): startup-config and logger factorized
Dead-Bytes May 14, 2026
821c15c
refactor(logger): format export statements for better readability
Dead-Bytes May 14, 2026
6f0cc24
fix(shim): shims added for wrapper
Dead-Bytes May 14, 2026
5777ada
feat(logging): add performance logging to LLM file analyzer and pipel…
Dead-Bytes May 14, 2026
3ff7218
feat(pipeline): refactor knowledge structure to include info for repo…
Dead-Bytes May 14, 2026
8394f20
Merge branch 'pre-release' into feat/per-call-llm-creds
Dead-Bytes May 14, 2026
7fae33f
Merge branch 'pre-release' into feat/per-call-llm-creds
Dead-Bytes May 14, 2026
47d1762
Merge pull request #45 from ByteBell/feat/per-call-llm-creds
Dead-Bytes May 14, 2026
7b2f55a
Merge branch 'pre-release' into feat/pullfactory
Dead-Bytes May 14, 2026
fc746c8
Merge pull request #47 from ByteBell/feat/pullfactory
Dead-Bytes May 14, 2026
251a1a0
feat(progress): integrate progress reporting into flat-folder strateg…
Dead-Bytes May 14, 2026
ea7b3f0
chore: format fix
Dead-Bytes May 14, 2026
7aa7077
feat(token): tokens usage by llm
bharatsachya May 15, 2026
949a839
fix(docker-compose): update port mappings for mongo, neo4j, and redis…
Dead-Bytes May 15, 2026
e1e005c
feat(progress): enhance progress reporting in ingestion pipeline with…
Dead-Bytes May 15, 2026
aa0c347
Update interactive option logic in LsCommand
bharatsachya May 15, 2026
39e16d7
Merge pull request #48 from ByteBell/feat/progressFactory
Dead-Bytes May 18, 2026
ead8827
feat(ls): interactive mode by default
bharatsachya May 18, 2026
4430efc
feat(ls): interactive mode by default
bharatsachya May 18, 2026
807fd21
Merge pull request #43 from ByteBell/feat/terminal
Dead-Bytes May 18, 2026
69b85f1
feat(merge-token-pre): merge with pre-release
bharatsachya May 18, 2026
4043b7c
Merge pull request #49 from ByteBell/feat/tokensa
Dead-Bytes May 18, 2026
47ff55b
feat(config): add setBytebellHomeResolver for dynamic home directory …
Dead-Bytes May 18, 2026
524e0e9
refactor(code): resolved type issues clearly
Dead-Bytes May 18, 2026
1b5fe98
Merge pull request #53 from ByteBell/fix/orgpaths
Dead-Bytes May 18, 2026
4d26790
refactor: enhance LLM usage reporting and remove deprecated pricing l…
Dead-Bytes May 18, 2026
f510285
Merge pull request #54 from ByteBell:fix/llmusage
Dead-Bytes May 18, 2026
064ebf2
refactor: update LLM credential handling in big-file processing and c…
Dead-Bytes May 22, 2026
f9949f6
refactor: enhance OpenRouter provider routing to prevent fallback on …
Dead-Bytes May 22, 2026
665c4d1
refactor: restructure flat-folder phases for improved clarity and per…
Dead-Bytes May 22, 2026
b6311ba
refactor: implement FileAnalysisCache for improved performance in fil…
Dead-Bytes May 22, 2026
13970c7
refactor: add folder summary batching configuration and enhance folde…
Dead-Bytes May 22, 2026
d4b99b1
refactor: remove backfillBigFiles phase and update related documentation
Dead-Bytes May 22, 2026
1afd5d6
Refactor backfill process to use concurrency limiter and batch Neo4j …
Dead-Bytes May 22, 2026
e45277d
chore(format): clean up README formatting and improve code readabilit…
Dead-Bytes May 22, 2026
f5cdaa3
chore: update bun.lock to reflect dependency changes
Dead-Bytes May 22, 2026
0a58a29
refactor: rename import for analyseBigFiles and remove legacy process…
Dead-Bytes May 22, 2026
4dfe43a
refactor: streamline type imports in aggregateStats.ts
Dead-Bytes May 22, 2026
29e6cc5
chore(ts-cleanup): tsconfig files cleared
Dead-Bytes May 22, 2026
9143c74
Merge pull request #62 from ByteBell/feat/fastingest
nitesh32 May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions infra/docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ services:
container_name: bytebell-mongo
restart: unless-stopped
ports:
- "127.0.0.1:27017:27017"
- "127.0.0.1:27117:27017"
volumes:
- mongo_data:/data/db
environment:
Expand All @@ -26,7 +26,7 @@ services:
restart: unless-stopped
ports:
- "127.0.0.1:7474:7474"
- "127.0.0.1:7687:7687"
- "127.0.0.1:7787:7687"
volumes:
- neo4j_data:/data
environment:
Expand All @@ -47,7 +47,7 @@ services:
container_name: bytebell-redis
restart: unless-stopped
ports:
- "127.0.0.1:6379:6379"
- "127.0.0.1:6479:6379"
volumes:
- redis_data:/data
command: ["redis-server", "--appendonly", "yes"]
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"lint-staged": {
"**/*.{ts,tsx,js,mjs,cjs}": [
"prettier --write",
"eslint --fix --max-warnings=0"
"eslint --fix --max-warnings=0 --no-warn-ignored"
],
"**/*.{json,md}": [
"prettier --write"
Expand Down
5 changes: 3 additions & 2 deletions packages/cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ infra/docker/docker-compose.yml up -d`, polls
prefer `bytebell boot`.
- `bytebell index <git-url>` / `bytebell ingest [path]` / `bytebell ls`
— talk HTTP to a running server (lazy-spawn via
`serverSpawn.ensureServerRunning` when the daemon is down).
`serverSpawn.ensureServerRunning` when the daemon is down). `ls` supports
an interactive mode (`-i`) for hierarchical browsing of repos and commits.
- `bytebell delete` — list indexed knowledge in an Ink arrow-key picker
(`DeleteSelector.tsx`, plain `useInput` — no extra dep), and on
confirm `DELETE /api/v1/repos/:id` against the running server. The
Expand Down Expand Up @@ -151,7 +152,7 @@ will touch when implemented. Only the **bolded** entries ship in v0.
| **`bytebell server start`** | **Spawn `bytebell-server` in foreground.** | **Shipped** |
| **`bytebell index <git-url>`** | **POST `/api/v1/github/index` to local server.** | **Shipped** |
| **`bytebell ingest [path]`** | **POST `/api/v1/local/index` for a directory tree.** | **Shipped** |
| **`bytebell ls`** | **Render `/api/v1/repos` as a table.** | **Shipped** |
| **`bytebell ls`** | **Render `/api/v1/repos` as a table or interactive explorer (`-i`). v0.** | **Shipped** |
| **`bytebell delete`** | **Ink picker over `/api/v1/repos`, then DELETE `/api/v1/repos/:id` (Mongo + Neo4j + jobs).** | **Shipped** |
| **`bytebell stats`** | **Render `/api/v1/stats` (totals + per-repo + per-commit token / cost rows).** | **Shipped** |
| `bytebell` | Ink dashboard with Repos / Server / Activity / Cost panes ([docs/arch.md:172-184](../../docs/arch.md#L172-L184)) | After `@bb/server` HTTP API + activity feed |
Expand Down
4 changes: 4 additions & 0 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,16 @@
"exports": {
".": "./src/index.ts"
},
"imports": {
"#src/*": "./src/*"
},
"bin": {
"bytebell": "./src/index.ts"
},
"dependencies": {
"@bb/config": "workspace:*",
"@bb/errors": "workspace:*",
"@bb/ingest-github": "workspace:*",
"@bb/logger": "workspace:*",
"@bb/types": "workspace:*",
"commander": "^14.0.3",
Expand Down
130 changes: 130 additions & 0 deletions packages/cli/src/BranchSelector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import { useMemo, useState } from "react";
import type { ReactElement } from "react";
import { Box, Text, useApp, useInput } from "ink";

export interface BranchSelectorResult {
branch?: string;
typeManually?: boolean;
cancelled?: boolean;
}

export interface BranchSelectorProps {
branches: string[];
title?: string;
onDone: (result: BranchSelectorResult) => void;
}

const MAX_VISIBLE = 12;

type ItemKind = "branch" | "manual";

export function BranchSelector({ branches: rawBranches, title, onDone }: BranchSelectorProps): ReactElement {
const { exit } = useApp();
const [filter, setFilter] = useState("");
const [index, setIndex] = useState(0);

const branches = useMemo(() => {
const items: Array<{ label: string; kind: ItemKind }> = rawBranches.map((b) => ({
label: b,
kind: "branch",
}));
items.push({ label: "Type manually...", kind: "manual" });
return items;
}, [rawBranches]);

const filtered = useMemo(() => {
if (filter.length === 0) {
return branches;
}
const needle = filter.toLowerCase();
return branches.filter((item) => item.label.toLowerCase().includes(needle));
}, [branches, filter]);

const boundedIndex = filtered.length === 0 ? 0 : Math.min(index, filtered.length - 1);

useInput((input, key) => {
if (key.escape) {
exit();
onDone({ cancelled: true });
return;
}
if (key.return) {
const chosen = filtered[boundedIndex];
if (!chosen) {
exit();
onDone({ cancelled: true });
return;
}
exit();
if (chosen.kind === "manual") {
onDone({ typeManually: true });
} else {
onDone({ branch: chosen.label });
}
return;
}
if (key.upArrow || (input === "k" && filter.length === 0)) {
setIndex(() => (boundedIndex > 0 ? boundedIndex - 1 : Math.max(filtered.length - 1, 0)));
return;
}
if (key.downArrow || (input === "j" && filter.length === 0)) {
setIndex(() => (boundedIndex < filtered.length - 1 ? boundedIndex + 1 : 0));
return;
}
if (key.backspace || key.delete) {
setFilter((s) => s.slice(0, -1));
setIndex(0);
return;
}
if (input.length > 0 && !key.ctrl && !key.meta) {
setFilter((s) => s + input);
setIndex(0);
}
});

const heading = title ?? "Select a branch";
const visibleStart = clampWindow(boundedIndex, filtered.length, MAX_VISIBLE);
const visible = filtered.slice(visibleStart, visibleStart + MAX_VISIBLE);

return (
<Box flexDirection="column" borderStyle="round" paddingX={1} paddingY={0}>
<Box marginBottom={1}>
<Text bold>{heading}</Text>
<Text dimColor>{` (${filtered.length}/${branches.length})`}</Text>
</Box>
<Box marginBottom={1}>
<Text color="cyan">filter: </Text>
<Text>{filter.length > 0 ? filter : <Text dimColor>(type to filter)</Text>}</Text>
</Box>
{filtered.length === 0 ? (
<Box>
<Text dimColor>No branches match the filter. Backspace to clear.</Text>
</Box>
) : (
visible.map((item, i) => {
const absoluteIndex = visibleStart + i;
const cursor = absoluteIndex === boundedIndex;
const isManual = item.kind === "manual";
return (
<Box key={`${item.kind}-${item.label}`}>
<Text color={cursor ? "cyan" : "gray"}>{cursor ? "▶ " : " "}</Text>
<Text color={cursor ? "cyan" : isManual ? "yellow" : "white"}>{item.label}</Text>
</Box>
);
})
)}
<Box marginTop={1}>
<Text dimColor>[type to filter] [↑/↓] move [Enter] choose [Backspace] clear [Esc] cancel</Text>
</Box>
</Box>
);
}

function clampWindow(index: number, total: number, size: number): number {
if (total <= size) {
return 0;
}
const halfWindow = Math.floor(size / 2);
const start = Math.max(0, Math.min(index - halfWindow, total - size));
return start;
}
Loading
Loading