@noorm/marie-cli 0.1.18 → 0.1.25

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 (251) hide show
  1. package/README.md +7 -15
  2. package/SENTINEL.md +4 -7
  3. package/dist/cli-new/components/App.js +16 -63
  4. package/dist/cli-new/components/App.js.map +1 -1
  5. package/dist/cli-new/components/ApprovalDialog.js +2 -1
  6. package/dist/cli-new/components/ApprovalDialog.js.map +1 -1
  7. package/dist/cli-new/components/Banner.js +4 -3
  8. package/dist/cli-new/components/Banner.js.map +1 -1
  9. package/dist/cli-new/components/ChatArea.js +6 -7
  10. package/dist/cli-new/components/ChatArea.js.map +1 -1
  11. package/dist/cli-new/components/Header.js +13 -7
  12. package/dist/cli-new/components/Header.js.map +1 -1
  13. package/dist/cli-new/components/InputArea.js +73 -12
  14. package/dist/cli-new/components/InputArea.js.map +1 -1
  15. package/dist/cli-new/components/MessageBubble.js +26 -18
  16. package/dist/cli-new/components/MessageBubble.js.map +1 -1
  17. package/dist/cli-new/components/SessionSwitcher.js +4 -7
  18. package/dist/cli-new/components/SessionSwitcher.js.map +1 -1
  19. package/dist/cli-new/components/SetupWizard.js +80 -257
  20. package/dist/cli-new/components/SetupWizard.js.map +1 -1
  21. package/dist/cli-new/components/ToolCallDisplay.js +20 -5
  22. package/dist/cli-new/components/ToolCallDisplay.js.map +1 -1
  23. package/dist/cli-new/components/WizardSteps.js +22 -0
  24. package/dist/cli-new/components/WizardSteps.js.map +1 -0
  25. package/dist/cli-new/constants/SetupConstants.js +42 -0
  26. package/dist/cli-new/constants/SetupConstants.js.map +1 -0
  27. package/dist/cli-new/hooks/useGit.js +19 -62
  28. package/dist/cli-new/hooks/useGit.js.map +1 -1
  29. package/dist/cli-new/hooks/useMarie.js +26 -18
  30. package/dist/cli-new/hooks/useMarie.js.map +1 -1
  31. package/dist/cli-new/hooks/useSessions.js +1 -1
  32. package/dist/cli-new/hooks/useSessions.js.map +1 -1
  33. package/dist/cli-new/hooks/useSetupWizard.js +88 -0
  34. package/dist/cli-new/hooks/useSetupWizard.js.map +1 -0
  35. package/dist/cli-new/hooks/useUpdateCheck.js +4 -3
  36. package/dist/cli-new/hooks/useUpdateCheck.js.map +1 -1
  37. package/dist/cli-new/index.js +2 -4
  38. package/dist/cli-new/index.js.map +1 -1
  39. package/dist/cli-new/services/CommandService.js +104 -0
  40. package/dist/cli-new/services/CommandService.js.map +1 -0
  41. package/dist/cli-new/services/GitService.js +91 -0
  42. package/dist/cli-new/services/GitService.js.map +1 -0
  43. package/dist/cli-new/services/MarieService.js +77 -0
  44. package/dist/cli-new/services/MarieService.js.map +1 -0
  45. package/dist/cli-new/services/auth-server.js +128 -0
  46. package/dist/cli-new/services/auth-server.js.map +1 -0
  47. package/dist/cli-new/utils/version.js +24 -0
  48. package/dist/cli-new/utils/version.js.map +1 -0
  49. package/dist/monolith/adapters/CliMarieAdapter.js +12 -11
  50. package/dist/monolith/adapters/CliMarieAdapter.js.map +1 -1
  51. package/dist/monolith/cli/CliFileSystemPort.js +17 -3
  52. package/dist/monolith/cli/CliFileSystemPort.js.map +1 -1
  53. package/dist/monolith/cli/MarieToolDefinitionsCLI.js +39 -31
  54. package/dist/monolith/cli/MarieToolDefinitionsCLI.js.map +1 -1
  55. package/dist/monolith/cli/index.js +5 -20
  56. package/dist/monolith/cli/index.js.map +1 -1
  57. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js +15 -62
  58. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js.map +1 -1
  59. package/dist/monolith/cli/storage.js +142 -72
  60. package/dist/monolith/cli/storage.js.map +1 -1
  61. package/dist/monolith/domain/joy/RitualService.js +44 -46
  62. package/dist/monolith/domain/joy/RitualService.js.map +1 -1
  63. package/dist/monolith/domain/marie/MarieCortex.js +148 -0
  64. package/dist/monolith/domain/marie/MarieCortex.js.map +1 -0
  65. package/dist/monolith/domain/marie/PersonalityRenderer.js +97 -0
  66. package/dist/monolith/domain/marie/PersonalityRenderer.js.map +1 -0
  67. package/dist/monolith/infrastructure/Configuration.js +68 -0
  68. package/dist/monolith/infrastructure/Configuration.js.map +1 -0
  69. package/dist/monolith/infrastructure/CoreInfrastructure.js +204 -0
  70. package/dist/monolith/infrastructure/CoreInfrastructure.js.map +1 -0
  71. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js +3 -3
  72. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js.map +1 -1
  73. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js +6 -27
  74. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js.map +1 -1
  75. package/dist/monolith/infrastructure/ai/context/ContextManager.js +142 -131
  76. package/dist/monolith/infrastructure/ai/context/ContextManager.js.map +1 -1
  77. package/dist/monolith/infrastructure/ai/core/MarieEngine.js +115 -1077
  78. package/dist/monolith/infrastructure/ai/core/MarieEngine.js.map +1 -1
  79. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js +1 -37
  80. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js.map +1 -1
  81. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js +6 -1
  82. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js.map +1 -1
  83. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js +172 -221
  84. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js.map +1 -1
  85. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js +292 -141
  86. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js.map +1 -1
  87. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js +331 -614
  88. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js.map +1 -1
  89. package/dist/monolith/infrastructure/ai/core/MarieVitality.js +238 -0
  90. package/dist/monolith/infrastructure/ai/core/MarieVitality.js.map +1 -0
  91. package/dist/monolith/infrastructure/ai/core/SessionLogService.js +9 -2
  92. package/dist/monolith/infrastructure/ai/core/SessionLogService.js.map +1 -1
  93. package/dist/monolith/infrastructure/ai/providers/AIProvider.js +402 -1
  94. package/dist/monolith/infrastructure/ai/providers/AIProvider.js.map +1 -1
  95. package/dist/monolith/infrastructure/ai/providers/DreamBeesProvider.js +114 -0
  96. package/dist/monolith/infrastructure/ai/providers/DreamBeesProvider.js.map +1 -0
  97. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js +426 -392
  98. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js.map +1 -1
  99. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js +235 -241
  100. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js.map +1 -1
  101. package/dist/monolith/infrastructure/ai/workerAi.js +185 -0
  102. package/dist/monolith/infrastructure/ai/workerAi.js.map +1 -0
  103. package/dist/monolith/infrastructure/config/ConfigService.js +216 -503
  104. package/dist/monolith/infrastructure/config/ConfigService.js.map +1 -1
  105. package/dist/monolith/infrastructure/joy/CognitiveRituals.js +4 -165
  106. package/dist/monolith/infrastructure/joy/CognitiveRituals.js.map +1 -1
  107. package/dist/monolith/infrastructure/joy/JoyTools.js +14 -47
  108. package/dist/monolith/infrastructure/joy/JoyTools.js.map +1 -1
  109. package/dist/monolith/infrastructure/persistence/MarieMindAutonomics.js +4 -0
  110. package/dist/monolith/infrastructure/persistence/MarieMindAutonomics.js.map +1 -0
  111. package/dist/monolith/infrastructure/persistence/MarieMindEngine.js +11 -0
  112. package/dist/monolith/infrastructure/persistence/MarieMindEngine.js.map +1 -0
  113. package/dist/monolith/infrastructure/persistence/NoormmeAutonomics.js +123 -106
  114. package/dist/monolith/infrastructure/persistence/NoormmeAutonomics.js.map +1 -1
  115. package/dist/monolith/infrastructure/persistence/NoormmeEngine.js +508 -63
  116. package/dist/monolith/infrastructure/persistence/NoormmeEngine.js.map +1 -1
  117. package/dist/monolith/infrastructure/persistence/NoormmeSchema.js +68 -39
  118. package/dist/monolith/infrastructure/persistence/NoormmeSchema.js.map +1 -1
  119. package/dist/monolith/infrastructure/persistence/NoormmeSeeder.js +80 -67
  120. package/dist/monolith/infrastructure/persistence/NoormmeSeeder.js.map +1 -1
  121. package/dist/monolith/infrastructure/persistence/NoormmeTools.js +122 -75
  122. package/dist/monolith/infrastructure/persistence/NoormmeTools.js.map +1 -1
  123. package/dist/monolith/infrastructure/services/MarieMemoryStore.js +133 -134
  124. package/dist/monolith/infrastructure/services/MarieMemoryStore.js.map +1 -1
  125. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js +6 -30
  126. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js.map +1 -1
  127. package/dist/monolith/infrastructure/tools/PureStreamParser.js +68 -80
  128. package/dist/monolith/infrastructure/tools/PureStreamParser.js.map +1 -1
  129. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js +12 -11
  130. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js.map +1 -1
  131. package/dist/monolith/infrastructure/tools/SovereignTools.js +326 -0
  132. package/dist/monolith/infrastructure/tools/SovereignTools.js.map +1 -0
  133. package/dist/monolith/infrastructure/tools/ToolRegistry.js +45 -26
  134. package/dist/monolith/infrastructure/tools/ToolRegistry.js.map +1 -1
  135. package/dist/monolith/infrastructure/tools/definitions/AnalysisTools.js +39 -153
  136. package/dist/monolith/infrastructure/tools/definitions/AnalysisTools.js.map +1 -1
  137. package/dist/monolith/infrastructure/tools/definitions/AutomationTools.js +31 -46
  138. package/dist/monolith/infrastructure/tools/definitions/AutomationTools.js.map +1 -1
  139. package/dist/monolith/infrastructure/tools/definitions/ContextTools.js +41 -13
  140. package/dist/monolith/infrastructure/tools/definitions/ContextTools.js.map +1 -1
  141. package/dist/monolith/infrastructure/tools/definitions/CoreTools.js +10 -14
  142. package/dist/monolith/infrastructure/tools/definitions/CoreTools.js.map +1 -1
  143. package/dist/monolith/infrastructure/tools/definitions/DiagnosticTools.js +39 -70
  144. package/dist/monolith/infrastructure/tools/definitions/DiagnosticTools.js.map +1 -1
  145. package/dist/monolith/infrastructure/tools/definitions/NavigationTools.js +30 -181
  146. package/dist/monolith/infrastructure/tools/definitions/NavigationTools.js.map +1 -1
  147. package/dist/monolith/infrastructure/tools/definitions/PlanningTools.js +12 -9
  148. package/dist/monolith/infrastructure/tools/definitions/PlanningTools.js.map +1 -1
  149. package/dist/monolith/plumbing/Plumbing.js +238 -0
  150. package/dist/monolith/plumbing/Plumbing.js.map +1 -0
  151. package/dist/monolith/plumbing/PlumbingAnalysis.js +109 -0
  152. package/dist/monolith/plumbing/PlumbingAnalysis.js.map +1 -0
  153. package/dist/monolith/plumbing/PlumbingSystem.js +169 -0
  154. package/dist/monolith/plumbing/PlumbingSystem.js.map +1 -0
  155. package/dist/monolith/plumbing/analysis/ComplexityService.js +30 -34
  156. package/dist/monolith/plumbing/analysis/ComplexityService.js.map +1 -1
  157. package/dist/monolith/plumbing/analysis/DependencyService.js +55 -44
  158. package/dist/monolith/plumbing/analysis/DependencyService.js.map +1 -1
  159. package/dist/monolith/plumbing/analysis/DiscoveryService.js +40 -42
  160. package/dist/monolith/plumbing/analysis/DiscoveryService.js.map +1 -1
  161. package/dist/monolith/plumbing/analysis/JoyMapService.js +52 -56
  162. package/dist/monolith/plumbing/analysis/JoyMapService.js.map +1 -1
  163. package/dist/monolith/plumbing/analysis/LintService.js +118 -118
  164. package/dist/monolith/plumbing/analysis/LintService.js.map +1 -1
  165. package/dist/monolith/plumbing/analysis/MarieSentinelService.js +278 -268
  166. package/dist/monolith/plumbing/analysis/MarieSentinelService.js.map +1 -1
  167. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js +116 -114
  168. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js.map +1 -1
  169. package/dist/monolith/plumbing/analysis/SurgicalMender.js +57 -59
  170. package/dist/monolith/plumbing/analysis/SurgicalMender.js.map +1 -1
  171. package/dist/monolith/plumbing/analysis/TestService.js +89 -89
  172. package/dist/monolith/plumbing/analysis/TestService.js.map +1 -1
  173. package/dist/monolith/plumbing/filesystem/FileService.js +123 -195
  174. package/dist/monolith/plumbing/filesystem/FileService.js.map +1 -1
  175. package/dist/monolith/plumbing/filesystem/PathResolver.js +7 -8
  176. package/dist/monolith/plumbing/filesystem/PathResolver.js.map +1 -1
  177. package/dist/monolith/plumbing/git/GitService.js +4 -4
  178. package/dist/monolith/plumbing/git/GitService.js.map +1 -1
  179. package/dist/monolith/plumbing/lsp/SymbolService.js +5 -34
  180. package/dist/monolith/plumbing/lsp/SymbolService.js.map +1 -1
  181. package/dist/monolith/plumbing/terminal/ProcessRegistry.js +20 -22
  182. package/dist/monolith/plumbing/terminal/ProcessRegistry.js.map +1 -1
  183. package/dist/monolith/plumbing/terminal/TerminalService.js +127 -141
  184. package/dist/monolith/plumbing/terminal/TerminalService.js.map +1 -1
  185. package/dist/monolith/plumbing/utils/EnvironmentUtils.js +3 -23
  186. package/dist/monolith/plumbing/utils/EnvironmentUtils.js.map +1 -1
  187. package/dist/monolith/plumbing/utils/JsonUtils.js +252 -311
  188. package/dist/monolith/plumbing/utils/JsonUtils.js.map +1 -1
  189. package/dist/monolith/plumbing/utils/PlumbingCore.js +549 -0
  190. package/dist/monolith/plumbing/utils/PlumbingCore.js.map +1 -0
  191. package/dist/monolith/plumbing/utils/PrefixTree.js +61 -114
  192. package/dist/monolith/plumbing/utils/PrefixTree.js.map +1 -1
  193. package/dist/monolith/plumbing/utils/StreamTagDetector.js +89 -127
  194. package/dist/monolith/plumbing/utils/StreamTagDetector.js.map +1 -1
  195. package/dist/monolith/plumbing/utils/StringUtils.js +87 -89
  196. package/dist/monolith/plumbing/utils/StringUtils.js.map +1 -1
  197. package/dist/monolith/runtime/MarieRuntime.js +76 -499
  198. package/dist/monolith/runtime/MarieRuntime.js.map +1 -1
  199. package/dist/monolith/runtime/RuntimeAdapterBase.js +1 -1
  200. package/dist/monolith/runtime/RuntimeAdapterBase.js.map +1 -1
  201. package/dist/monolith/runtime/providerFactory.js +1 -7
  202. package/dist/monolith/runtime/providerFactory.js.map +1 -1
  203. package/dist/monolith/services/HealthService.js +29 -32
  204. package/dist/monolith/services/HealthService.js.map +1 -1
  205. package/dist/monolith/services/JoyAutomationService.js +58 -95
  206. package/dist/monolith/services/JoyAutomationService.js.map +1 -1
  207. package/dist/monolith/services/MarieAutomationService.js +59 -0
  208. package/dist/monolith/services/MarieAutomationService.js.map +1 -0
  209. package/dist/monolith/services/MarieGhostService.js +46 -173
  210. package/dist/monolith/services/MarieGhostService.js.map +1 -1
  211. package/dist/monolith/services/MarieServices.js +102 -0
  212. package/dist/monolith/services/MarieServices.js.map +1 -0
  213. package/dist/monolith/services/MarieTypes.js +2 -0
  214. package/dist/monolith/services/MarieTypes.js.map +1 -0
  215. package/dist/monolith/services/UpdateService.js +47 -49
  216. package/dist/monolith/services/UpdateService.js.map +1 -1
  217. package/dist/prompts.js +11 -5
  218. package/dist/prompts.js.map +1 -1
  219. package/dist/test_prefix_tree.js +9 -9
  220. package/dist/test_prefix_tree.js.map +1 -1
  221. package/package.json +18 -89
  222. package/run_test.js +5 -0
  223. package/.marie_visual_verify_1771225696548/progress_bar_check.txt +0 -1
  224. package/dist/extension.cjs +0 -1155
  225. package/dist/extension.js +0 -474
  226. package/dist/extension.js.map +0 -1
  227. package/dist/monolith/adapters/VscodeMarieAdapter.js +0 -81
  228. package/dist/monolith/adapters/VscodeMarieAdapter.js.map +0 -1
  229. package/dist/monolith/infrastructure/ai/core/GhostPort.js +0 -2
  230. package/dist/monolith/infrastructure/ai/core/GhostPort.js.map +0 -1
  231. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js +0 -33
  232. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js.map +0 -1
  233. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js +0 -154
  234. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js.map +0 -1
  235. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js +0 -214
  236. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js.map +0 -1
  237. package/dist/monolith/plumbing/ui/DecorationService.js +0 -54
  238. package/dist/monolith/plumbing/ui/DecorationService.js.map +0 -1
  239. package/dist/monolith/services/JoyLogService.js +0 -48
  240. package/dist/monolith/services/JoyLogService.js.map +0 -1
  241. package/dist/monolith/services/JoyService.js +0 -209
  242. package/dist/monolith/services/JoyService.js.map +0 -1
  243. package/dist/monolith/services/MarieSCMProvider.js +0 -41
  244. package/dist/monolith/services/MarieSCMProvider.js.map +0 -1
  245. package/dist/webview-ui/main.css +0 -1
  246. package/dist/webview-ui/main.js +0 -108
  247. package/lint_output.txt +0 -705
  248. package/lint_output_v2.txt +0 -711
  249. package/test-mind-p6.sqlite +0 -0
  250. package/test-mind-p6.sqlite-shm +0 -0
  251. package/test-mind-p6.sqlite-wal +0 -0
@@ -0,0 +1,169 @@
1
+ import * as path from "path";
2
+ import * as fs from "fs/promises";
3
+ import * as os from "os";
4
+ import { exec, spawn } from "child_process";
5
+ import { promisify } from "util";
6
+ import { getErrorMessage, getWorkspaceRoot } from "./utils/PlumbingCore.js";
7
+ import { getCapabilities } from "../infrastructure/config/ConfigService.js";
8
+ import { register } from "./terminal/ProcessRegistry.js";
9
+ const execAsync = promisify(exec);
10
+ const textDecoder = new TextDecoder();
11
+ const textEncoder = new TextEncoder();
12
+ // --- 1. PATH RESOLUTION (Merged from PathResolver) ---
13
+ /**
14
+ * Resolves a file path to an absolute filesystem path.
15
+ * Handles absolute paths, workspace-relative paths, and home directory (~) expansion.
16
+ */
17
+ export function resolvePath(p) {
18
+ let resolvedPath = p;
19
+ if (p.startsWith("~")) {
20
+ resolvedPath = path.join(os.homedir(), p.slice(1));
21
+ }
22
+ if (path.isAbsolute(resolvedPath)) {
23
+ return path.normalize(resolvedPath);
24
+ }
25
+ const workspaceRoot = getWorkspaceRoot();
26
+ if (workspaceRoot) {
27
+ return path.join(workspaceRoot, resolvedPath);
28
+ }
29
+ return path.normalize(resolvedPath);
30
+ }
31
+ // --- 2. FILESYSTEM OPERATIONS (Merged from FileService) ---
32
+ const backups = new Map();
33
+ export async function readFile(filePath, startLine, endLine, signal) {
34
+ if (signal?.aborted)
35
+ throw new Error(`AbortError: Read of ${filePath} aborted.`);
36
+ const fullPath = resolvePath(filePath);
37
+ try {
38
+ const buffer = await fs.readFile(fullPath);
39
+ if (signal?.aborted)
40
+ throw new Error("Aborted");
41
+ const text = textDecoder.decode(buffer);
42
+ if (startLine !== undefined || endLine !== undefined) {
43
+ const lines = text.split("\n");
44
+ const start = startLine !== undefined ? Math.max(0, startLine - 1) : 0;
45
+ const end = endLine !== undefined ? Math.min(lines.length, endLine) : lines.length;
46
+ return lines.slice(start, end).join("\n");
47
+ }
48
+ return text;
49
+ }
50
+ catch (error) {
51
+ throw new Error(`Failed to read file ${filePath}: ${error}`);
52
+ }
53
+ }
54
+ export async function writeFile(filePath, content, signal, onProgress) {
55
+ if (signal?.aborted)
56
+ throw new Error("Aborted");
57
+ const fullPath = resolvePath(filePath);
58
+ try {
59
+ const parentDir = path.dirname(fullPath);
60
+ await fs.mkdir(parentDir, { recursive: true });
61
+ // ATOMIC WRITE
62
+ const tmpPath = `${fullPath}.tmp.${Math.random().toString(36).substring(2, 9)}`;
63
+ const encoded = textEncoder.encode(content);
64
+ await fs.writeFile(tmpPath, encoded);
65
+ onProgress?.(encoded.length, encoded.length);
66
+ if (signal?.aborted) {
67
+ await fs.unlink(tmpPath).catch(() => { });
68
+ throw new Error("Aborted");
69
+ }
70
+ await fs.rename(tmpPath, fullPath);
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Failed to write file ${filePath}: ${error}`);
74
+ }
75
+ }
76
+ export async function deleteFile(filePath) {
77
+ const fullPath = resolvePath(filePath);
78
+ await fs.rm(fullPath, { recursive: true, force: true });
79
+ }
80
+ export async function listFiles(dirPath) {
81
+ const fullPath = resolvePath(dirPath);
82
+ const entries = await fs.readdir(fullPath);
83
+ const results = await Promise.all(entries.map(async (name) => {
84
+ const entryPath = path.join(fullPath, name);
85
+ try {
86
+ const stat = await fs.stat(entryPath);
87
+ return `${stat.isDirectory() ? "DIR " : "FILE"} ${name}${!stat.isDirectory() ? ` (${(stat.size / 1024).toFixed(1)} KB)` : ""}`;
88
+ }
89
+ catch {
90
+ return "";
91
+ }
92
+ }));
93
+ return results.filter(Boolean).join("\n") || "Directory is empty.";
94
+ }
95
+ // --- 3. GIT OPERATIONS (Merged from GitService) ---
96
+ export async function gitStatus(cwd) {
97
+ try {
98
+ const { stdout } = await execAsync("git status --short", { cwd });
99
+ return stdout || "Clean workspace.";
100
+ }
101
+ catch (error) {
102
+ return `Git error: ${getErrorMessage(error)}`;
103
+ }
104
+ }
105
+ export async function getStagedDiff(cwd) {
106
+ const { stdout } = await execAsync("git diff --cached", { cwd });
107
+ return stdout || "No staged changes.";
108
+ }
109
+ export async function getUnstagedDiff(cwd) {
110
+ const { stdout } = await execAsync("git diff", { cwd });
111
+ return stdout || "No unstaged changes.";
112
+ }
113
+ export async function appendFile(filePath, content, signal, onProgress) {
114
+ if (signal?.aborted)
115
+ throw new Error("Aborted");
116
+ const fullPath = resolvePath(filePath);
117
+ try {
118
+ const buffer = Buffer.from(content, "utf-8");
119
+ await fs.appendFile(fullPath, buffer);
120
+ onProgress?.(buffer.length, buffer.length);
121
+ }
122
+ catch (error) {
123
+ throw new Error(`Failed to append to file ${filePath}: ${error}`);
124
+ }
125
+ }
126
+ // --- 4. TERMINAL OPERATIONS (Merged from TerminalService) ---
127
+ const MAX_OUTPUT_LENGTH = 10000;
128
+ const ANSI_REGEX = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
129
+ const stripAnsi = (t) => t.replace(ANSI_REGEX, "");
130
+ export async function runCommand(command, signal) {
131
+ if (!getCapabilities().includes("SHELL"))
132
+ return "Capability Breach: Shell disabled. 🛑";
133
+ if (/[;&|`$(){}]/.test(command))
134
+ return "Security Error: Suspicious characters detected. 🛑";
135
+ const rootPath = getWorkspaceRoot();
136
+ let childProcess;
137
+ const spawnPromise = new Promise((resolve, reject) => {
138
+ childProcess = spawn(command, { cwd: rootPath, shell: true, stdio: ["ignore", "pipe", "pipe"], detached: true });
139
+ register(childProcess);
140
+ let stdout = "", stderr = "";
141
+ childProcess.stdout?.on("data", (d) => stdout += d.toString());
142
+ childProcess.stderr?.on("data", (d) => stderr += d.toString());
143
+ childProcess.on("close", (code) => resolve({ stdout, stderr, code }));
144
+ childProcess.on("error", (err) => reject(err));
145
+ });
146
+ const { stdout, stderr, code } = await spawnPromise;
147
+ if (code !== 0)
148
+ return `Failed (${code}):\n${stripAnsi(stderr).slice(-MAX_OUTPUT_LENGTH)}`;
149
+ return `Success. ✨\n\n**Output:**\n\`\`\`\n${stripAnsi(stdout).slice(-MAX_OUTPUT_LENGTH)}\n\`\`\``;
150
+ }
151
+ // --- 5. PLANETARY HEALTH (Merged from HealthService) ---
152
+ export async function checkPlanetaryHealth() {
153
+ const deps = ["rg", "fd", "npm"];
154
+ const results = await Promise.all(deps.map(async (d) => {
155
+ try {
156
+ await execAsync(`${d} --version`, { timeout: 2000 });
157
+ return true;
158
+ }
159
+ catch {
160
+ return false;
161
+ }
162
+ }));
163
+ const missing = deps.filter((_, i) => !results[i]);
164
+ if (missing.length)
165
+ console.warn(`Stability Warning: Missing ${missing.join(", ")}`);
166
+ else
167
+ console.log("[PlumbingSystem] Planetary health verified. 🌍");
168
+ }
169
+ //# sourceMappingURL=PlumbingSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlumbingSystem.js","sourceRoot":"","sources":["../../../src/monolith/plumbing/PlumbingSystem.ts"],"names":[],"mappings":"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"}
@@ -1,43 +1,39 @@
1
1
  import * as fs from "fs/promises";
2
2
  /**
3
3
  * Quantifies "Clutter" and code quality to help Marie maintain a high-integrity Garden.
4
+ * Heuristically analyzes a file for complexity.
4
5
  */
5
- export class ComplexityService {
6
- /**
7
- * Heuristically analyzes a file for complexity.
8
- */
9
- static async analyze(filePath) {
10
- try {
11
- const content = await fs.readFile(filePath, "utf-8");
12
- const lines = content.split("\n");
13
- const loc = lines.length;
14
- // Simple heuristic for cyclomatic complexity: count control flow keywords
15
- const controlFlowMatch = content.match(/\b(if|else if|for|while|case|catch|&&|\|\||!=|==|!==|===)\b/g);
16
- const complexity = (controlFlowMatch?.length || 0) + 1;
17
- let clutterLevel = "Clean";
18
- const suggestions = [];
19
- if (complexity > 20 || loc > 300) {
20
- clutterLevel = "Toxic";
21
- suggestions.push("This module is significantly cluttered. Consider decomposing into smaller 'Sprouts'.");
22
- }
23
- else if (complexity > 10 || loc > 150) {
24
- clutterLevel = "Tangled";
25
- suggestions.push("The logic is starting to tangle. A refactor ('Bloom') is recommended.");
26
- }
27
- else if (complexity > 5) {
28
- clutterLevel = "Sparking";
29
- suggestions.push("The code is healthy but keep an eye on control flow depth.");
30
- }
31
- return {
32
- cyclomaticComplexity: complexity,
33
- loc,
34
- clutterLevel,
35
- suggestions,
36
- };
6
+ export async function analyzeComplexity(filePath) {
7
+ try {
8
+ const content = await fs.readFile(filePath, "utf-8");
9
+ const lines = content.split("\n");
10
+ const loc = lines.length;
11
+ // Simple heuristic for cyclomatic complexity: count control flow keywords
12
+ const controlFlowMatch = content.match(/\b(if|else if|for|while|case|catch|&&|\|\||!=|==|!==|===)\b/g);
13
+ const complexity = (controlFlowMatch?.length || 0) + 1;
14
+ let clutterLevel = "Clean";
15
+ const suggestions = [];
16
+ if (complexity > 20 || loc > 300) {
17
+ clutterLevel = "Toxic";
18
+ suggestions.push("This module is significantly cluttered. Consider decomposing into smaller 'Sprouts'.");
37
19
  }
38
- catch (error) {
39
- throw new Error(`Failed to analyze complexity for ${filePath}: ${error}`);
20
+ else if (complexity > 10 || loc > 150) {
21
+ clutterLevel = "Tangled";
22
+ suggestions.push("The logic is starting to tangle. A refactor ('Bloom') is recommended.");
40
23
  }
24
+ else if (complexity > 5) {
25
+ clutterLevel = "Sparking";
26
+ suggestions.push("The code is healthy but keep an eye on control flow depth.");
27
+ }
28
+ return {
29
+ cyclomaticComplexity: complexity,
30
+ loc,
31
+ clutterLevel,
32
+ suggestions,
33
+ };
34
+ }
35
+ catch (error) {
36
+ throw new Error(`Failed to analyze complexity for ${filePath}: ${error}`);
41
37
  }
42
38
  }
43
39
  //# sourceMappingURL=ComplexityService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComplexityService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/ComplexityService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AASlC;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;YAEzB,0EAA0E;YAC1E,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CACpC,8DAA8D,CAC/D,CAAC;YACF,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAEvD,IAAI,YAAY,GAAsC,OAAO,CAAC;YAC9D,MAAM,WAAW,GAAa,EAAE,CAAC;YAEjC,IAAI,UAAU,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBACjC,YAAY,GAAG,OAAO,CAAC;gBACvB,WAAW,CAAC,IAAI,CACd,sFAAsF,CACvF,CAAC;YACJ,CAAC;iBAAM,IAAI,UAAU,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBACxC,YAAY,GAAG,SAAS,CAAC;gBACzB,WAAW,CAAC,IAAI,CACd,uEAAuE,CACxE,CAAC;YACJ,CAAC;iBAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBAC1B,YAAY,GAAG,UAAU,CAAC;gBAC1B,WAAW,CAAC,IAAI,CACd,4DAA4D,CAC7D,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,oBAAoB,EAAE,UAAU;gBAChC,GAAG;gBACH,YAAY;gBACZ,WAAW;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"ComplexityService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/ComplexityService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AASlC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QAEzB,0EAA0E;QAC1E,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CACpC,8DAA8D,CAC/D,CAAC;QACF,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvD,IAAI,YAAY,GAAsC,OAAO,CAAC;QAC9D,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,IAAI,UAAU,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACjC,YAAY,GAAG,OAAO,CAAC;YACvB,WAAW,CAAC,IAAI,CACd,sFAAsF,CACvF,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,GAAG,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACxC,YAAY,GAAG,SAAS,CAAC;YACzB,WAAW,CAAC,IAAI,CACd,uEAAuE,CACxE,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC1B,YAAY,GAAG,UAAU,CAAC;YAC1B,WAAW,CAAC,IAAI,CACd,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,oBAAoB,EAAE,UAAU;YAChC,GAAG;YACH,YAAY;YACZ,WAAW;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -1,51 +1,62 @@
1
1
  import { readFile } from "../filesystem/FileService.js";
2
- export class DependencyService {
3
- /**
4
- * Extracts imports and exports from a file to map its structural network.
5
- */
6
- static async getFileNetwork(filePath) {
7
- try {
8
- const content = await readFile(filePath);
9
- // Heuristic regex patterns for ESM imports and exports
10
- const importRegex = /import\s+(?:.*?\s+from\s+)?['"](.*?)['"]/g;
11
- const exportRegex = /export\s+(?:const|class|function|type|interface|enum|default)\s+(\w+)/g;
12
- const imports = [];
13
- const exports = [];
14
- let match;
15
- while ((match = importRegex.exec(content)) !== null) {
16
- imports.push(match[1]);
17
- }
18
- while ((match = exportRegex.exec(content)) !== null) {
19
- exports.push(match[1]);
20
- }
21
- let result = `# File Network: ${filePath.split("/").pop()}\n\n`;
22
- result += `## 📥 Imports (Dependencies)\n`;
23
- if (imports.length > 0) {
24
- imports.forEach((i) => (result += `- \`${i}\`\n`));
25
- }
26
- else {
27
- result += `*None detected (Self-contained logic)*\n`;
28
- }
29
- result += `\n## 📤 Exports (Offerings)\n`;
30
- if (exports.length > 0) {
31
- exports.forEach((e) => (result += `- \`${e}\`\n`));
32
- }
33
- else {
34
- result += `*None detected (Internal consumer)*\n`;
35
- }
36
- return result;
2
+ /**
3
+ * Extracts imports and exports from a file to map its structural network.
4
+ */
5
+ export async function getFileNetwork(filePath) {
6
+ try {
7
+ const content = await readFile(filePath);
8
+ // Heuristic regex patterns for ESM imports and exports
9
+ const importRegex = /import\s+(?:.*?\s+from\s+)?['"](.*?)['"]/g;
10
+ const exportRegex = /export\s+(?:const|class|function|type|interface|enum|default)\s+(\w+)/g;
11
+ const imports = [];
12
+ const exports = [];
13
+ let match;
14
+ while ((match = importRegex.exec(content)) !== null) {
15
+ imports.push(match[1]);
37
16
  }
38
- catch (error) {
39
- throw new Error(`Failed to map network for ${filePath}: ${error}`);
17
+ while ((match = exportRegex.exec(content)) !== null) {
18
+ exports.push(match[1]);
40
19
  }
20
+ let result = `# File Network: ${filePath.split("/").pop()}\n\n`;
21
+ result += `## 📥 Imports (Dependencies)\n`;
22
+ if (imports.length > 0) {
23
+ imports.forEach((i) => (result += `- \`${i}\`\n`));
24
+ }
25
+ else {
26
+ result += `*None detected (Self-contained logic)*\n`;
27
+ }
28
+ result += `\n## 📤 Exports (Offerings)\n`;
29
+ if (exports.length > 0) {
30
+ exports.forEach((e) => (result += `- \`${e}\`\n`));
31
+ }
32
+ else {
33
+ result += `*None detected (Internal consumer)*\n`;
34
+ }
35
+ return result;
41
36
  }
42
- /**
43
- * STABILITY: Circular Dependency Guard
44
- * Detects if two files depend on each other, which can cause initialization death spirals.
45
- */
46
- static async checkCircularity(fileA, fileB) {
47
- // Placeholder for future graph analysis
48
- return false;
37
+ catch (error) {
38
+ throw new Error(`Failed to map network for ${filePath}: ${error}`);
49
39
  }
50
40
  }
41
+ /**
42
+ * STABILITY: Circular Dependency Guard
43
+ * Detects if two files depend on each other, which can cause initialization death spirals.
44
+ */
45
+ export async function checkCircularity(fileA, fileB) {
46
+ const contentA = await readFile(fileA);
47
+ const contentB = await readFile(fileB);
48
+ const nameA = fileA
49
+ .split("/")
50
+ .pop()
51
+ ?.replace(/\.[^.]+$/, "");
52
+ const nameB = fileB
53
+ .split("/")
54
+ .pop()
55
+ ?.replace(/\.[^.]+$/, "");
56
+ if (!nameA || !nameB)
57
+ return false;
58
+ const importsA = contentA.includes(nameB);
59
+ const importsB = contentB.includes(nameA);
60
+ return importsA && importsB;
61
+ }
51
62
  //# sourceMappingURL=DependencyService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DependencyService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/DependencyService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,OAAO,iBAAiB;IAC5B;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAgB;QACjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEzC,uDAAuD;YACvD,MAAM,WAAW,GAAG,2CAA2C,CAAC;YAChE,MAAM,WAAW,GACf,wEAAwE,CAAC;YAE3E,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,MAAM,GAAG,mBAAmB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;YAEhE,MAAM,IAAI,gCAAgC,CAAC;YAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,0CAA0C,CAAC;YACvD,CAAC;YAED,MAAM,IAAI,+BAA+B,CAAC;YAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,uCAAuC,CAAC;YACpD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAClC,KAAa,EACb,KAAa;QAEb,wCAAwC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
1
+ {"version":3,"file":"DependencyService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/DependencyService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,uDAAuD;QACvD,MAAM,WAAW,GAAG,2CAA2C,CAAC;QAChE,MAAM,WAAW,GACf,wEAAwE,CAAC;QAE3E,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,MAAM,GAAG,mBAAmB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC;QAEhE,MAAM,IAAI,gCAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,0CAA0C,CAAC;QACvD,CAAC;QAED,MAAM,IAAI,+BAA+B,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,uCAAuC,CAAC;QACpD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,KAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,EAAE;QACN,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,EAAE;QACN,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE5B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1C,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAC9B,CAAC"}
@@ -1,49 +1,47 @@
1
1
  import * as fs from "fs/promises";
2
2
  import * as path from "path";
3
- export class DiscoveryService {
4
- /**
5
- * Returns a recursive, tree-like overview of a folder's structure.
6
- */
7
- static async getFolderTree(folderPath, maxDepth = 3) {
8
- try {
9
- const rootName = path.basename(folderPath);
10
- let result = `# Folder Structure: ${rootName}\n\n`;
11
- result += await this.generateTree(folderPath, "", 0, maxDepth);
12
- return result;
13
- }
14
- catch (error) {
15
- throw new Error(`Failed to generate folder tree for ${folderPath}: ${error}`);
16
- }
3
+ /**
4
+ * Returns a recursive, tree-like overview of a folder's structure.
5
+ */
6
+ export async function getFolderTree(folderPath, maxDepth = 3) {
7
+ try {
8
+ const rootName = path.basename(folderPath);
9
+ let result = `# Folder Structure: ${rootName}\n\n`;
10
+ result += await generateTree(folderPath, "", 0, maxDepth);
11
+ return result;
17
12
  }
18
- static async generateTree(dir, indent, currentDepth, maxDepth) {
19
- if (currentDepth > maxDepth)
20
- return "";
21
- let result = "";
22
- const entries = await fs.readdir(dir, { withFileTypes: true });
23
- // Sort: directories first, then files
24
- const sortedEntries = entries.sort((a, b) => {
25
- if (a.isDirectory() && !b.isDirectory())
26
- return -1;
27
- if (!a.isDirectory() && b.isDirectory())
28
- return 1;
29
- return a.name.localeCompare(b.name);
30
- });
31
- // Filter first to get accurate isLast calculation
32
- const visibleEntries = sortedEntries.filter((e) => !e.name.startsWith(".") &&
33
- e.name !== "node_modules" &&
34
- e.name !== "dist" &&
35
- e.name !== "out");
36
- for (let i = 0; i < visibleEntries.length; i++) {
37
- const entry = visibleEntries[i];
38
- const isLast = i === visibleEntries.length - 1;
39
- const prefix = isLast ? "└── " : "├── ";
40
- const nextIndent = indent + (isLast ? " " : "│ ");
41
- result += `${indent}${prefix}${entry.name}${entry.isDirectory() ? "/" : ""}\n`;
42
- if (entry.isDirectory()) {
43
- result += await this.generateTree(path.join(dir, entry.name), nextIndent, currentDepth + 1, maxDepth);
44
- }
13
+ catch (error) {
14
+ throw new Error(`Failed to generate folder tree for ${folderPath}: ${error}`);
15
+ }
16
+ }
17
+ async function generateTree(dir, indent, currentDepth, maxDepth) {
18
+ if (currentDepth > maxDepth)
19
+ return "";
20
+ let result = "";
21
+ const entries = await fs.readdir(dir, { withFileTypes: true });
22
+ // Sort: directories first, then files
23
+ const sortedEntries = entries.sort((a, b) => {
24
+ if (a.isDirectory() && !b.isDirectory())
25
+ return -1;
26
+ if (!a.isDirectory() && b.isDirectory())
27
+ return 1;
28
+ return a.name.localeCompare(b.name);
29
+ });
30
+ // Filter first to get accurate isLast calculation
31
+ const visibleEntries = sortedEntries.filter((e) => !e.name.startsWith(".") &&
32
+ e.name !== "node_modules" &&
33
+ e.name !== "dist" &&
34
+ e.name !== "out");
35
+ for (let i = 0; i < visibleEntries.length; i++) {
36
+ const entry = visibleEntries[i];
37
+ const isLast = i === visibleEntries.length - 1;
38
+ const prefix = isLast ? "└── " : "├── ";
39
+ const nextIndent = indent + (isLast ? " " : "│ ");
40
+ result += `${indent}${prefix}${entry.name}${entry.isDirectory() ? "/" : ""}\n`;
41
+ if (entry.isDirectory()) {
42
+ result += await generateTree(path.join(dir, entry.name), nextIndent, currentDepth + 1, maxDepth);
45
43
  }
46
- return result;
47
44
  }
45
+ return result;
48
46
  }
49
47
  //# sourceMappingURL=DiscoveryService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiscoveryService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/DiscoveryService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DiscoveryService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/DiscoveryService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,WAAmB,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,MAAM,GAAG,uBAAuB,QAAQ,MAAM,CAAC;QACnD,MAAM,IAAI,MAAM,YAAY,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,sCAAsC,UAAU,KAAK,KAAK,EAAE,CAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,MAAc,EACd,YAAoB,EACpB,QAAgB;IAEhB,IAAI,YAAY,GAAG,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEvC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,sCAAsC;IACtC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CACzC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACvB,CAAC,CAAC,IAAI,KAAK,cAAc;QACzB,CAAC,CAAC,IAAI,KAAK,MAAM;QACjB,CAAC,CAAC,IAAI,KAAK,KAAK,CACnB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,KAAK,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEvD,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAE/E,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,MAAM,YAAY,CAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAC1B,UAAU,EACV,YAAY,GAAG,CAAC,EAChB,QAAQ,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -4,63 +4,59 @@ import { checkCodeHealth } from "./CodeHealthService.js";
4
4
  /**
5
5
  * Generates a project-wide "Joy Map" to help Marie prioritize tidying.
6
6
  */
7
- export class JoyMapService {
8
- static async generate(workspaceRoot) {
9
- const srcPath = path.join(workspaceRoot, "src");
10
- const files = await this.findTsFiles(srcPath);
11
- const results = [];
12
- let totalScore = 0;
13
- // Limit scan to 50 files for performance
14
- const targetFiles = files.slice(0, 50);
15
- for (const file of targetFiles) {
16
- try {
17
- const health = await checkCodeHealth(file);
18
- results.push({
19
- path: path.relative(workspaceRoot, file),
20
- joyScore: health.joyScore,
21
- clutterLevel: health.joyScore < 60
22
- ? "Toxic"
23
- : health.joyScore < 80
24
- ? "Tangled"
25
- : "Clean",
26
- });
27
- totalScore += health.joyScore;
28
- }
29
- catch (e) {
30
- console.error(`Failed to scan ${file}`, e);
31
- }
7
+ export async function generateJoyMap(workspaceRoot) {
8
+ const srcPath = path.join(workspaceRoot, "src");
9
+ const files = await findTsFiles(srcPath);
10
+ const results = [];
11
+ let totalScore = 0;
12
+ // Limit scan to 50 files for performance
13
+ const targetFiles = files.slice(0, 50);
14
+ for (const file of targetFiles) {
15
+ try {
16
+ const health = await checkCodeHealth(file);
17
+ results.push({
18
+ path: path.relative(workspaceRoot, file),
19
+ joyScore: health.joyScore,
20
+ clutterLevel: health.joyScore < 60
21
+ ? "Toxic"
22
+ : health.joyScore < 80
23
+ ? "Tangled"
24
+ : "Clean",
25
+ });
26
+ totalScore += health.joyScore;
27
+ }
28
+ catch (e) {
29
+ console.error(`Failed to scan ${file}`, e);
32
30
  }
33
- const averageScore = targetFiles.length > 0
34
- ? Math.floor(totalScore / targetFiles.length)
35
- : 100;
36
- const hotspots = results
37
- .sort((a, b) => a.joyScore - b.joyScore)
38
- .filter((r) => r.joyScore < 70)
39
- .slice(0, 5);
40
- return {
41
- overallJoyScore: averageScore,
42
- totalFilesScanned: targetFiles.length,
43
- hotspots,
44
- summary: `The project has an average Joy Score of ${averageScore}. ` +
45
- (hotspots.length > 0
46
- ? `We found ${hotspots.length} hotspots that need immediate attention.`
47
- : "The Garden is looking pristine! ✨"),
48
- };
49
- }
50
- static async findTsFiles(dir) {
51
- const entries = await fs.readdir(dir, { withFileTypes: true });
52
- const files = await Promise.all(entries.map(async (entry) => {
53
- const res = path.resolve(dir, entry.name);
54
- if (entry.isDirectory()) {
55
- if (entry.name === "node_modules" || entry.name.startsWith("."))
56
- return [];
57
- return this.findTsFiles(res);
58
- }
59
- else {
60
- return res.endsWith(".ts") || res.endsWith(".tsx") ? [res] : [];
61
- }
62
- }));
63
- return files.flat();
64
31
  }
32
+ const averageScore = targetFiles.length > 0 ? Math.floor(totalScore / targetFiles.length) : 100;
33
+ const hotspots = results
34
+ .sort((a, b) => a.joyScore - b.joyScore)
35
+ .filter((r) => r.joyScore < 70)
36
+ .slice(0, 5);
37
+ return {
38
+ overallJoyScore: averageScore,
39
+ totalFilesScanned: targetFiles.length,
40
+ hotspots,
41
+ summary: `The project has an average Joy Score of ${averageScore}. ` +
42
+ (hotspots.length > 0
43
+ ? `We found ${hotspots.length} hotspots that need immediate attention.`
44
+ : "The Garden is looking pristine! ✨"),
45
+ };
46
+ }
47
+ async function findTsFiles(dir) {
48
+ const entries = await fs.readdir(dir, { withFileTypes: true });
49
+ const files = await Promise.all(entries.map(async (entry) => {
50
+ const res = path.resolve(dir, entry.name);
51
+ if (entry.isDirectory()) {
52
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
53
+ return [];
54
+ return findTsFiles(res);
55
+ }
56
+ else {
57
+ return res.endsWith(".ts") || res.endsWith(".tsx") ? [res] : [];
58
+ }
59
+ }));
60
+ return files.flat();
65
61
  }
66
62
  //# sourceMappingURL=JoyMapService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JoyMapService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/JoyMapService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JoyMapService.js","sourceRoot":"","sources":["../../../../src/monolith/plumbing/analysis/JoyMapService.ts"],"names":[],"mappings":"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"}