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.
Files changed (183) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +24 -4
  3. package/src/github/auth.ts +3 -3
  4. package/src/utils/debug.ts +4 -4
  5. package/.bunignore +0 -7
  6. package/.github/workflows/ci.yml +0 -73
  7. package/CLAUDE.md +0 -111
  8. package/CONTRIBUTING.md +0 -145
  9. package/bun.lock +0 -267
  10. package/bunfig.toml +0 -15
  11. package/cli +0 -0
  12. package/docs/ai/IMPROVEMENT_PLAN.md +0 -341
  13. package/docs/ai/VERIFICATION_REPORT.md +0 -87
  14. package/docs/ai/architecture.md +0 -169
  15. package/docs/ai/checks/check-2025-12-02-tests.md +0 -40
  16. package/docs/ai/checks/check-2025-12-02.md +0 -55
  17. package/docs/ai/checks/test-verification-report.md +0 -85
  18. package/docs/ai/implementation-guide.md +0 -776
  19. package/docs/ai/research/gitty-codebase-analysis.md +0 -221
  20. package/docs/ai/tickets/GENERAL-sitrep.md +0 -30
  21. package/docs/ai/tickets/TASK-database-tests-sitrep.md +0 -25
  22. package/docs/ai/tickets/TASK-deprecated-functions-sitrep.md +0 -28
  23. package/docs/ai/tickets/TASK-detail-modal-sitrep.md +0 -28
  24. package/docs/ai/tickets/TASK-filter-overlay-sitrep.md +0 -24
  25. package/docs/ai/tickets/TASK-github-service-sitrep.md +0 -32
  26. package/docs/ai/tickets/TASK-github-token-sitrep.md +0 -51
  27. package/docs/ai/tickets/TASK-hascommits-sitrep.md +0 -35
  28. package/docs/ai/tickets/TASK-keybindings-sitrep.md +0 -26
  29. package/docs/ai/tickets/TASK-layout-sitrep.md +0 -25
  30. package/docs/ai/tickets/TASK-markdown-sitrep.md +0 -28
  31. package/docs/ai/tickets/TASK-project-item-sitrep.md +0 -79
  32. package/docs/ai/tickets/TASK-sitrep.md +0 -28
  33. package/docs/ai/tickets/TASK-state-sitrep.md +0 -26
  34. package/docs/ai/tickets/TASK-types-sitrep.md +0 -25
  35. package/docs/ai/tickets/TASK-unified-item-fix-sitrep.md +0 -26
  36. package/docs/ai/tickets/TKT-001-sitrep.md +0 -24
  37. package/docs/ai/tickets/TKT-002-sitrep.md +0 -25
  38. package/docs/ai/tickets/TKT-003-git-service-refactoring-complete.md +0 -46
  39. package/docs/ai/tickets/TKT-003-git-service-refactoring-plan.md +0 -135
  40. package/docs/ai/tickets/TKT-003-sitrep.md +0 -26
  41. package/docs/ai/tickets/TKT-004-sitrep.md +0 -27
  42. package/docs/ai/tickets/TKT-005-sitrep.md +0 -25
  43. package/docs/ai/tickets/TKT-006-sitrep.md +0 -26
  44. package/docs/ai/tickets/TKT-007-sitrep.md +0 -30
  45. package/docs/ai/tickets/TKT-008-sitrep.md +0 -32
  46. package/docs/ai/tickets/TKT-009-sitrep.md +0 -27
  47. package/docs/ai/tickets/TKT-010-sitrep.md +0 -27
  48. package/docs/ai/tickets/TKT-011-sitrep.md +0 -26
  49. package/docs/ai/tickets/TKT-012-sitrep.md +0 -25
  50. package/docs/ai/tickets/sitreps/TASK-actions-sitrep.md +0 -28
  51. package/docs/ai/tickets/sitreps/TASK-actions-test-sitrep.md +0 -25
  52. package/docs/ai/tickets/sitreps/TASK-app-integration-sitrep.md +0 -25
  53. package/docs/ai/tickets/sitreps/TASK-background-fetch-sitrep.md +0 -24
  54. package/docs/ai/tickets/sitreps/TASK-background-fetch-test-sitrep.md +0 -29
  55. package/docs/ai/tickets/sitreps/TASK-batch-tests-sitrep.md +0 -29
  56. package/docs/ai/tickets/sitreps/TASK-bun-test-sitrep.md +0 -26
  57. package/docs/ai/tickets/sitreps/TASK-cache-tests-sitrep.md +0 -30
  58. package/docs/ai/tickets/sitreps/TASK-cli-tests-sitrep.md +0 -28
  59. package/docs/ai/tickets/sitreps/TASK-clone-error-handling-sitrep.md +0 -26
  60. package/docs/ai/tickets/sitreps/TASK-commands-tests-sitrep.md +0 -25
  61. package/docs/ai/tickets/sitreps/TASK-component-tests-1-sitrep.md +0 -30
  62. package/docs/ai/tickets/sitreps/TASK-configloader-tests-sitrep.md +0 -25
  63. package/docs/ai/tickets/sitreps/TASK-confirm-dialog-test-sitrep.md +0 -29
  64. package/docs/ai/tickets/sitreps/TASK-coverage-sitrep.md +0 -95
  65. package/docs/ai/tickets/sitreps/TASK-database-tests-summary.md +0 -61
  66. package/docs/ai/tickets/sitreps/TASK-error-boundary-sitrep.md +0 -30
  67. package/docs/ai/tickets/sitreps/TASK-error-tests-sitrep.md +0 -27
  68. package/docs/ai/tickets/sitreps/TASK-errors-tests-sitrep.md +0 -25
  69. package/docs/ai/tickets/sitreps/TASK-extract-reducer-sitrep.md +0 -27
  70. package/docs/ai/tickets/sitreps/TASK-filter-overlay-test-sitrep.md +0 -25
  71. package/docs/ai/tickets/sitreps/TASK-final-verification-sitrep.md +0 -28
  72. package/docs/ai/tickets/sitreps/TASK-fix-all-tests-sitrep.md +0 -25
  73. package/docs/ai/tickets/sitreps/TASK-fix-hooks-sitrep.md +0 -26
  74. package/docs/ai/tickets/sitreps/TASK-fix-remaining-tests-sitrep.md +0 -25
  75. package/docs/ai/tickets/sitreps/TASK-fix-test-failures-sitrep.md +0 -26
  76. package/docs/ai/tickets/sitreps/TASK-fix-tests-sitrep.md +0 -24
  77. package/docs/ai/tickets/sitreps/TASK-formatters-tests-sitrep.md +0 -25
  78. package/docs/ai/tickets/sitreps/TASK-git-timeouts-sitrep.md +0 -29
  79. package/docs/ai/tickets/sitreps/TASK-github-cache-test-sitrep.md +0 -25
  80. package/docs/ai/tickets/sitreps/TASK-githubcli-tests-sitrep.md +0 -24
  81. package/docs/ai/tickets/sitreps/TASK-gitstatus-tests-sitrep.md +0 -24
  82. package/docs/ai/tickets/sitreps/TASK-hooks-isolation-sitrep.md +0 -27
  83. package/docs/ai/tickets/sitreps/TASK-keybindings-tests-sitrep.md +0 -25
  84. package/docs/ai/tickets/sitreps/TASK-layout-tests-sitrep.md +0 -25
  85. package/docs/ai/tickets/sitreps/TASK-mock-factories-sitrep.md +0 -27
  86. package/docs/ai/tickets/sitreps/TASK-modal-tests-sitrep.md +0 -32
  87. package/docs/ai/tickets/sitreps/TASK-processbatch-fix-sitrep.md +0 -27
  88. package/docs/ai/tickets/sitreps/TASK-projectlist-tests-sitrep.md +0 -30
  89. package/docs/ai/tickets/sitreps/TASK-projectutils-tests-sitrep.md +0 -25
  90. package/docs/ai/tickets/sitreps/TASK-scanner-tests-sitrep.md +0 -29
  91. package/docs/ai/tickets/sitreps/TASK-select-all-sitrep.md +0 -25
  92. package/docs/ai/tickets/sitreps/TASK-shell-error-handling-sitrep.md +0 -27
  93. package/docs/ai/tickets/sitreps/TASK-store-tests-sitrep.md +0 -25
  94. package/docs/ai/tickets/sitreps/TASK-test-fixes-sitrep.md +0 -26
  95. package/docs/ai/tickets/sitreps/TASK-test-summary-sitrep.md +0 -25
  96. package/docs/ai/tickets/sitreps/TASK-test-verification-sitrep.md +0 -27
  97. package/docs/ai/tickets/sitreps/TASK-testsuite-sitrep.md +0 -75
  98. package/docs/ai/tickets/sitreps/TASK-unified-reducer-tests-sitrep.md +0 -29
  99. package/docs/ai/tickets/sitreps/TASK-unified-repos-test-sitrep.md +0 -29
  100. package/docs/ai/tickets/sitreps/TASK-unified-tests-sitrep.md +0 -25
  101. package/docs/ai/tickets/sitreps/TASK-useprojects-tests-sitrep.md +0 -25
  102. package/docs/ai/tickets/sitreps/TASK-utility-tests-sitrep.md +0 -32
  103. package/docs/ai/tickets/sitreps/TKT-003-git-service-refactoring-sitrep.md +0 -64
  104. package/docs/ai/tkt-001-fix-database-error.md +0 -217
  105. package/docs/ai/ui-enhancement-plan.md +0 -562
  106. package/test/integration/app.isolated.tsx +0 -240
  107. package/test/integration/cli-commands.test.ts +0 -287
  108. package/test/integration/cli-validation.test.ts +0 -264
  109. package/test/integration/git-operations.test.ts +0 -218
  110. package/test/integration/scanner.test.ts +0 -228
  111. package/test/preload.ts +0 -18
  112. package/test/unit/cli/commands.test.ts +0 -13
  113. package/test/unit/cli/formatters.test.ts +0 -1116
  114. package/test/unit/cli/github-commands.test.ts +0 -12
  115. package/test/unit/components/CloneDialog.test.tsx +0 -240
  116. package/test/unit/components/ColumnHeader.test.tsx +0 -128
  117. package/test/unit/components/CommandPalette.test.tsx +0 -355
  118. package/test/unit/components/ConfirmDialog.test.tsx +0 -111
  119. package/test/unit/components/ErrorBoundary.test.tsx +0 -139
  120. package/test/unit/components/FilterBar.test.tsx +0 -43
  121. package/test/unit/components/FilterOptionsOverlay.test.tsx +0 -197
  122. package/test/unit/components/HelpOverlay.test.tsx +0 -90
  123. package/test/unit/components/Layout.test.tsx +0 -328
  124. package/test/unit/components/MarkdownRenderer.test.tsx +0 -45
  125. package/test/unit/components/ProgressBar.test.tsx +0 -138
  126. package/test/unit/components/ProjectItem.test.tsx +0 -182
  127. package/test/unit/components/ProjectList.test.tsx +0 -311
  128. package/test/unit/components/RepoDetailModal.test.tsx +0 -445
  129. package/test/unit/components/StatusBar.test.tsx +0 -112
  130. package/test/unit/components/UnifiedProjectItem.test.tsx +0 -618
  131. package/test/unit/components/ViewModeIndicator.test.tsx +0 -137
  132. package/test/unit/components/test-utils.tsx +0 -63
  133. package/test/unit/config/loader.test.ts +0 -692
  134. package/test/unit/db/database.test.ts +0 -978
  135. package/test/unit/db/index.test.ts +0 -314
  136. package/test/unit/fixtures/setup.ts +0 -186
  137. package/test/unit/git/commands-untested.test.ts +0 -205
  138. package/test/unit/git/commands.test.ts +0 -269
  139. package/test/unit/git/operations.test.ts +0 -322
  140. package/test/unit/git/status.test.ts +0 -219
  141. package/test/unit/github/auth.test.ts +0 -317
  142. package/test/unit/github/cache.test.ts +0 -1028
  143. package/test/unit/github/cli.test.ts +0 -135
  144. package/test/unit/github/unified.test.ts +0 -1201
  145. package/test/unit/graceful-shutdown.test.ts +0 -83
  146. package/test/unit/hooks/useBackgroundFetch.test.tsx +0 -239
  147. package/test/unit/hooks/useConfirmDialogActions.test.tsx +0 -81
  148. package/test/unit/hooks/useKeyBindings.isolated.ts +0 -715
  149. package/test/unit/hooks/useProjects.test.tsx +0 -186
  150. package/test/unit/hooks/useUnifiedRepos-simple.test.tsx +0 -115
  151. package/test/unit/hooks/useUnifiedRepos.test.tsx +0 -177
  152. package/test/unit/mocks/config.ts +0 -109
  153. package/test/unit/mocks/git-service.ts +0 -274
  154. package/test/unit/mocks/github-service.ts +0 -250
  155. package/test/unit/mocks/index.ts +0 -72
  156. package/test/unit/mocks/project.ts +0 -148
  157. package/test/unit/mocks/state-mocks.ts +0 -187
  158. package/test/unit/mocks/unified.ts +0 -169
  159. package/test/unit/operations/batch.test.ts +0 -216
  160. package/test/unit/operations/commands.test.ts +0 -550
  161. package/test/unit/scanner/errors.test.ts +0 -297
  162. package/test/unit/scanner/index.test.ts +0 -1011
  163. package/test/unit/scanner/markers.test.ts +0 -150
  164. package/test/unit/scanner/submodules.test.ts +0 -99
  165. package/test/unit/services/git-errors.test.ts +0 -190
  166. package/test/unit/services/git.test.ts +0 -442
  167. package/test/unit/services/github-errors.test.ts +0 -293
  168. package/test/unit/services/github.test.ts +0 -200
  169. package/test/unit/state/actions.test.ts +0 -217
  170. package/test/unit/state/reducer.test.ts +0 -745
  171. package/test/unit/state/store.test.tsx +0 -711
  172. package/test/unit/types/commands.test.ts +0 -220
  173. package/test/unit/types/schema.test.ts +0 -179
  174. package/test/unit/utils/array.test.ts +0 -73
  175. package/test/unit/utils/debug.test.ts +0 -23
  176. package/test/unit/utils/errors.test.ts +0 -295
  177. package/test/unit/utils/markdown.test.ts +0 -163
  178. package/test/unit/utils/project-utils.test.ts +0 -756
  179. package/test/unit/utils/rate-limiter.test.ts +0 -256
  180. package/test/unit/utils/retry.test.ts +0 -165
  181. package/test/unit/utils/strip-ansi.ts +0 -13
  182. package/test/unit/utils/timeout.test.ts +0 -93
  183. 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