gitforest 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/package.json +24 -4
- package/src/github/auth.ts +3 -3
- package/src/utils/debug.ts +4 -4
- package/.bunignore +0 -7
- package/.github/workflows/ci.yml +0 -73
- package/CLAUDE.md +0 -111
- package/CONTRIBUTING.md +0 -145
- package/bun.lock +0 -267
- package/bunfig.toml +0 -15
- package/cli +0 -0
- package/docs/ai/IMPROVEMENT_PLAN.md +0 -341
- package/docs/ai/VERIFICATION_REPORT.md +0 -87
- package/docs/ai/architecture.md +0 -169
- package/docs/ai/checks/check-2025-12-02-tests.md +0 -40
- package/docs/ai/checks/check-2025-12-02.md +0 -55
- package/docs/ai/checks/test-verification-report.md +0 -85
- package/docs/ai/implementation-guide.md +0 -776
- package/docs/ai/research/gitty-codebase-analysis.md +0 -221
- package/docs/ai/tickets/GENERAL-sitrep.md +0 -30
- package/docs/ai/tickets/TASK-database-tests-sitrep.md +0 -25
- package/docs/ai/tickets/TASK-deprecated-functions-sitrep.md +0 -28
- package/docs/ai/tickets/TASK-detail-modal-sitrep.md +0 -28
- package/docs/ai/tickets/TASK-filter-overlay-sitrep.md +0 -24
- package/docs/ai/tickets/TASK-github-service-sitrep.md +0 -32
- package/docs/ai/tickets/TASK-github-token-sitrep.md +0 -51
- package/docs/ai/tickets/TASK-hascommits-sitrep.md +0 -35
- package/docs/ai/tickets/TASK-keybindings-sitrep.md +0 -26
- package/docs/ai/tickets/TASK-layout-sitrep.md +0 -25
- package/docs/ai/tickets/TASK-markdown-sitrep.md +0 -28
- package/docs/ai/tickets/TASK-project-item-sitrep.md +0 -79
- package/docs/ai/tickets/TASK-sitrep.md +0 -28
- package/docs/ai/tickets/TASK-state-sitrep.md +0 -26
- package/docs/ai/tickets/TASK-types-sitrep.md +0 -25
- package/docs/ai/tickets/TASK-unified-item-fix-sitrep.md +0 -26
- package/docs/ai/tickets/TKT-001-sitrep.md +0 -24
- package/docs/ai/tickets/TKT-002-sitrep.md +0 -25
- package/docs/ai/tickets/TKT-003-git-service-refactoring-complete.md +0 -46
- package/docs/ai/tickets/TKT-003-git-service-refactoring-plan.md +0 -135
- package/docs/ai/tickets/TKT-003-sitrep.md +0 -26
- package/docs/ai/tickets/TKT-004-sitrep.md +0 -27
- package/docs/ai/tickets/TKT-005-sitrep.md +0 -25
- package/docs/ai/tickets/TKT-006-sitrep.md +0 -26
- package/docs/ai/tickets/TKT-007-sitrep.md +0 -30
- package/docs/ai/tickets/TKT-008-sitrep.md +0 -32
- package/docs/ai/tickets/TKT-009-sitrep.md +0 -27
- package/docs/ai/tickets/TKT-010-sitrep.md +0 -27
- package/docs/ai/tickets/TKT-011-sitrep.md +0 -26
- package/docs/ai/tickets/TKT-012-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-actions-sitrep.md +0 -28
- package/docs/ai/tickets/sitreps/TASK-actions-test-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-app-integration-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-background-fetch-sitrep.md +0 -24
- package/docs/ai/tickets/sitreps/TASK-background-fetch-test-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-batch-tests-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-bun-test-sitrep.md +0 -26
- package/docs/ai/tickets/sitreps/TASK-cache-tests-sitrep.md +0 -30
- package/docs/ai/tickets/sitreps/TASK-cli-tests-sitrep.md +0 -28
- package/docs/ai/tickets/sitreps/TASK-clone-error-handling-sitrep.md +0 -26
- package/docs/ai/tickets/sitreps/TASK-commands-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-component-tests-1-sitrep.md +0 -30
- package/docs/ai/tickets/sitreps/TASK-configloader-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-confirm-dialog-test-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-coverage-sitrep.md +0 -95
- package/docs/ai/tickets/sitreps/TASK-database-tests-summary.md +0 -61
- package/docs/ai/tickets/sitreps/TASK-error-boundary-sitrep.md +0 -30
- package/docs/ai/tickets/sitreps/TASK-error-tests-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-errors-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-extract-reducer-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-filter-overlay-test-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-final-verification-sitrep.md +0 -28
- package/docs/ai/tickets/sitreps/TASK-fix-all-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-fix-hooks-sitrep.md +0 -26
- package/docs/ai/tickets/sitreps/TASK-fix-remaining-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-fix-test-failures-sitrep.md +0 -26
- package/docs/ai/tickets/sitreps/TASK-fix-tests-sitrep.md +0 -24
- package/docs/ai/tickets/sitreps/TASK-formatters-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-git-timeouts-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-github-cache-test-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-githubcli-tests-sitrep.md +0 -24
- package/docs/ai/tickets/sitreps/TASK-gitstatus-tests-sitrep.md +0 -24
- package/docs/ai/tickets/sitreps/TASK-hooks-isolation-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-keybindings-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-layout-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-mock-factories-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-modal-tests-sitrep.md +0 -32
- package/docs/ai/tickets/sitreps/TASK-processbatch-fix-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-projectlist-tests-sitrep.md +0 -30
- package/docs/ai/tickets/sitreps/TASK-projectutils-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-scanner-tests-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-select-all-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-shell-error-handling-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-store-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-test-fixes-sitrep.md +0 -26
- package/docs/ai/tickets/sitreps/TASK-test-summary-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-test-verification-sitrep.md +0 -27
- package/docs/ai/tickets/sitreps/TASK-testsuite-sitrep.md +0 -75
- package/docs/ai/tickets/sitreps/TASK-unified-reducer-tests-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-unified-repos-test-sitrep.md +0 -29
- package/docs/ai/tickets/sitreps/TASK-unified-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-useprojects-tests-sitrep.md +0 -25
- package/docs/ai/tickets/sitreps/TASK-utility-tests-sitrep.md +0 -32
- package/docs/ai/tickets/sitreps/TKT-003-git-service-refactoring-sitrep.md +0 -64
- package/docs/ai/tkt-001-fix-database-error.md +0 -217
- package/docs/ai/ui-enhancement-plan.md +0 -562
- package/test/integration/app.isolated.tsx +0 -240
- package/test/integration/cli-commands.test.ts +0 -287
- package/test/integration/cli-validation.test.ts +0 -264
- package/test/integration/git-operations.test.ts +0 -218
- package/test/integration/scanner.test.ts +0 -228
- package/test/preload.ts +0 -18
- package/test/unit/cli/commands.test.ts +0 -13
- package/test/unit/cli/formatters.test.ts +0 -1116
- package/test/unit/cli/github-commands.test.ts +0 -12
- package/test/unit/components/CloneDialog.test.tsx +0 -240
- package/test/unit/components/ColumnHeader.test.tsx +0 -128
- package/test/unit/components/CommandPalette.test.tsx +0 -355
- package/test/unit/components/ConfirmDialog.test.tsx +0 -111
- package/test/unit/components/ErrorBoundary.test.tsx +0 -139
- package/test/unit/components/FilterBar.test.tsx +0 -43
- package/test/unit/components/FilterOptionsOverlay.test.tsx +0 -197
- package/test/unit/components/HelpOverlay.test.tsx +0 -90
- package/test/unit/components/Layout.test.tsx +0 -328
- package/test/unit/components/MarkdownRenderer.test.tsx +0 -45
- package/test/unit/components/ProgressBar.test.tsx +0 -138
- package/test/unit/components/ProjectItem.test.tsx +0 -182
- package/test/unit/components/ProjectList.test.tsx +0 -311
- package/test/unit/components/RepoDetailModal.test.tsx +0 -445
- package/test/unit/components/StatusBar.test.tsx +0 -112
- package/test/unit/components/UnifiedProjectItem.test.tsx +0 -618
- package/test/unit/components/ViewModeIndicator.test.tsx +0 -137
- package/test/unit/components/test-utils.tsx +0 -63
- package/test/unit/config/loader.test.ts +0 -692
- package/test/unit/db/database.test.ts +0 -978
- package/test/unit/db/index.test.ts +0 -314
- package/test/unit/fixtures/setup.ts +0 -186
- package/test/unit/git/commands-untested.test.ts +0 -205
- package/test/unit/git/commands.test.ts +0 -269
- package/test/unit/git/operations.test.ts +0 -322
- package/test/unit/git/status.test.ts +0 -219
- package/test/unit/github/auth.test.ts +0 -317
- package/test/unit/github/cache.test.ts +0 -1028
- package/test/unit/github/cli.test.ts +0 -135
- package/test/unit/github/unified.test.ts +0 -1201
- package/test/unit/graceful-shutdown.test.ts +0 -83
- package/test/unit/hooks/useBackgroundFetch.test.tsx +0 -239
- package/test/unit/hooks/useConfirmDialogActions.test.tsx +0 -81
- package/test/unit/hooks/useKeyBindings.isolated.ts +0 -715
- package/test/unit/hooks/useProjects.test.tsx +0 -186
- package/test/unit/hooks/useUnifiedRepos-simple.test.tsx +0 -115
- package/test/unit/hooks/useUnifiedRepos.test.tsx +0 -177
- package/test/unit/mocks/config.ts +0 -109
- package/test/unit/mocks/git-service.ts +0 -274
- package/test/unit/mocks/github-service.ts +0 -250
- package/test/unit/mocks/index.ts +0 -72
- package/test/unit/mocks/project.ts +0 -148
- package/test/unit/mocks/state-mocks.ts +0 -187
- package/test/unit/mocks/unified.ts +0 -169
- package/test/unit/operations/batch.test.ts +0 -216
- package/test/unit/operations/commands.test.ts +0 -550
- package/test/unit/scanner/errors.test.ts +0 -297
- package/test/unit/scanner/index.test.ts +0 -1011
- package/test/unit/scanner/markers.test.ts +0 -150
- package/test/unit/scanner/submodules.test.ts +0 -99
- package/test/unit/services/git-errors.test.ts +0 -190
- package/test/unit/services/git.test.ts +0 -442
- package/test/unit/services/github-errors.test.ts +0 -293
- package/test/unit/services/github.test.ts +0 -200
- package/test/unit/state/actions.test.ts +0 -217
- package/test/unit/state/reducer.test.ts +0 -745
- package/test/unit/state/store.test.tsx +0 -711
- package/test/unit/types/commands.test.ts +0 -220
- package/test/unit/types/schema.test.ts +0 -179
- package/test/unit/utils/array.test.ts +0 -73
- package/test/unit/utils/debug.test.ts +0 -23
- package/test/unit/utils/errors.test.ts +0 -295
- package/test/unit/utils/markdown.test.ts +0 -163
- package/test/unit/utils/project-utils.test.ts +0 -756
- package/test/unit/utils/rate-limiter.test.ts +0 -256
- package/test/unit/utils/retry.test.ts +0 -165
- package/test/unit/utils/strip-ansi.ts +0 -13
- package/test/unit/utils/timeout.test.ts +0 -93
- package/tsconfig.json +0 -29
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from "bun:test";
|
|
2
|
-
import { render } from "ink-testing-library";
|
|
3
|
-
import { ViewModeIndicator } from "../../../src/components/ViewModeIndicator.tsx";
|
|
4
|
-
|
|
5
|
-
describe("ViewModeIndicator", () => {
|
|
6
|
-
test("renders local mode", () => {
|
|
7
|
-
const { lastFrame } = render(<ViewModeIndicator mode="local" />);
|
|
8
|
-
const output = lastFrame();
|
|
9
|
-
|
|
10
|
-
expect(output).toContain("💻");
|
|
11
|
-
expect(output).toContain("[Local]");
|
|
12
|
-
expect(output).toContain("(Tab)");
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("renders github mode", () => {
|
|
16
|
-
const { lastFrame } = render(<ViewModeIndicator mode="github" />);
|
|
17
|
-
const output = lastFrame();
|
|
18
|
-
|
|
19
|
-
expect(output).toContain("☁");
|
|
20
|
-
expect(output).toContain("[GitHub]");
|
|
21
|
-
expect(output).toContain("(Tab)");
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test("renders combined mode", () => {
|
|
25
|
-
const { lastFrame } = render(<ViewModeIndicator mode="combined" />);
|
|
26
|
-
const output = lastFrame();
|
|
27
|
-
|
|
28
|
-
expect(output).toContain("🔗");
|
|
29
|
-
expect(output).toContain("[All]");
|
|
30
|
-
expect(output).toContain("(Tab)");
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
test("shows loading indicator", () => {
|
|
34
|
-
const { lastFrame } = render(
|
|
35
|
-
<ViewModeIndicator mode="github" isLoadingGitHub={true} />
|
|
36
|
-
);
|
|
37
|
-
const output = lastFrame();
|
|
38
|
-
|
|
39
|
-
expect(output).toContain("☁");
|
|
40
|
-
expect(output).toContain("[GitHub]");
|
|
41
|
-
expect(output).toContain("⟳"); // Loading indicator
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("shows error indicator", () => {
|
|
45
|
-
const { lastFrame } = render(
|
|
46
|
-
<ViewModeIndicator mode="github" githubError="Failed to fetch" />
|
|
47
|
-
);
|
|
48
|
-
const output = lastFrame();
|
|
49
|
-
|
|
50
|
-
expect(output).toContain("☁");
|
|
51
|
-
expect(output).toContain("[GitHub]");
|
|
52
|
-
expect(output).toContain("⚠"); // Error indicator
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test("does not show loading when error exists", () => {
|
|
56
|
-
const { lastFrame } = render(
|
|
57
|
-
<ViewModeIndicator
|
|
58
|
-
mode="github"
|
|
59
|
-
isLoadingGitHub={true}
|
|
60
|
-
githubError="Failed to fetch"
|
|
61
|
-
/>
|
|
62
|
-
);
|
|
63
|
-
const output = lastFrame();
|
|
64
|
-
|
|
65
|
-
expect(output).toContain("☁");
|
|
66
|
-
expect(output).toContain("[GitHub]");
|
|
67
|
-
// Error indicator should not show when loading is true
|
|
68
|
-
expect(output).not.toContain("⚠");
|
|
69
|
-
expect(output).toContain("⟳"); // Loading shows when isLoadingGitHub is true
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("applies correct colors", () => {
|
|
73
|
-
// Local mode should have 💻
|
|
74
|
-
const { lastFrame: localFrame } = render(<ViewModeIndicator mode="local" />);
|
|
75
|
-
expect(localFrame()).toContain("💻");
|
|
76
|
-
expect(localFrame()).toContain("[Local]");
|
|
77
|
-
|
|
78
|
-
// GitHub mode should have ☁
|
|
79
|
-
const { lastFrame: githubFrame } = render(<ViewModeIndicator mode="github" />);
|
|
80
|
-
expect(githubFrame()).toContain("☁");
|
|
81
|
-
expect(githubFrame()).toContain("[GitHub]");
|
|
82
|
-
|
|
83
|
-
// Combined mode should have 🔗
|
|
84
|
-
const { lastFrame: combinedFrame } = render(
|
|
85
|
-
<ViewModeIndicator mode="combined" />
|
|
86
|
-
);
|
|
87
|
-
expect(combinedFrame()).toContain("🔗");
|
|
88
|
-
expect(combinedFrame()).toContain("[All]");
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test("renders with all props", () => {
|
|
92
|
-
const { lastFrame } = render(
|
|
93
|
-
<ViewModeIndicator
|
|
94
|
-
mode="combined"
|
|
95
|
-
isLoadingGitHub={false}
|
|
96
|
-
githubError={null}
|
|
97
|
-
/>
|
|
98
|
-
);
|
|
99
|
-
const output = lastFrame();
|
|
100
|
-
|
|
101
|
-
expect(output).toContain("🔗");
|
|
102
|
-
expect(output).toContain("[All]");
|
|
103
|
-
expect(output).toContain("(Tab)");
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test("renders with minimal props", () => {
|
|
107
|
-
const { lastFrame } = render(<ViewModeIndicator mode="local" />);
|
|
108
|
-
const output = lastFrame();
|
|
109
|
-
|
|
110
|
-
expect(output).toContain("💻");
|
|
111
|
-
expect(output).toContain("[Local]");
|
|
112
|
-
expect(output).toContain("(Tab)");
|
|
113
|
-
expect(output).not.toContain("⟳");
|
|
114
|
-
expect(output).not.toContain("⚠");
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test("handles empty error string", () => {
|
|
118
|
-
const { lastFrame } = render(
|
|
119
|
-
<ViewModeIndicator mode="github" githubError="" />
|
|
120
|
-
);
|
|
121
|
-
const output = lastFrame();
|
|
122
|
-
|
|
123
|
-
expect(output).toContain("☁");
|
|
124
|
-
expect(output).toContain("[GitHub]");
|
|
125
|
-
// Empty string should not show error indicator
|
|
126
|
-
expect(output).not.toContain("⚠");
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test("renders with space between elements", () => {
|
|
130
|
-
const { lastFrame } = render(<ViewModeIndicator mode="local" />
|
|
131
|
-
);
|
|
132
|
-
const output = lastFrame();
|
|
133
|
-
|
|
134
|
-
expect(output).toMatch(/💻\s*\[Local\]/);
|
|
135
|
-
expect(output).toMatch(/\[Local\]\s*\(Tab\)/);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test utilities for Ink components
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import React from "react";
|
|
6
|
-
import { render } from "ink-testing-library";
|
|
7
|
-
import { StoreProvider } from "../../../src/state/store.tsx";
|
|
8
|
-
import type { AppState, AppAction } from "../../../src/types/index.ts";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Default state for testing
|
|
12
|
-
*/
|
|
13
|
-
export const defaultTestState: AppState = {
|
|
14
|
-
projects: [],
|
|
15
|
-
isLoading: false,
|
|
16
|
-
error: null,
|
|
17
|
-
message: null,
|
|
18
|
-
cursorIndex: 0,
|
|
19
|
-
selectedIndices: new Set(),
|
|
20
|
-
scrollOffset: 0,
|
|
21
|
-
filterText: "",
|
|
22
|
-
quickFilter: "all",
|
|
23
|
-
sortBy: "status",
|
|
24
|
-
sortDirection: "desc",
|
|
25
|
-
mode: "normal",
|
|
26
|
-
actionInProgress: null,
|
|
27
|
-
actionProgress: null,
|
|
28
|
-
confirmDialog: null,
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Mock dispatch function that tracks calls
|
|
33
|
-
*/
|
|
34
|
-
export function createMockDispatch(): {
|
|
35
|
-
dispatch: React.Dispatch<AppAction>;
|
|
36
|
-
calls: AppAction[];
|
|
37
|
-
} {
|
|
38
|
-
const calls: AppAction[] = [];
|
|
39
|
-
const dispatch = (action: AppAction) => {
|
|
40
|
-
calls.push(action);
|
|
41
|
-
};
|
|
42
|
-
return { dispatch, calls };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Render a component within the store provider for testing
|
|
47
|
-
* Note: This uses the default store - for custom state, use TestStoreProvider
|
|
48
|
-
*/
|
|
49
|
-
export function renderWithStore(ui: React.ReactNode) {
|
|
50
|
-
return render(<StoreProvider>{ui}</StoreProvider>);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Create a custom store provider for tests
|
|
55
|
-
*/
|
|
56
|
-
interface TestStoreProviderProps {
|
|
57
|
-
state?: Partial<AppState>;
|
|
58
|
-
dispatch?: React.Dispatch<AppAction>;
|
|
59
|
-
children: React.ReactNode;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// For tests that need custom state, we'll pass props directly to components
|
|
63
|
-
// since the real StoreProvider uses useReducer internally
|