reviewflow 3.19.1 → 3.20.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 (132) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/dashboard/index.html +107 -34
  3. package/dist/dashboard/modules/constants.d.ts +1 -0
  4. package/dist/dashboard/modules/constants.d.ts.map +1 -1
  5. package/dist/dashboard/modules/constants.js +1 -0
  6. package/dist/dashboard/modules/constants.js.map +1 -1
  7. package/dist/dashboard/modules/overview.d.ts +64 -0
  8. package/dist/dashboard/modules/overview.d.ts.map +1 -0
  9. package/dist/dashboard/modules/overview.js +246 -0
  10. package/dist/dashboard/modules/overview.js.map +1 -0
  11. package/dist/dashboard/modules/tabBar.d.ts +56 -0
  12. package/dist/dashboard/modules/tabBar.d.ts.map +1 -0
  13. package/dist/dashboard/modules/tabBar.js +98 -0
  14. package/dist/dashboard/modules/tabBar.js.map +1 -0
  15. package/dist/dashboard/styles.css +324 -0
  16. package/dist/main/cli.d.ts +1 -83
  17. package/dist/main/cli.d.ts.map +1 -1
  18. package/dist/main/cli.js +24 -606
  19. package/dist/main/cli.js.map +1 -1
  20. package/dist/main/commands/discover.command.d.ts +17 -0
  21. package/dist/main/commands/discover.command.d.ts.map +1 -0
  22. package/dist/main/commands/discover.command.js +76 -0
  23. package/dist/main/commands/discover.command.js.map +1 -0
  24. package/dist/main/commands/followupImportants.command.d.ts +14 -0
  25. package/dist/main/commands/followupImportants.command.d.ts.map +1 -0
  26. package/dist/main/commands/followupImportants.command.js +31 -0
  27. package/dist/main/commands/followupImportants.command.js.map +1 -0
  28. package/dist/main/commands/init.command.d.ts +29 -0
  29. package/dist/main/commands/init.command.d.ts.map +1 -0
  30. package/dist/main/commands/init.command.js +231 -0
  31. package/dist/main/commands/init.command.js.map +1 -0
  32. package/dist/main/commands/logs.command.d.ts +10 -0
  33. package/dist/main/commands/logs.command.d.ts.map +1 -0
  34. package/dist/main/commands/logs.command.js +42 -0
  35. package/dist/main/commands/logs.command.js.map +1 -0
  36. package/dist/main/commands/start.command.d.ts +21 -0
  37. package/dist/main/commands/start.command.d.ts.map +1 -0
  38. package/dist/main/commands/start.command.js +80 -0
  39. package/dist/main/commands/start.command.js.map +1 -0
  40. package/dist/main/commands/status.command.d.ts +9 -0
  41. package/dist/main/commands/status.command.d.ts.map +1 -0
  42. package/dist/main/commands/status.command.js +26 -0
  43. package/dist/main/commands/status.command.js.map +1 -0
  44. package/dist/main/commands/stop.command.d.ts +11 -0
  45. package/dist/main/commands/stop.command.d.ts.map +1 -0
  46. package/dist/main/commands/stop.command.js +30 -0
  47. package/dist/main/commands/stop.command.js.map +1 -0
  48. package/dist/main/commands/validate.command.d.ts +11 -0
  49. package/dist/main/commands/validate.command.d.ts.map +1 -0
  50. package/dist/main/commands/validate.command.js +54 -0
  51. package/dist/main/commands/validate.command.js.map +1 -0
  52. package/dist/main/routes.d.ts.map +1 -1
  53. package/dist/main/routes.js +20 -9
  54. package/dist/main/routes.js.map +1 -1
  55. package/dist/main/shared/cliConstants.d.ts +5 -0
  56. package/dist/main/shared/cliConstants.d.ts.map +1 -0
  57. package/dist/main/shared/cliConstants.js +86 -0
  58. package/dist/main/shared/cliConstants.js.map +1 -0
  59. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.d.ts +7 -0
  60. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.d.ts.map +1 -0
  61. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.js +13 -0
  62. package/dist/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.js.map +1 -0
  63. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.d.ts +14 -0
  64. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.d.ts.map +1 -0
  65. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.js +39 -0
  66. package/dist/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.js.map +1 -0
  67. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.d.ts +88 -0
  68. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.d.ts.map +1 -0
  69. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.js +129 -0
  70. package/dist/modules/statistics-insights/interface-adapters/presenters/overview.presenter.js.map +1 -0
  71. package/dist/shared/services/pidFileManager.d.ts +6 -0
  72. package/dist/shared/services/pidFileManager.d.ts.map +1 -1
  73. package/dist/shared/services/pidFileManager.js.map +1 -1
  74. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.d.ts +10 -0
  75. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.d.ts.map +1 -0
  76. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.js +272 -0
  77. package/dist/tests/acceptance/91-dashboard-multi-project-overview.acceptance.test.js.map +1 -0
  78. package/dist/tests/factories/projectStatsApiResponse.factory.d.ts +16 -0
  79. package/dist/tests/factories/projectStatsApiResponse.factory.d.ts.map +1 -0
  80. package/dist/tests/factories/projectStatsApiResponse.factory.js +39 -0
  81. package/dist/tests/factories/projectStatsApiResponse.factory.js.map +1 -0
  82. package/dist/tests/factories/recentReviewFile.factory.d.ts +5 -0
  83. package/dist/tests/factories/recentReviewFile.factory.d.ts.map +1 -0
  84. package/dist/tests/factories/recentReviewFile.factory.js +16 -0
  85. package/dist/tests/factories/recentReviewFile.factory.js.map +1 -0
  86. package/dist/tests/factories/repositoryConfig.factory.d.ts +5 -0
  87. package/dist/tests/factories/repositoryConfig.factory.d.ts.map +1 -0
  88. package/dist/tests/factories/repositoryConfig.factory.js +14 -0
  89. package/dist/tests/factories/repositoryConfig.factory.js.map +1 -0
  90. package/dist/tests/units/dashboard/modules/constants.test.js +2 -1
  91. package/dist/tests/units/dashboard/modules/constants.test.js.map +1 -1
  92. package/dist/tests/units/dashboard/modules/overview.test.d.ts +2 -0
  93. package/dist/tests/units/dashboard/modules/overview.test.d.ts.map +1 -0
  94. package/dist/tests/units/dashboard/modules/overview.test.js +176 -0
  95. package/dist/tests/units/dashboard/modules/overview.test.js.map +1 -0
  96. package/dist/tests/units/dashboard/modules/tabBar.test.d.ts +2 -0
  97. package/dist/tests/units/dashboard/modules/tabBar.test.d.ts.map +1 -0
  98. package/dist/tests/units/dashboard/modules/tabBar.test.js +99 -0
  99. package/dist/tests/units/dashboard/modules/tabBar.test.js.map +1 -0
  100. package/dist/tests/units/main/executeDiscover.test.js +1 -1
  101. package/dist/tests/units/main/executeDiscover.test.js.map +1 -1
  102. package/dist/tests/units/main/executeFollowupImportants.test.d.ts +2 -0
  103. package/dist/tests/units/main/executeFollowupImportants.test.d.ts.map +1 -0
  104. package/dist/tests/units/main/executeFollowupImportants.test.js +48 -0
  105. package/dist/tests/units/main/executeFollowupImportants.test.js.map +1 -0
  106. package/dist/tests/units/main/executeInit.test.js +1 -1
  107. package/dist/tests/units/main/executeInit.test.js.map +1 -1
  108. package/dist/tests/units/main/executeLogs.test.js +1 -1
  109. package/dist/tests/units/main/executeLogs.test.js.map +1 -1
  110. package/dist/tests/units/main/executeStart.test.js +1 -1
  111. package/dist/tests/units/main/executeStart.test.js.map +1 -1
  112. package/dist/tests/units/main/executeStatus.test.js +1 -1
  113. package/dist/tests/units/main/executeStatus.test.js.map +1 -1
  114. package/dist/tests/units/main/executeStop.test.js +1 -1
  115. package/dist/tests/units/main/executeStop.test.js.map +1 -1
  116. package/dist/tests/units/main/executeValidate.test.d.ts +2 -0
  117. package/dist/tests/units/main/executeValidate.test.d.ts.map +1 -0
  118. package/dist/tests/units/main/executeValidate.test.js +76 -0
  119. package/dist/tests/units/main/executeValidate.test.js.map +1 -0
  120. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.d.ts +2 -0
  121. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.d.ts.map +1 -0
  122. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.js +57 -0
  123. package/dist/tests/units/modules/cli-configuration/interface-adapters/controllers/http/repositories.routes.test.js.map +1 -0
  124. package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.d.ts +2 -0
  125. package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.d.ts.map +1 -0
  126. package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.js +156 -0
  127. package/dist/tests/units/modules/statistics-insights/interface-adapters/controllers/http/overview.routes.test.js.map +1 -0
  128. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.d.ts +2 -0
  129. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.d.ts.map +1 -0
  130. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js +289 -0
  131. package/dist/tests/units/modules/statistics-insights/interface-adapters/presenters/overview.presenter.test.js.map +1 -0
  132. package/package.json +1 -1
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Dashboard module — tab bar humble object (SPEC-91).
3
+ * Pure functions, no global state, no DOM access in render helpers.
4
+ * localStorage is touched only by readActiveTab / writeActiveTab.
5
+ *
6
+ * Visual DNA: "Agentic OS" — see project_agentic_os_design_dna.md.
7
+ */
8
+
9
+ import { STORAGE_KEY_ACTIVE_TAB } from './constants.js';
10
+ import { escapeHtml } from './html.js';
11
+
12
+ const OVERVIEW_TAB_ID = 'overview';
13
+ const OVERVIEW_TAB_LABEL = 'Overview';
14
+
15
+ /**
16
+ * @typedef {Object} TabBarRepositoryInput
17
+ * @property {string} name
18
+ * @property {string} localPath
19
+ */
20
+
21
+ /**
22
+ * @typedef {Object} TabBarBuildInput
23
+ * @property {TabBarRepositoryInput[]} repositories
24
+ * @property {string | null} activeTabId
25
+ */
26
+
27
+ /**
28
+ * @typedef {Object} TabBarTabViewModel
29
+ * @property {string} id
30
+ * @property {string} label
31
+ * @property {boolean} isActive
32
+ */
33
+
34
+ /**
35
+ * @typedef {Object} TabBarViewModel
36
+ * @property {TabBarTabViewModel[]} tabs
37
+ */
38
+
39
+ /**
40
+ * @param {TabBarBuildInput} input
41
+ * @returns {TabBarViewModel}
42
+ */
43
+ export function buildTabBarModel(input) {
44
+ const repositories = Array.isArray(input.repositories) ? input.repositories : [];
45
+ const projectTabIds = new Set(repositories.map((repository) => repository.localPath));
46
+ const activeTabIdMatchesProject = input.activeTabId !== null && projectTabIds.has(input.activeTabId);
47
+ const effectiveActiveId = activeTabIdMatchesProject ? input.activeTabId : OVERVIEW_TAB_ID;
48
+
49
+ const overviewTab = {
50
+ id: OVERVIEW_TAB_ID,
51
+ label: OVERVIEW_TAB_LABEL,
52
+ isActive: effectiveActiveId === OVERVIEW_TAB_ID,
53
+ };
54
+ const projectTabs = repositories.map((repository) => ({
55
+ id: repository.localPath,
56
+ label: repository.name,
57
+ isActive: effectiveActiveId === repository.localPath,
58
+ }));
59
+
60
+ return { tabs: [overviewTab, ...projectTabs] };
61
+ }
62
+
63
+ /**
64
+ * @param {TabBarViewModel} viewModel
65
+ * @returns {string}
66
+ */
67
+ export function renderTabBarHtml(viewModel) {
68
+ const buttons = viewModel.tabs
69
+ .map((tab) => {
70
+ const activeClass = tab.isActive ? ' is-active' : '';
71
+ return `<button type="button" class="dashboard-tab${activeClass}" data-tab-id="${escapeHtml(tab.id)}" role="tab" aria-selected="${tab.isActive ? 'true' : 'false'}">${escapeHtml(tab.label)}</button>`;
72
+ })
73
+ .join('');
74
+ return `<nav class="dashboard-tab-bar" role="tablist">${buttons}</nav>`;
75
+ }
76
+
77
+ /**
78
+ * @returns {string | null}
79
+ */
80
+ export function readActiveTab() {
81
+ try {
82
+ return localStorage.getItem(STORAGE_KEY_ACTIVE_TAB);
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * @param {string} tabId
90
+ * @returns {void}
91
+ */
92
+ export function writeActiveTab(tabId) {
93
+ try {
94
+ localStorage.setItem(STORAGE_KEY_ACTIVE_TAB, tabId);
95
+ } catch {
96
+ // localStorage may be unavailable (private mode, server-side rendering); ignore.
97
+ }
98
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabBar.js","sourceRoot":"","sources":["../../../src/dashboard/modules/tabBar.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC;;;;GAIG;AAEH;;;;GAIG;AAEH;;;;;GAKG;AAEH;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAK;IACpC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACtF,MAAM,yBAAyB,GAAG,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrG,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;IAE1F,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,kBAAkB;QACzB,QAAQ,EAAE,iBAAiB,KAAK,eAAe;KAChD,CAAC;IACF,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,EAAE,EAAE,UAAU,CAAC,SAAS;QACxB,KAAK,EAAE,UAAU,CAAC,IAAI;QACtB,QAAQ,EAAE,iBAAiB,KAAK,UAAU,CAAC,SAAS;KACrD,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAS;IACxC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI;SAC3B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,6CAA6C,WAAW,kBAAkB,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,+BAA+B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;IACzM,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,iDAAiD,OAAO,QAAQ,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAK;IAClC,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;IACnF,CAAC;AACH,CAAC"}
@@ -4573,3 +4573,327 @@ input:focus-visible,
4573
4573
  animation: none !important;
4574
4574
  }
4575
4575
  }
4576
+
4577
+ /* ============================================================
4578
+ SPEC-91 — Dashboard Multi-Project Overview
4579
+ Visual DNA: warm near-black + amber + green, monospace,
4580
+ corner-bracket frames, // LABEL prefix, glow-pulse status dots.
4581
+ Reference: project_agentic_os_design_dna.md.
4582
+ ============================================================ */
4583
+
4584
+ .dashboard-tab-bar-wrapper {
4585
+ --overview-bg: #0a0908;
4586
+ --overview-border-faint: rgba(255, 180, 100, 0.12);
4587
+ --overview-border-active: rgba(255, 138, 61, 0.65);
4588
+ --overview-accent: #ff8a3d;
4589
+ --overview-accent-dim: #a85a25;
4590
+ --overview-success: #5ce28b;
4591
+ --overview-text-primary: #f3eee8;
4592
+ --overview-text-muted: #7a716a;
4593
+ --overview-mono: ui-monospace, "SF Mono", "JetBrains Mono", "Berkeley Mono", monospace;
4594
+
4595
+ display: block;
4596
+ font-family: var(--overview-mono);
4597
+ }
4598
+
4599
+ .dashboard-tab-bar {
4600
+ display: flex;
4601
+ flex-wrap: wrap;
4602
+ gap: 4px;
4603
+ padding: 0;
4604
+ margin: 0;
4605
+ border-bottom: 1px solid var(--overview-border-faint);
4606
+ }
4607
+
4608
+ .dashboard-tab {
4609
+ background: transparent;
4610
+ border: 1px solid transparent;
4611
+ border-bottom: none;
4612
+ color: var(--overview-text-muted);
4613
+ cursor: pointer;
4614
+ font-family: var(--overview-mono);
4615
+ font-size: 12px;
4616
+ letter-spacing: 0.08em;
4617
+ padding: 8px 14px;
4618
+ text-transform: uppercase;
4619
+ transition: color 120ms ease-out, background-color 120ms ease-out, border-color 120ms ease-out;
4620
+ }
4621
+
4622
+ .dashboard-tab:hover {
4623
+ color: var(--overview-text-primary);
4624
+ background: rgba(255, 138, 61, 0.06);
4625
+ }
4626
+
4627
+ .dashboard-tab.is-active {
4628
+ color: var(--overview-accent);
4629
+ border-color: var(--overview-border-active);
4630
+ background: var(--overview-bg);
4631
+ position: relative;
4632
+ }
4633
+
4634
+ .dashboard-tab.is-active::before {
4635
+ content: "";
4636
+ position: absolute;
4637
+ top: -1px;
4638
+ left: -1px;
4639
+ width: 8px;
4640
+ height: 8px;
4641
+ border-top: 2px solid var(--overview-accent);
4642
+ border-left: 2px solid var(--overview-accent);
4643
+ pointer-events: none;
4644
+ }
4645
+
4646
+ .dashboard-tab.is-active::after {
4647
+ content: "";
4648
+ position: absolute;
4649
+ top: -1px;
4650
+ right: -1px;
4651
+ width: 8px;
4652
+ height: 8px;
4653
+ border-top: 2px solid var(--overview-accent);
4654
+ border-right: 2px solid var(--overview-accent);
4655
+ pointer-events: none;
4656
+ }
4657
+
4658
+ #overview-section {
4659
+ --overview-bg: #0a0908;
4660
+ --overview-border-faint: rgba(255, 180, 100, 0.12);
4661
+ --overview-border-active: rgba(255, 138, 61, 0.65);
4662
+ --overview-accent: #ff8a3d;
4663
+ --overview-accent-dim: #a85a25;
4664
+ --overview-success: #5ce28b;
4665
+ --overview-text-primary: #f3eee8;
4666
+ --overview-text-muted: #7a716a;
4667
+ --overview-glow-active: 0 0 12px rgba(255, 138, 61, 0.55);
4668
+ --overview-mono: ui-monospace, "SF Mono", "JetBrains Mono", "Berkeley Mono", monospace;
4669
+
4670
+ display: block;
4671
+ margin: 24px 0;
4672
+ font-family: var(--overview-mono);
4673
+ color: var(--overview-text-primary);
4674
+ }
4675
+
4676
+ body:not(.overview-tab-active) #overview-section {
4677
+ display: none;
4678
+ }
4679
+
4680
+ body.overview-tab-active .dashboard-main > *:not(#overview-section) {
4681
+ display: none;
4682
+ }
4683
+
4684
+ #overview-section .overview-grid {
4685
+ display: grid;
4686
+ grid-template-columns: 1fr;
4687
+ gap: 18px;
4688
+ }
4689
+
4690
+ @media (min-width: 1100px) {
4691
+ #overview-section .overview-grid {
4692
+ grid-template-columns: 1fr 1fr;
4693
+ }
4694
+
4695
+ #overview-section .overview-grid > [data-section="projects"] {
4696
+ grid-column: 1 / -1;
4697
+ }
4698
+ }
4699
+
4700
+ #overview-section .overview-panel {
4701
+ position: relative;
4702
+ background: var(--overview-bg);
4703
+ border: 1px solid var(--overview-border-faint);
4704
+ padding: 18px 20px 16px;
4705
+ animation: overview-reveal 250ms ease-out;
4706
+ }
4707
+
4708
+ #overview-section .overview-panel::before,
4709
+ #overview-section .overview-panel::after {
4710
+ content: "";
4711
+ position: absolute;
4712
+ width: 12px;
4713
+ height: 12px;
4714
+ pointer-events: none;
4715
+ }
4716
+
4717
+ #overview-section .overview-panel::before {
4718
+ top: -1px;
4719
+ left: -1px;
4720
+ border-top: 2px solid var(--overview-border-active);
4721
+ border-left: 2px solid var(--overview-border-active);
4722
+ }
4723
+
4724
+ #overview-section .overview-panel::after {
4725
+ bottom: -1px;
4726
+ right: -1px;
4727
+ border-bottom: 2px solid var(--overview-border-active);
4728
+ border-right: 2px solid var(--overview-border-active);
4729
+ }
4730
+
4731
+ @keyframes overview-reveal {
4732
+ from { opacity: 0; transform: translateY(4px); }
4733
+ to { opacity: 1; transform: translateY(0); }
4734
+ }
4735
+
4736
+ #overview-section .overview-panel-title {
4737
+ font-family: var(--overview-mono);
4738
+ font-size: 13px;
4739
+ letter-spacing: 0.04em;
4740
+ color: var(--overview-accent);
4741
+ margin-bottom: 14px;
4742
+ }
4743
+
4744
+ #overview-section .overview-empty {
4745
+ color: var(--overview-text-muted);
4746
+ font-family: var(--overview-mono);
4747
+ font-size: 12px;
4748
+ padding: 16px 0;
4749
+ text-align: center;
4750
+ }
4751
+
4752
+ #overview-section .overview-active-list,
4753
+ #overview-section .overview-recent-list {
4754
+ list-style: none;
4755
+ margin: 0;
4756
+ padding: 0;
4757
+ display: flex;
4758
+ flex-direction: column;
4759
+ gap: 6px;
4760
+ }
4761
+
4762
+ #overview-section .overview-active-row,
4763
+ #overview-section .overview-recent-row {
4764
+ display: grid;
4765
+ grid-template-columns: 14px auto 1fr auto;
4766
+ align-items: center;
4767
+ gap: 12px;
4768
+ padding: 6px 8px;
4769
+ border: 1px solid transparent;
4770
+ font-family: var(--overview-mono);
4771
+ font-size: 12px;
4772
+ transition: border-color 120ms ease-out, background-color 120ms ease-out;
4773
+ }
4774
+
4775
+ #overview-section .overview-active-row:hover,
4776
+ #overview-section .overview-recent-row:hover {
4777
+ border-color: var(--overview-border-faint);
4778
+ background: rgba(255, 138, 61, 0.04);
4779
+ }
4780
+
4781
+ #overview-section .overview-status-dot {
4782
+ width: 8px;
4783
+ height: 8px;
4784
+ border-radius: 50%;
4785
+ background: var(--overview-success);
4786
+ box-shadow: 0 0 6px rgba(92, 226, 139, 0.55);
4787
+ animation: overview-pulse 1.4s ease-in-out infinite;
4788
+ }
4789
+
4790
+ @keyframes overview-pulse {
4791
+ 0%, 100% { opacity: 0.7; box-shadow: 0 0 6px rgba(92, 226, 139, 0.45); }
4792
+ 50% { opacity: 1; box-shadow: 0 0 12px rgba(92, 226, 139, 0.75); }
4793
+ }
4794
+
4795
+ #overview-section .overview-active-project,
4796
+ #overview-section .overview-recent-project {
4797
+ color: var(--overview-accent);
4798
+ letter-spacing: 0.04em;
4799
+ }
4800
+
4801
+ #overview-section .overview-active-mr,
4802
+ #overview-section .overview-recent-mr {
4803
+ color: var(--overview-text-primary);
4804
+ text-decoration: none;
4805
+ font-weight: 600;
4806
+ }
4807
+
4808
+ #overview-section .overview-active-mr:hover {
4809
+ color: var(--overview-accent);
4810
+ text-decoration: underline;
4811
+ }
4812
+
4813
+ #overview-section .overview-active-elapsed {
4814
+ color: var(--overview-text-muted);
4815
+ text-align: right;
4816
+ }
4817
+
4818
+ #overview-section .overview-recent-title {
4819
+ color: var(--overview-text-muted);
4820
+ font-size: 11px;
4821
+ overflow: hidden;
4822
+ text-overflow: ellipsis;
4823
+ white-space: nowrap;
4824
+ }
4825
+
4826
+ #overview-section .overview-project-card-grid {
4827
+ display: grid;
4828
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
4829
+ gap: 12px;
4830
+ }
4831
+
4832
+ #overview-section .overview-project-card {
4833
+ background: transparent;
4834
+ border: 1px solid var(--overview-border-faint);
4835
+ color: var(--overview-text-primary);
4836
+ cursor: pointer;
4837
+ font-family: var(--overview-mono);
4838
+ padding: 14px 14px 10px;
4839
+ text-align: left;
4840
+ transition: border-color 120ms ease-out, background-color 120ms ease-out, transform 120ms ease-out;
4841
+ }
4842
+
4843
+ #overview-section .overview-project-card:hover {
4844
+ border-color: var(--overview-border-active);
4845
+ background: rgba(255, 138, 61, 0.06);
4846
+ transform: translateY(-1px);
4847
+ }
4848
+
4849
+ #overview-section .overview-project-card-header {
4850
+ display: flex;
4851
+ align-items: baseline;
4852
+ justify-content: space-between;
4853
+ margin-bottom: 8px;
4854
+ }
4855
+
4856
+ #overview-section .overview-project-card-name {
4857
+ color: var(--overview-accent);
4858
+ font-size: 13px;
4859
+ letter-spacing: 0.05em;
4860
+ }
4861
+
4862
+ #overview-section .overview-project-card-platform {
4863
+ color: var(--overview-text-muted);
4864
+ font-size: 10px;
4865
+ text-transform: uppercase;
4866
+ letter-spacing: 0.1em;
4867
+ }
4868
+
4869
+ #overview-section .overview-project-card-totals {
4870
+ display: flex;
4871
+ justify-content: space-between;
4872
+ font-size: 11px;
4873
+ color: var(--overview-text-primary);
4874
+ margin-bottom: 8px;
4875
+ }
4876
+
4877
+ #overview-section .overview-project-card-score {
4878
+ color: var(--overview-success);
4879
+ }
4880
+
4881
+ #overview-section .overview-project-card-sparkline {
4882
+ height: 28px;
4883
+ color: var(--overview-accent);
4884
+ }
4885
+
4886
+ #overview-section .overview-sparkline {
4887
+ width: 100%;
4888
+ height: 100%;
4889
+ display: block;
4890
+ }
4891
+
4892
+ @media (prefers-reduced-motion: reduce) {
4893
+ #overview-section .overview-panel,
4894
+ #overview-section .overview-status-dot,
4895
+ #overview-section .overview-project-card {
4896
+ animation: none !important;
4897
+ transition: none !important;
4898
+ }
4899
+ }
@@ -1,85 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import { type StartDaemonDependencies } from '../modules/cli-configuration/usecases/cli/startDaemon.usecase.js';
3
- import { type StopDaemonDependencies } from '../modules/cli-configuration/usecases/cli/stopDaemon.usecase.js';
4
- import { type QueryStatusDependencies } from '../modules/cli-configuration/usecases/cli/queryStatus.usecase.js';
5
- import { type ReadLogsDependencies } from '../modules/cli-configuration/usecases/cli/readLogs.usecase.js';
6
- import { type DiscoveredRepository, type DiscoverRepositoriesResult } from '../modules/cli-configuration/usecases/cli/discoverRepositories.usecase.js';
7
- import { type ConfigureMcpResult } from '../modules/cli-configuration/usecases/cli/configureMcp.usecase.js';
8
- import { type WriteInitConfigInput, type WriteInitConfigResult } from '../modules/cli-configuration/usecases/cli/writeInitConfig.usecase.js';
9
- import { type InitSummaryInput } from '../cli/formatters/initSummary.js';
10
- import { type PrerequisitesResult } from '../modules/cli-configuration/usecases/cli/checkInitPrerequisites.js';
11
- export interface StartDependencies {
12
- validateDependencies: () => {
13
- name: string;
14
- installUrl: string;
15
- }[];
16
- startServer: (port?: number) => Promise<unknown>;
17
- exit: (code: number) => void;
18
- error: (...args: unknown[]) => void;
19
- log: (...args: unknown[]) => void;
20
- startDaemonDeps: StartDaemonDependencies;
21
- loadStartupInfo: () => {
22
- enabledPlatforms: Array<'gitlab' | 'github'>;
23
- defaultPort: number;
24
- };
25
- openInBrowser: (url: string) => void;
26
- }
27
- export declare function executeStart(skipDependencyCheck: boolean, daemon: boolean, port: number | undefined, open: boolean, deps: StartDependencies): void;
28
- export interface StopDeps {
29
- stopDaemonDeps: StopDaemonDependencies;
30
- log: (...args: unknown[]) => void;
31
- error: (...args: unknown[]) => void;
32
- exit: (code: number) => void;
33
- }
34
- export declare function executeStop(force: boolean, deps: StopDeps): void;
35
- export interface StatusDeps {
36
- queryStatusDeps: QueryStatusDependencies;
37
- log: (...args: unknown[]) => void;
38
- exit: (code: number) => void;
39
- }
40
- export declare function executeStatus(json: boolean, deps: StatusDeps): void;
41
- export interface LogsDeps {
42
- readLogsDeps: ReadLogsDependencies;
43
- log: (...args: unknown[]) => void;
44
- error: (...args: unknown[]) => void;
45
- exit: (code: number) => void;
46
- }
47
- export declare function executeLogs(follow: boolean, lines: number, deps: LogsDeps): void;
48
- export type PlatformChoice = 'gitlab' | 'github' | 'both';
49
- export interface InitDependencies {
50
- log: (...args: unknown[]) => void;
51
- exit: (code: number) => void;
52
- getConfigDir: () => string;
53
- existsSync: (path: string) => boolean;
54
- checkPrerequisites: () => PrerequisitesResult;
55
- confirmOverwrite: (configPath: string) => Promise<boolean>;
56
- promptPlatform: () => Promise<PlatformChoice>;
57
- promptPort: () => Promise<number>;
58
- promptGitlabUsername: () => Promise<string>;
59
- promptGithubUsername: () => Promise<string>;
60
- confirmScanRepositories: () => Promise<boolean>;
61
- selectRepositories: (repos: DiscoveredRepository[]) => Promise<DiscoveredRepository[]>;
62
- generateWebhookSecret: () => string;
63
- truncateSecret: (secret: string, length: number) => string;
64
- discoverRepositories: (scanPaths: string[], maxDepth: number) => DiscoverRepositoriesResult;
65
- configureMcp: () => ConfigureMcpResult;
66
- writeConfig: (input: WriteInitConfigInput) => WriteInitConfigResult;
67
- formatSummary: (input: InitSummaryInput) => string;
68
- }
69
- export declare function executeInit(yes: boolean, skipMcp: boolean, showSecrets: boolean, scanPaths: string[], deps: InitDependencies): Promise<void>;
70
- export interface DiscoverDependencies {
71
- existsSync: (path: string) => boolean;
72
- readFileSync: (path: string, encoding: BufferEncoding) => string;
73
- writeFileSync: (path: string, content: string) => void;
74
- readdirSync: (path: string) => Array<{
75
- name: string;
76
- isDirectory: () => boolean;
77
- }>;
78
- getGitRemoteUrl: (localPath: string) => string | null;
79
- getConfigPath: () => string;
80
- log: (...args: unknown[]) => void;
81
- selectRepositories: (repositories: DiscoveredRepository[]) => Promise<DiscoveredRepository[]>;
82
- }
83
- export declare function executeDiscover(scanPaths: string[], maxDepth: number, deps: DiscoverDependencies): Promise<void>;
84
- export declare function executeValidate(fix: boolean): void;
2
+ export {};
85
3
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/main/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/main/cli.ts"],"names":[],"mappings":""}