@noorm/marie-cli 0.1.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 (193) hide show
  1. package/JOY_ZONING.md +200 -0
  2. package/LICENSE.md +190 -0
  3. package/README.md +94 -0
  4. package/dist/cli-new/components/App.js +138 -0
  5. package/dist/cli-new/components/App.js.map +1 -0
  6. package/dist/cli-new/components/ApprovalDialog.js +31 -0
  7. package/dist/cli-new/components/ApprovalDialog.js.map +1 -0
  8. package/dist/cli-new/components/Banner.js +23 -0
  9. package/dist/cli-new/components/Banner.js.map +1 -0
  10. package/dist/cli-new/components/ChatArea.js +49 -0
  11. package/dist/cli-new/components/ChatArea.js.map +1 -0
  12. package/dist/cli-new/components/Header.js +20 -0
  13. package/dist/cli-new/components/Header.js.map +1 -0
  14. package/dist/cli-new/components/InputArea.js +97 -0
  15. package/dist/cli-new/components/InputArea.js.map +1 -0
  16. package/dist/cli-new/components/MessageBubble.js +114 -0
  17. package/dist/cli-new/components/MessageBubble.js.map +1 -0
  18. package/dist/cli-new/components/SessionSwitcher.js +46 -0
  19. package/dist/cli-new/components/SessionSwitcher.js.map +1 -0
  20. package/dist/cli-new/components/SetupWizard.js +283 -0
  21. package/dist/cli-new/components/SetupWizard.js.map +1 -0
  22. package/dist/cli-new/components/ToolCallDisplay.js +45 -0
  23. package/dist/cli-new/components/ToolCallDisplay.js.map +1 -0
  24. package/dist/cli-new/hooks/useGit.js +99 -0
  25. package/dist/cli-new/hooks/useGit.js.map +1 -0
  26. package/dist/cli-new/hooks/useMarie.js +249 -0
  27. package/dist/cli-new/hooks/useMarie.js.map +1 -0
  28. package/dist/cli-new/hooks/useSessions.js +75 -0
  29. package/dist/cli-new/hooks/useSessions.js.map +1 -0
  30. package/dist/cli-new/index.js +52 -0
  31. package/dist/cli-new/index.js.map +1 -0
  32. package/dist/cli-new/styles/theme.js +68 -0
  33. package/dist/cli-new/styles/theme.js.map +1 -0
  34. package/dist/cli-new/types/cli.js +2 -0
  35. package/dist/cli-new/types/cli.js.map +1 -0
  36. package/dist/extension.cjs +655 -0
  37. package/dist/monolith/adapters/CliMarieAdapter.js +72 -0
  38. package/dist/monolith/adapters/CliMarieAdapter.js.map +1 -0
  39. package/dist/monolith/adapters/VscodeMarieAdapter.js +81 -0
  40. package/dist/monolith/adapters/VscodeMarieAdapter.js.map +1 -0
  41. package/dist/monolith/cli/CliFileSystemPort.js +83 -0
  42. package/dist/monolith/cli/CliFileSystemPort.js.map +1 -0
  43. package/dist/monolith/cli/MarieToolDefinitionsCLI.js +438 -0
  44. package/dist/monolith/cli/MarieToolDefinitionsCLI.js.map +1 -0
  45. package/dist/monolith/cli/index.js +272 -0
  46. package/dist/monolith/cli/index.js.map +1 -0
  47. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js +80 -0
  48. package/dist/monolith/cli/services/JoyAutomationServiceCLI.js.map +1 -0
  49. package/dist/monolith/cli/services/JoyServiceCLI.js +63 -0
  50. package/dist/monolith/cli/services/JoyServiceCLI.js.map +1 -0
  51. package/dist/monolith/cli/storage.js +119 -0
  52. package/dist/monolith/cli/storage.js.map +1 -0
  53. package/dist/monolith/domain/joy/JoyTools.js +513 -0
  54. package/dist/monolith/domain/joy/JoyTools.js.map +1 -0
  55. package/dist/monolith/domain/joy/RitualService.js +51 -0
  56. package/dist/monolith/domain/joy/RitualService.js.map +1 -0
  57. package/dist/monolith/domain/marie/MarieTypes.js +2 -0
  58. package/dist/monolith/domain/marie/MarieTypes.js.map +1 -0
  59. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js +230 -0
  60. package/dist/monolith/infrastructure/ai/agents/MarieAscendant.js.map +1 -0
  61. package/dist/monolith/infrastructure/ai/agents/MarieYOLO.js +207 -0
  62. package/dist/monolith/infrastructure/ai/agents/MarieYOLO.js.map +1 -0
  63. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js +129 -0
  64. package/dist/monolith/infrastructure/ai/context/ContextArchiveService.js.map +1 -0
  65. package/dist/monolith/infrastructure/ai/context/ContextManager.js +118 -0
  66. package/dist/monolith/infrastructure/ai/context/ContextManager.js.map +1 -0
  67. package/dist/monolith/infrastructure/ai/core/FileSystemPort.js +2 -0
  68. package/dist/monolith/infrastructure/ai/core/FileSystemPort.js.map +1 -0
  69. package/dist/monolith/infrastructure/ai/core/GhostPort.js +2 -0
  70. package/dist/monolith/infrastructure/ai/core/GhostPort.js.map +1 -0
  71. package/dist/monolith/infrastructure/ai/core/MarieAscensionTypes.js +2 -0
  72. package/dist/monolith/infrastructure/ai/core/MarieAscensionTypes.js.map +1 -0
  73. package/dist/monolith/infrastructure/ai/core/MarieEngine.js +590 -0
  74. package/dist/monolith/infrastructure/ai/core/MarieEngine.js.map +1 -0
  75. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js +161 -0
  76. package/dist/monolith/infrastructure/ai/core/MarieEventDispatcher.js.map +1 -0
  77. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js +121 -0
  78. package/dist/monolith/infrastructure/ai/core/MarieLockManager.js.map +1 -0
  79. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js +256 -0
  80. package/dist/monolith/infrastructure/ai/core/MarieProgressTracker.js.map +1 -0
  81. package/dist/monolith/infrastructure/ai/core/MariePulseService.js +67 -0
  82. package/dist/monolith/infrastructure/ai/core/MariePulseService.js.map +1 -0
  83. package/dist/monolith/infrastructure/ai/core/MarieResponse.js +101 -0
  84. package/dist/monolith/infrastructure/ai/core/MarieResponse.js.map +1 -0
  85. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js +86 -0
  86. package/dist/monolith/infrastructure/ai/core/MarieSanitizer.js.map +1 -0
  87. package/dist/monolith/infrastructure/ai/core/MarieSession.js +202 -0
  88. package/dist/monolith/infrastructure/ai/core/MarieSession.js.map +1 -0
  89. package/dist/monolith/infrastructure/ai/core/MarieStabilityMonitor.js +58 -0
  90. package/dist/monolith/infrastructure/ai/core/MarieStabilityMonitor.js.map +1 -0
  91. package/dist/monolith/infrastructure/ai/core/MarieToolMender.js +127 -0
  92. package/dist/monolith/infrastructure/ai/core/MarieToolMender.js.map +1 -0
  93. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js +548 -0
  94. package/dist/monolith/infrastructure/ai/core/MarieToolProcessor.js.map +1 -0
  95. package/dist/monolith/infrastructure/ai/core/MarieYOLOTypes.js +2 -0
  96. package/dist/monolith/infrastructure/ai/core/MarieYOLOTypes.js.map +1 -0
  97. package/dist/monolith/infrastructure/ai/core/ReasoningBudget.js +125 -0
  98. package/dist/monolith/infrastructure/ai/core/ReasoningBudget.js.map +1 -0
  99. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js +30 -0
  100. package/dist/monolith/infrastructure/ai/core/VscodeFileSystemPort.js.map +1 -0
  101. package/dist/monolith/infrastructure/ai/providers/AIProvider.js +2 -0
  102. package/dist/monolith/infrastructure/ai/providers/AIProvider.js.map +1 -0
  103. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js +148 -0
  104. package/dist/monolith/infrastructure/ai/providers/AnthropicProvider.js.map +1 -0
  105. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js +208 -0
  106. package/dist/monolith/infrastructure/ai/providers/CerebrasProvider.js.map +1 -0
  107. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js +404 -0
  108. package/dist/monolith/infrastructure/ai/providers/OpenRouterProvider.js.map +1 -0
  109. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js +283 -0
  110. package/dist/monolith/infrastructure/ai/providers/OpenRouterStreamParser.js.map +1 -0
  111. package/dist/monolith/infrastructure/config/ConfigService.js +398 -0
  112. package/dist/monolith/infrastructure/config/ConfigService.js.map +1 -0
  113. package/dist/monolith/infrastructure/services/MarieMemoryStore.js +140 -0
  114. package/dist/monolith/infrastructure/services/MarieMemoryStore.js.map +1 -0
  115. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js +1568 -0
  116. package/dist/monolith/infrastructure/tools/MarieToolDefinitions.js.map +1 -0
  117. package/dist/monolith/infrastructure/tools/PureStreamParser.js +147 -0
  118. package/dist/monolith/infrastructure/tools/PureStreamParser.js.map +1 -0
  119. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js +223 -0
  120. package/dist/monolith/infrastructure/tools/SharedToolDefinitions.js.map +1 -0
  121. package/dist/monolith/infrastructure/tools/ToolRegistry.js +29 -0
  122. package/dist/monolith/infrastructure/tools/ToolRegistry.js.map +1 -0
  123. package/dist/monolith/infrastructure/tools/ToolUtils.js +59 -0
  124. package/dist/monolith/infrastructure/tools/ToolUtils.js.map +1 -0
  125. package/dist/monolith/plumbing/analysis/CodeHealthService.js +146 -0
  126. package/dist/monolith/plumbing/analysis/CodeHealthService.js.map +1 -0
  127. package/dist/monolith/plumbing/analysis/ComplexityService.js +43 -0
  128. package/dist/monolith/plumbing/analysis/ComplexityService.js.map +1 -0
  129. package/dist/monolith/plumbing/analysis/DependencyService.js +51 -0
  130. package/dist/monolith/plumbing/analysis/DependencyService.js.map +1 -0
  131. package/dist/monolith/plumbing/analysis/DiscoveryService.js +49 -0
  132. package/dist/monolith/plumbing/analysis/DiscoveryService.js.map +1 -0
  133. package/dist/monolith/plumbing/analysis/JoyMapService.js +66 -0
  134. package/dist/monolith/plumbing/analysis/JoyMapService.js.map +1 -0
  135. package/dist/monolith/plumbing/analysis/LintService.js +132 -0
  136. package/dist/monolith/plumbing/analysis/LintService.js.map +1 -0
  137. package/dist/monolith/plumbing/analysis/MarieSentinelService.js +276 -0
  138. package/dist/monolith/plumbing/analysis/MarieSentinelService.js.map +1 -0
  139. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js +119 -0
  140. package/dist/monolith/plumbing/analysis/QualityGuardrailService.js.map +1 -0
  141. package/dist/monolith/plumbing/analysis/SurgicalMender.js +70 -0
  142. package/dist/monolith/plumbing/analysis/SurgicalMender.js.map +1 -0
  143. package/dist/monolith/plumbing/analysis/TestService.js +104 -0
  144. package/dist/monolith/plumbing/analysis/TestService.js.map +1 -0
  145. package/dist/monolith/plumbing/filesystem/FileService.js +406 -0
  146. package/dist/monolith/plumbing/filesystem/FileService.js.map +1 -0
  147. package/dist/monolith/plumbing/filesystem/PathResolver.js +26 -0
  148. package/dist/monolith/plumbing/filesystem/PathResolver.js.map +1 -0
  149. package/dist/monolith/plumbing/git/GitService.js +71 -0
  150. package/dist/monolith/plumbing/git/GitService.js.map +1 -0
  151. package/dist/monolith/plumbing/lsp/SymbolService.js +36 -0
  152. package/dist/monolith/plumbing/lsp/SymbolService.js.map +1 -0
  153. package/dist/monolith/plumbing/terminal/ProcessRegistry.js +31 -0
  154. package/dist/monolith/plumbing/terminal/ProcessRegistry.js.map +1 -0
  155. package/dist/monolith/plumbing/terminal/TerminalService.js +180 -0
  156. package/dist/monolith/plumbing/terminal/TerminalService.js.map +1 -0
  157. package/dist/monolith/plumbing/ui/DecorationService.js +54 -0
  158. package/dist/monolith/plumbing/ui/DecorationService.js.map +1 -0
  159. package/dist/monolith/plumbing/utils/ErrorUtils.js +11 -0
  160. package/dist/monolith/plumbing/utils/ErrorUtils.js.map +1 -0
  161. package/dist/monolith/plumbing/utils/JsonUtils.js +360 -0
  162. package/dist/monolith/plumbing/utils/JsonUtils.js.map +1 -0
  163. package/dist/monolith/plumbing/utils/PrefixTree.js +153 -0
  164. package/dist/monolith/plumbing/utils/PrefixTree.js.map +1 -0
  165. package/dist/monolith/plumbing/utils/RetryUtils.js +141 -0
  166. package/dist/monolith/plumbing/utils/RetryUtils.js.map +1 -0
  167. package/dist/monolith/plumbing/utils/StreamTagDetector.js +128 -0
  168. package/dist/monolith/plumbing/utils/StreamTagDetector.js.map +1 -0
  169. package/dist/monolith/plumbing/utils/StringUtils.js +97 -0
  170. package/dist/monolith/plumbing/utils/StringUtils.js.map +1 -0
  171. package/dist/monolith/plumbing/utils/TimeoutUtils.js +21 -0
  172. package/dist/monolith/plumbing/utils/TimeoutUtils.js.map +1 -0
  173. package/dist/monolith/runtime/MarieRuntime.js +354 -0
  174. package/dist/monolith/runtime/MarieRuntime.js.map +1 -0
  175. package/dist/monolith/runtime/RuntimeAdapterBase.js +59 -0
  176. package/dist/monolith/runtime/RuntimeAdapterBase.js.map +1 -0
  177. package/dist/monolith/runtime/providerFactory.js +11 -0
  178. package/dist/monolith/runtime/providerFactory.js.map +1 -0
  179. package/dist/monolith/runtime/types.js +2 -0
  180. package/dist/monolith/runtime/types.js.map +1 -0
  181. package/dist/monolith/services/HealthService.js +38 -0
  182. package/dist/monolith/services/HealthService.js.map +1 -0
  183. package/dist/monolith/services/JoyAutomationService.js +131 -0
  184. package/dist/monolith/services/JoyAutomationService.js.map +1 -0
  185. package/dist/monolith/services/JoyLogService.js +48 -0
  186. package/dist/monolith/services/JoyLogService.js.map +1 -0
  187. package/dist/monolith/services/JoyService.js +190 -0
  188. package/dist/monolith/services/JoyService.js.map +1 -0
  189. package/dist/monolith/services/MarieGhostService.js +168 -0
  190. package/dist/monolith/services/MarieGhostService.js.map +1 -0
  191. package/dist/monolith/services/MarieSCMProvider.js +41 -0
  192. package/dist/monolith/services/MarieSCMProvider.js.map +1 -0
  193. package/package.json +168 -0
@@ -0,0 +1,513 @@
1
+ import * as vscode from "vscode";
2
+ import * as fs from "fs/promises";
3
+ import * as path from "path";
4
+ import { ConfigService } from "../../infrastructure/config/ConfigService.js";
5
+ export async function logGratitude(message) {
6
+ const workspaceFolders = vscode.workspace.workspaceFolders;
7
+ if (!workspaceFolders)
8
+ return;
9
+ const gratitudePath = path.join(workspaceFolders[0].uri.fsPath, "GRATITUDE.md");
10
+ const date = new Date().toISOString().split("T")[0];
11
+ const entry = `- **${date}**: ${message}\n`;
12
+ try {
13
+ await fs.appendFile(gratitudePath, entry, "utf-8");
14
+ }
15
+ catch (e) {
16
+ // If file doesn't exist, create it with header
17
+ const header = "# Gratitude Journal\n\nA record of things that have served their purpose and passed on.\n\n";
18
+ await fs.writeFile(gratitudePath, header + entry, "utf-8");
19
+ }
20
+ }
21
+ export async function generateJoyDashboard(rootPath, signal) {
22
+ const { checkCodeHealth } = await import("../../plumbing/analysis/CodeHealthService.js");
23
+ const files = await getAllFiles(rootPath, signal);
24
+ let totalScore = 0;
25
+ let scoredFiles = 0;
26
+ const hallOfFame = [];
27
+ const needsCare = [];
28
+ for (const file of files) {
29
+ if (file.includes("node_modules") ||
30
+ file.includes(".git") ||
31
+ file.includes("dist"))
32
+ continue;
33
+ if (file.endsWith(".ts") ||
34
+ file.endsWith(".js") ||
35
+ file.endsWith(".tsx") ||
36
+ file.endsWith(".jsx")) {
37
+ try {
38
+ const health = await checkCodeHealth(file);
39
+ totalScore += health.joyScore;
40
+ scoredFiles++;
41
+ if (health.joyScore === 100) {
42
+ hallOfFame.push(`- 🏆 **${path.basename(file)}**`);
43
+ }
44
+ else if (health.joyScore < 50) {
45
+ needsCare.push(`- ❤️‍🩹 **${path.basename(file)}** (Score: ${health.joyScore})`);
46
+ }
47
+ }
48
+ catch {
49
+ /* Skip files that can't be analyzed */
50
+ }
51
+ }
52
+ }
53
+ const avgScore = scoredFiles > 0 ? Math.round(totalScore / scoredFiles) : 0;
54
+ // Read Logic for Journals
55
+ const getRecentLines = async (filename, count) => {
56
+ try {
57
+ const content = await fs.readFile(path.join(rootPath, filename), "utf-8");
58
+ const lines = content
59
+ .split("\n")
60
+ .filter((l) => l.trim().length > 0 && !l.startsWith("#"));
61
+ return lines.slice(-count);
62
+ }
63
+ catch {
64
+ return ["*No entries yet.*"];
65
+ }
66
+ };
67
+ const recentGratitude = await getRecentLines("GRATITUDE.md", 3);
68
+ const recentReflections = await getRecentLines("JOURNAL.md", 3);
69
+ let output = `# Joy Dashboard 🌟\n\n`;
70
+ output += `**Workspace Joy Score**: ${avgScore}/100\n\n`;
71
+ if (avgScore >= 90)
72
+ output += `*Your workspace is radiating joy!* ✨\n\n`;
73
+ else if (avgScore >= 70)
74
+ output += `*A tidy and functional space. Keep going!* 🌿\n\n`;
75
+ else
76
+ output += `*Your workspace needs some love and attention.* ❤️\n\n`;
77
+ output += `## 🏆 Hall of Fame (Perfect Score)\n${hallOfFame.length > 0 ? hallOfFame.join("\n") : "*No perfect files yet. Keep polishing!*"}\n\n`;
78
+ output += `## ❤️‍🩹 Needs Care (Score < 50)\n${needsCare.length > 0 ? needsCare.join("\n") : "*Everything is in decent shape!*"}\n\n`;
79
+ output += `## 🙏 Recent Gratitude\n${recentGratitude.join("\n")}\n\n`;
80
+ output += `## 📓 Recent Reflections\n${recentReflections.join("\n")}\n`;
81
+ const dashboardPath = path.join(rootPath, "JOY.md");
82
+ await fs.writeFile(dashboardPath, output, "utf-8");
83
+ return `Joy Dashboard generated at ${dashboardPath}`;
84
+ }
85
+ export async function cherishFile(filePath) {
86
+ const now = new Date();
87
+ await fs.utimes(filePath, now, now);
88
+ return `File '${path.basename(filePath)}' has been cherished. It is deemed active and sparks joy.`;
89
+ }
90
+ export async function foldCode(filePath) {
91
+ const uri = vscode.Uri.file(filePath);
92
+ try {
93
+ const doc = await vscode.workspace.openTextDocument(uri);
94
+ const editor = await vscode.window.showTextDocument(doc);
95
+ // The Art of Folding: Organize Imports then Format
96
+ await vscode.commands.executeCommand("editor.action.organizeImports");
97
+ await vscode.commands.executeCommand("editor.action.formatDocument");
98
+ await doc.save();
99
+ // Close the editor to keep the space tidy (optional, but nice)
100
+ await vscode.commands.executeCommand("workbench.action.closeActiveEditor");
101
+ return `File '${path.basename(filePath)}' has been folded neatly.`;
102
+ }
103
+ catch (e) {
104
+ return `Could not fold '${path.basename(filePath)}': ${e.message}`;
105
+ }
106
+ }
107
+ export async function generateTidyChecklist(rootPath, signal) {
108
+ const { checkCodeHealth } = await import("../../plumbing/analysis/CodeHealthService.js");
109
+ const files = await getAllFiles(rootPath, signal);
110
+ const clothes = []; // Source code
111
+ const papers = []; // Docs
112
+ const komono = []; // Config/Misc
113
+ const sentimental = []; // Aged files (> 90 days)
114
+ const now = new Date();
115
+ const SENTIMENTAL_AGE_MS = 90 * 24 * 60 * 60 * 1000; // 90 days
116
+ let output = "# Tidying Checklist 🧹\n\n";
117
+ for (const file of files) {
118
+ if (file.includes("node_modules") ||
119
+ file.includes(".git") ||
120
+ file.includes("dist"))
121
+ continue;
122
+ // Check for Sentimental items (Age)
123
+ try {
124
+ const stats = await fs.stat(file);
125
+ const age = now.getTime() - stats.mtime.getTime();
126
+ if (age > SENTIMENTAL_AGE_MS) {
127
+ sentimental.push(`- [ ] **${path.basename(file)}** (Last modified: ${stats.mtime.toISOString().split("T")[0]})`);
128
+ }
129
+ }
130
+ catch {
131
+ /* Ignore stat errors for individual files */
132
+ }
133
+ if (file.endsWith(".ts") ||
134
+ file.endsWith(".js") ||
135
+ file.endsWith(".tsx") ||
136
+ file.endsWith(".jsx")) {
137
+ // Check joy score for source code
138
+ try {
139
+ const health = await checkCodeHealth(file);
140
+ if (health.joyScore < 80) {
141
+ clothes.push(`- [ ] **${path.basename(file)}** (Score: ${health.joyScore}): ${health.joyStatus}`);
142
+ }
143
+ }
144
+ catch {
145
+ /* Skip files that can't be analyzed */
146
+ }
147
+ }
148
+ else if (file.endsWith(".md") || file.endsWith(".txt")) {
149
+ papers.push(`- [ ] ${path.basename(file)}`);
150
+ }
151
+ else if (file.endsWith(".json") || file.endsWith(".config")) {
152
+ komono.push(`- [ ] ${path.basename(file)}`);
153
+ }
154
+ }
155
+ if (clothes.length > 0) {
156
+ output +=
157
+ "## 👕 Clothes (Source Code)\n*Focus on files with low Joy Scores.*\n";
158
+ output += clothes.join("\n") + "\n\n";
159
+ }
160
+ if (papers.length > 0) {
161
+ output += "## 📄 Papers (Documentation)\n*Ensure these are up to date.*\n";
162
+ output += papers.join("\n") + "\n\n";
163
+ }
164
+ if (komono.length > 0) {
165
+ output +=
166
+ "## 🧶 Komono (Config & Misc)\n*Is this configuration still essential?*\n";
167
+ output += komono.join("\n") + "\n\n";
168
+ }
169
+ if (sentimental.length > 0) {
170
+ output +=
171
+ "## 🧸 Sentimental (Legacy)\n*These items haven't been touched in over 90 days. Do they still serve a purpose?*\n";
172
+ output += sentimental.join("\n") + "\n\n";
173
+ }
174
+ if (clothes.length === 0 &&
175
+ papers.length === 0 &&
176
+ komono.length === 0 &&
177
+ sentimental.length === 0) {
178
+ output += "Your workspace is pristine! ✨";
179
+ }
180
+ const tidyPath = path.join(rootPath, "TIDYING.md");
181
+ await fs.writeFile(tidyPath, output, "utf-8");
182
+ return `Tidy checklist generated at ${tidyPath}`;
183
+ }
184
+ export async function ensureJoyZoningFolders(rootPath) {
185
+ const zones = ["domain", "infrastructure", "plumbing"];
186
+ const srcPath = path.join(rootPath, "src");
187
+ try {
188
+ await fs.mkdir(srcPath, { recursive: true });
189
+ for (const zone of zones) {
190
+ const zonePath = path.join(srcPath, zone);
191
+ await fs.mkdir(zonePath, { recursive: true });
192
+ // Add a friendly README if missing
193
+ const readmePath = path.join(zonePath, "README.md");
194
+ try {
195
+ await fs.access(readmePath);
196
+ }
197
+ catch {
198
+ const zoneCapitalized = zone.charAt(0).toUpperCase() + zone.slice(1);
199
+ await fs.writeFile(readmePath, `# ${zoneCapitalized} Zone\n\nThis directory belongs to the ${zone.toUpperCase()} zone of the JOY concept.\n`, "utf-8");
200
+ }
201
+ }
202
+ }
203
+ catch (e) {
204
+ console.error("Failed to ensure JOY folders:", e);
205
+ }
206
+ }
207
+ export function autoZonePath(fileName, intent) {
208
+ const lowerIntent = intent.toLowerCase();
209
+ const lowerFileName = fileName.toLowerCase();
210
+ // Heuristics for Joyful (Domain)
211
+ if (lowerIntent.includes("logic") ||
212
+ lowerIntent.includes("business") ||
213
+ lowerIntent.includes("core") ||
214
+ lowerIntent.includes("rule") ||
215
+ lowerIntent.includes("domain") ||
216
+ lowerFileName.includes("model")) {
217
+ if (lowerFileName.includes("entity"))
218
+ return "src/domain/entities";
219
+ if (lowerFileName.includes("value"))
220
+ return "src/domain/values";
221
+ if (lowerFileName.includes("event"))
222
+ return "src/domain/events";
223
+ return "src/domain";
224
+ }
225
+ // Heuristics for Infrastructure
226
+ if (lowerIntent.includes("service") ||
227
+ lowerIntent.includes("api") ||
228
+ lowerIntent.includes("database") ||
229
+ lowerIntent.includes("adapter") ||
230
+ lowerIntent.includes("infrastructure") ||
231
+ lowerIntent.includes("client")) {
232
+ if (lowerFileName.includes("gateway") || lowerFileName.includes("client"))
233
+ return "src/infrastructure/gateways";
234
+ if (lowerFileName.includes("adapter"))
235
+ return "src/infrastructure/adapters";
236
+ if (lowerFileName.includes("repository"))
237
+ return "src/infrastructure/repositories";
238
+ return "src/infrastructure";
239
+ }
240
+ // Heuristics for Plumbing
241
+ if (lowerIntent.includes("util") ||
242
+ lowerIntent.includes("tool") ||
243
+ lowerIntent.includes("system") ||
244
+ lowerIntent.includes("format") ||
245
+ lowerIntent.includes("parse") ||
246
+ lowerIntent.includes("plumbing")) {
247
+ if (lowerFileName.includes("tool"))
248
+ return "src/plumbing/tools";
249
+ if (lowerFileName.includes("util"))
250
+ return "src/plumbing/utils";
251
+ return "src/plumbing";
252
+ }
253
+ return "src"; // Default fallback
254
+ }
255
+ export async function proposeReorganization(rootPath, signal) {
256
+ const files = await getAllFiles(rootPath, signal);
257
+ const proposals = [];
258
+ for (const file of files) {
259
+ if (file.includes("node_modules") ||
260
+ file.includes(".git") ||
261
+ file.includes("dist"))
262
+ continue;
263
+ if (!file.endsWith(".ts") &&
264
+ !file.endsWith(".tsx") &&
265
+ !file.endsWith(".js"))
266
+ continue;
267
+ const relativePath = path.relative(rootPath, file);
268
+ const content = await fs.readFile(file, "utf-8");
269
+ const suggestedZone = autoZonePath(path.basename(file), content);
270
+ const suggestedPath = path.join(suggestedZone, path.basename(file));
271
+ if (!relativePath.startsWith(suggestedZone)) {
272
+ proposals.push({
273
+ file: path.basename(file),
274
+ currentPath: relativePath,
275
+ suggestedPath: suggestedPath,
276
+ reason: `Heuristics suggest this belongs in ${suggestedZone} based on purpose and content.`,
277
+ });
278
+ }
279
+ }
280
+ return proposals;
281
+ }
282
+ export async function synthesizeZoneManuals(rootPath) {
283
+ const zones = ["domain", "infrastructure", "plumbing"];
284
+ let updatedCount = 0;
285
+ for (const zone of zones) {
286
+ const zonePath = path.join(rootPath, "src", zone);
287
+ try {
288
+ const entries = await fs.readdir(zonePath, { withFileTypes: true });
289
+ const files = entries.filter((e) => e.isFile() && !e.name.startsWith("."));
290
+ if (files.length === 0)
291
+ continue;
292
+ const fileList = files.map((f) => `- \`${f.name}\``).join("\n");
293
+ const summary = `This zone currently contains ${files.length} sprouts that define our ${zone.toUpperCase()} layer.`;
294
+ const readmePath = path.join(zonePath, "README.md");
295
+ const content = `# ${zone.charAt(0).toUpperCase() + zone.slice(1)} Zone\n\n${summary}\n\n### Current Inhabitants:\n${fileList}\n\n*Last synthesized by Marie on ${new Date().toLocaleDateString()}*`;
296
+ await fs.writeFile(readmePath, content, "utf-8");
297
+ updatedCount++;
298
+ }
299
+ catch (e) {
300
+ console.error(`Failed to synthesize manual for ${zone}:`, e);
301
+ }
302
+ }
303
+ return `Synthesized ${updatedCount} zone manuals. The knowledge is now fresh. ✨`;
304
+ }
305
+ export async function executeRestoration(rootPath, signal) {
306
+ const proposals = await proposeReorganization(rootPath, signal);
307
+ if (proposals.length === 0)
308
+ return "No restoration needed. Project order is absolute. ✨";
309
+ let movedCount = 0;
310
+ for (const p of proposals) {
311
+ try {
312
+ const from = path.join(rootPath, p.currentPath);
313
+ const to = path.join(rootPath, p.suggestedPath);
314
+ await fs.mkdir(path.dirname(to), { recursive: true });
315
+ await fs.rename(from, to);
316
+ movedCount++;
317
+ }
318
+ catch (e) {
319
+ console.error(`Restoration failed for ${p.file}:`, e);
320
+ }
321
+ }
322
+ return `Restoration complete. Moved ${movedCount} files to their rightful homes. 🌸`;
323
+ }
324
+ export async function scaffoldZoneAbstractions(rootPath) {
325
+ const zones = [
326
+ {
327
+ name: "domain",
328
+ file: "DomainEntity.ts",
329
+ content: `export abstract class DomainEntity {\n constructor(public readonly id: string) {}\n // The Domain is pure logic. No dependencies here. ✨\n}\n`,
330
+ },
331
+ {
332
+ name: "infrastructure",
333
+ file: "BaseAdapter.ts",
334
+ content: `export abstract class BaseAdapter {\n // Infrastructure connects the Domain to the world. 🌍\n protected abstract connect(): Promise<void>;\n}\n`,
335
+ },
336
+ {
337
+ name: "plumbing",
338
+ file: "BaseTool.ts",
339
+ content: `export abstract class BaseTool {\n // Plumbing is mechanical. Low-level work. 🔧\n protected format(input: string): string {\n return input.trim();\n }\n}\n`,
340
+ },
341
+ ];
342
+ let createdCount = 0;
343
+ for (const zone of zones) {
344
+ const zonePath = path.join(rootPath, "src", zone.name);
345
+ const filePath = path.join(zonePath, zone.file);
346
+ try {
347
+ await fs.mkdir(zonePath, { recursive: true });
348
+ try {
349
+ await fs.access(filePath);
350
+ }
351
+ catch {
352
+ await fs.writeFile(filePath, zone.content, "utf-8");
353
+ createdCount++;
354
+ }
355
+ }
356
+ catch (e) {
357
+ console.error(`Scaffolding failed for ${zone.name}:`, e);
358
+ }
359
+ }
360
+ return createdCount > 0
361
+ ? `Scaffolded ${createdCount} zone abstractions. The patterns are set. 🏛️`
362
+ : "Zones are already well-guarded.";
363
+ }
364
+ export async function sowFeature(rootPath, featureName, intent) {
365
+ const zones = [
366
+ {
367
+ name: "domain",
368
+ suffix: "Entity.ts",
369
+ comment: "Core logic and business rules. Purity and intent reside here. ✨",
370
+ },
371
+ {
372
+ name: "infrastructure",
373
+ suffix: "Repository.ts",
374
+ comment: "Connecting the core to the world. Adapters and data reside here. 🌍",
375
+ },
376
+ {
377
+ name: "plumbing",
378
+ suffix: "Utils.ts",
379
+ comment: "The mechanical support. Technical utilities reside here. 🔧",
380
+ },
381
+ ];
382
+ const kebabName = featureName
383
+ .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
384
+ .toLowerCase();
385
+ const pascalName = featureName.charAt(0).toUpperCase() + featureName.slice(1);
386
+ let createdCount = 0;
387
+ for (const zone of zones) {
388
+ const zonePath = path.join(rootPath, "src", zone.name, kebabName);
389
+ const fileName = `${pascalName}${zone.suffix}`;
390
+ const filePath = path.join(zonePath, fileName);
391
+ const content = `/**\n * ${pascalName} ${zone.name.charAt(0).toUpperCase() + zone.name.slice(1)}\n * Intent: ${intent}\n * \n * ${zone.comment}\n */\n\nexport class ${pascalName}${zone.suffix.replace(".ts", "")} {\n // A new sprout in the ${zone.name} zone.\n}\n`;
392
+ try {
393
+ await fs.mkdir(zonePath, { recursive: true });
394
+ await fs.writeFile(filePath, content, "utf-8");
395
+ createdCount++;
396
+ }
397
+ catch (e) {
398
+ console.error(`Sowing failed for ${zone.name}:`, e);
399
+ }
400
+ }
401
+ return `Successfully sowed '${featureName}' across ${createdCount} JOY zones. Your feature has taken root. 🌱`;
402
+ }
403
+ export async function proposeClustering(rootPath) {
404
+ const zones = ["domain", "infrastructure", "plumbing"];
405
+ const proposals = [];
406
+ for (const zone of zones) {
407
+ const zonePath = path.join(rootPath, "src", zone);
408
+ try {
409
+ const entries = await fs.readdir(zonePath, { withFileTypes: true });
410
+ const files = entries.filter((e) => e.isFile() && !e.name.startsWith("."));
411
+ if (files.length > 10) {
412
+ // Heuristic: suggest clusters based on common prefixes/suffixes
413
+ const names = files.map((f) => f.name);
414
+ const suffixes = [
415
+ "Service",
416
+ "Repository",
417
+ "Entity",
418
+ "Tool",
419
+ "Util",
420
+ "Adapter",
421
+ ];
422
+ const clusters = suffixes.filter((s) => names.some((n) => n.includes(s)));
423
+ proposals.push({
424
+ zone,
425
+ fileCount: files.length,
426
+ suggestedClusters: clusters.length > 0 ? clusters : ["common", "core", "shared"],
427
+ reason: `The ${zone} zone is becoming a bit crowded with ${files.length} files. Clustering will restore clarity.`,
428
+ });
429
+ }
430
+ }
431
+ catch {
432
+ /* Zone directory may not exist yet */
433
+ }
434
+ }
435
+ return proposals;
436
+ }
437
+ export async function isProjectJoyful(rootPath) {
438
+ try {
439
+ const zones = ["src/domain", "src/infrastructure", "src/plumbing"];
440
+ for (const zone of zones) {
441
+ await fs.access(path.join(rootPath, zone));
442
+ }
443
+ return true;
444
+ }
445
+ catch {
446
+ return false;
447
+ }
448
+ }
449
+ export async function executeGenesisRitual(rootPath, signal) {
450
+ const files = await getAllFiles(rootPath, signal);
451
+ let totalMoved = 0;
452
+ for (const file of files) {
453
+ if (file.includes("node_modules") ||
454
+ file.includes(".git") ||
455
+ file.includes("dist"))
456
+ continue;
457
+ if (!file.endsWith(".ts") &&
458
+ !file.endsWith(".tsx") &&
459
+ !file.endsWith(".js"))
460
+ continue;
461
+ const relativePath = path.relative(rootPath, file);
462
+ // Skip if already in JOY structure
463
+ if (relativePath.startsWith("src/domain") ||
464
+ relativePath.startsWith("src/infrastructure") ||
465
+ relativePath.startsWith("src/plumbing"))
466
+ continue;
467
+ const content = await fs.readFile(file, "utf-8");
468
+ const suggestedZone = autoZonePath(path.basename(file), content);
469
+ const targetPath = path.join(rootPath, suggestedZone, path.basename(file));
470
+ try {
471
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
472
+ await fs.rename(file, targetPath);
473
+ totalMoved++;
474
+ }
475
+ catch (e) {
476
+ console.error(`Genesis move failed for ${file}:`, e);
477
+ }
478
+ }
479
+ await ensureJoyZoningFolders(rootPath);
480
+ await synthesizeZoneManuals(rootPath);
481
+ return `Genesis Ritual complete. Converted ${totalMoved} files to the JOY ecosystem. Your project is reborn. ✨`;
482
+ }
483
+ async function getAllFiles(dir, signal) {
484
+ const results = [];
485
+ const excludedDirs = new Set(ConfigService.getExcludedFiles());
486
+ const MAX_FILES = 5000;
487
+ async function scan(directory) {
488
+ if (signal?.aborted || results.length >= MAX_FILES)
489
+ return;
490
+ const entries = await fs.readdir(directory, { withFileTypes: true });
491
+ for (const entry of entries) {
492
+ if (signal?.aborted || results.length >= MAX_FILES)
493
+ return;
494
+ const fullPath = path.join(directory, entry.name);
495
+ if (entry.isDirectory()) {
496
+ if (!excludedDirs.has(entry.name)) {
497
+ await scan(fullPath);
498
+ }
499
+ }
500
+ else {
501
+ results.push(fullPath);
502
+ }
503
+ }
504
+ }
505
+ try {
506
+ await scan(dir);
507
+ }
508
+ catch (e) {
509
+ console.error(`[JoyTools] Scan failed for ${dir}:`, e);
510
+ }
511
+ return results;
512
+ }
513
+ //# sourceMappingURL=JoyTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JoyTools.js","sourceRoot":"","sources":["../../../../src/monolith/domain/joy/JoyTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export class RitualService {
2
+ /** Zone ranking hierarchy — hoisted to avoid per-call allocation */
3
+ static ZONE_RANKINGS = {
4
+ joyful: 3,
5
+ infrastructure: 2,
6
+ plumbing: 1,
7
+ };
8
+ /**
9
+ * Dependency Law: Joyful -> Infrastructure -> Plumbing.
10
+ * Never point upward.
11
+ */
12
+ static validateDependencies(sourceZone, targetFiles) {
13
+ const violations = [];
14
+ for (const target of targetFiles) {
15
+ const targetZone = this.getZoneFromPath(target);
16
+ if (this.isUpward(sourceZone, targetZone)) {
17
+ violations.push({
18
+ file: target,
19
+ target: targetZone,
20
+ message: `Conceptual Backflow: '${sourceZone}' code cannot depend on '${targetZone}' structure.`,
21
+ });
22
+ }
23
+ }
24
+ return violations;
25
+ }
26
+ static getZoneFromPath(filePath) {
27
+ const normalized = filePath.replace(/\\/g, "/");
28
+ if (normalized.includes("/domain/") || normalized.includes("/joy/"))
29
+ return "joyful";
30
+ if (normalized.includes("/infrastructure/") ||
31
+ normalized.includes("/services/"))
32
+ return "infrastructure";
33
+ if (normalized.includes("/plumbing/") || normalized.includes("/utils/"))
34
+ return "plumbing";
35
+ // Default based on common patterns if not explicit
36
+ return "joyful";
37
+ }
38
+ static isUpward(source, target) {
39
+ // Upward if target has a higher (more joyful) ranking than source
40
+ return this.ZONE_RANKINGS[target] > this.ZONE_RANKINGS[source];
41
+ }
42
+ static getRitualGratefulnessPrompt(projectName, stage) {
43
+ const messages = [
44
+ `What part of '${projectName}' brings you the most clarity today?`,
45
+ `As we ${stage} this code, what are we thanking it for?`,
46
+ `How does this change protect the joyful core of our garden?`,
47
+ ];
48
+ return messages[Math.floor(Math.random() * messages.length)];
49
+ }
50
+ }
51
+ //# sourceMappingURL=RitualService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RitualService.js","sourceRoot":"","sources":["../../../../src/monolith/domain/joy/RitualService.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,aAAa;IACxB,oEAAoE;IAC5D,MAAM,CAAU,aAAa,GAA4B;QAC/D,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,CAAC;QACjB,QAAQ,EAAE,CAAC;KACZ,CAAC;IAEF;;;OAGG;IACI,MAAM,CAAC,oBAAoB,CAChC,UAAmB,EACnB,WAAqB;QAErB,MAAM,UAAU,GAA0B,EAAE,CAAC;QAE7C,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAEhD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC1C,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,yBAAyB,UAAU,4BAA4B,UAAU,cAAc;iBACjG,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,QAAgB;QAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YACjE,OAAO,QAAQ,CAAC;QAClB,IACE,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACvC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;YAEjC,OAAO,gBAAgB,CAAC;QAC1B,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;YACrE,OAAO,UAAU,CAAC;QAEpB,mDAAmD;QACnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,MAAe,EAAE,MAAe;QACtD,kEAAkE;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAEM,MAAM,CAAC,2BAA2B,CACvC,WAAmB,EACnB,KAAa;QAEb,MAAM,QAAQ,GAAG;YACf,iBAAiB,WAAW,sCAAsC;YAClE,SAAS,KAAK,0CAA0C;YACxD,6DAA6D;SAC9D,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MarieTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarieTypes.js","sourceRoot":"","sources":["../../../../src/monolith/domain/marie/MarieTypes.ts"],"names":[],"mappings":""}