cmp-standards 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +541 -0
  2. package/dist/analytics/index.d.ts +5 -0
  3. package/dist/analytics/index.d.ts.map +1 -0
  4. package/dist/analytics/index.js +5 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics/tracker.d.ts +107 -0
  7. package/dist/analytics/tracker.d.ts.map +1 -0
  8. package/dist/analytics/tracker.js +333 -0
  9. package/dist/analytics/tracker.js.map +1 -0
  10. package/dist/auto-improve/eslint-generator.d.ts +36 -0
  11. package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
  12. package/dist/auto-improve/eslint-generator.js +280 -0
  13. package/dist/auto-improve/eslint-generator.js.map +1 -0
  14. package/dist/auto-improve/index.d.ts +6 -0
  15. package/dist/auto-improve/index.d.ts.map +1 -0
  16. package/dist/auto-improve/index.js +6 -0
  17. package/dist/auto-improve/index.js.map +1 -0
  18. package/dist/auto-improve/pattern-detector.d.ts +92 -0
  19. package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
  20. package/dist/auto-improve/pattern-detector.js +231 -0
  21. package/dist/auto-improve/pattern-detector.js.map +1 -0
  22. package/dist/cli/index.d.ts +18 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +769 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/dashboard/index.d.ts +6 -0
  27. package/dist/dashboard/index.d.ts.map +1 -0
  28. package/dist/dashboard/index.js +6 -0
  29. package/dist/dashboard/index.js.map +1 -0
  30. package/dist/dashboard/server.d.ts +15 -0
  31. package/dist/dashboard/server.d.ts.map +1 -0
  32. package/dist/dashboard/server.js +373 -0
  33. package/dist/dashboard/server.js.map +1 -0
  34. package/dist/dashboard/ui.d.ts +9 -0
  35. package/dist/dashboard/ui.d.ts.map +1 -0
  36. package/dist/dashboard/ui.js +530 -0
  37. package/dist/dashboard/ui.js.map +1 -0
  38. package/dist/db/client.d.ts +66 -0
  39. package/dist/db/client.d.ts.map +1 -0
  40. package/dist/db/client.js +159 -0
  41. package/dist/db/client.js.map +1 -0
  42. package/dist/db/drizzle-client.d.ts +302 -0
  43. package/dist/db/drizzle-client.d.ts.map +1 -0
  44. package/dist/db/drizzle-client.js +404 -0
  45. package/dist/db/drizzle-client.js.map +1 -0
  46. package/dist/db/index.d.ts +5 -0
  47. package/dist/db/index.d.ts.map +1 -0
  48. package/dist/db/index.js +5 -0
  49. package/dist/db/index.js.map +1 -0
  50. package/dist/eslint/config-builder.d.ts +45 -0
  51. package/dist/eslint/config-builder.d.ts.map +1 -0
  52. package/dist/eslint/config-builder.js +128 -0
  53. package/dist/eslint/config-builder.js.map +1 -0
  54. package/dist/eslint/index.d.ts +161 -0
  55. package/dist/eslint/index.d.ts.map +1 -0
  56. package/dist/eslint/index.js +106 -0
  57. package/dist/eslint/index.js.map +1 -0
  58. package/dist/eslint/rules/consistent-error-handling.d.ts +9 -0
  59. package/dist/eslint/rules/consistent-error-handling.d.ts.map +1 -0
  60. package/dist/eslint/rules/consistent-error-handling.js +52 -0
  61. package/dist/eslint/rules/consistent-error-handling.js.map +1 -0
  62. package/dist/eslint/rules/finance-ledger-sync.d.ts +12 -0
  63. package/dist/eslint/rules/finance-ledger-sync.d.ts.map +1 -0
  64. package/dist/eslint/rules/finance-ledger-sync.js +72 -0
  65. package/dist/eslint/rules/finance-ledger-sync.js.map +1 -0
  66. package/dist/eslint/rules/no-async-useeffect.d.ts +10 -0
  67. package/dist/eslint/rules/no-async-useeffect.d.ts.map +1 -0
  68. package/dist/eslint/rules/no-async-useeffect.js +49 -0
  69. package/dist/eslint/rules/no-async-useeffect.js.map +1 -0
  70. package/dist/eslint/rules/no-await-in-loop.d.ts +10 -0
  71. package/dist/eslint/rules/no-await-in-loop.d.ts.map +1 -0
  72. package/dist/eslint/rules/no-await-in-loop.js +51 -0
  73. package/dist/eslint/rules/no-await-in-loop.js.map +1 -0
  74. package/dist/eslint/rules/no-inline-functions-in-jsx.d.ts +10 -0
  75. package/dist/eslint/rules/no-inline-functions-in-jsx.d.ts.map +1 -0
  76. package/dist/eslint/rules/no-inline-functions-in-jsx.js +45 -0
  77. package/dist/eslint/rules/no-inline-functions-in-jsx.js.map +1 -0
  78. package/dist/eslint/rules/no-raw-sql.d.ts +19 -0
  79. package/dist/eslint/rules/no-raw-sql.d.ts.map +1 -0
  80. package/dist/eslint/rules/no-raw-sql.js +136 -0
  81. package/dist/eslint/rules/no-raw-sql.js.map +1 -0
  82. package/dist/eslint/rules/no-sequential-api-calls.d.ts +10 -0
  83. package/dist/eslint/rules/no-sequential-api-calls.d.ts.map +1 -0
  84. package/dist/eslint/rules/no-sequential-api-calls.js +72 -0
  85. package/dist/eslint/rules/no-sequential-api-calls.js.map +1 -0
  86. package/dist/eslint/rules/prefer-server-components.d.ts +10 -0
  87. package/dist/eslint/rules/prefer-server-components.d.ts.map +1 -0
  88. package/dist/eslint/rules/prefer-server-components.js +76 -0
  89. package/dist/eslint/rules/prefer-server-components.js.map +1 -0
  90. package/dist/eslint/rules/require-loading-states.d.ts +9 -0
  91. package/dist/eslint/rules/require-loading-states.d.ts.map +1 -0
  92. package/dist/eslint/rules/require-loading-states.js +85 -0
  93. package/dist/eslint/rules/require-loading-states.js.map +1 -0
  94. package/dist/eslint/rules/require-zod-validation.d.ts +10 -0
  95. package/dist/eslint/rules/require-zod-validation.d.ts.map +1 -0
  96. package/dist/eslint/rules/require-zod-validation.js +70 -0
  97. package/dist/eslint/rules/require-zod-validation.js.map +1 -0
  98. package/dist/eslint/rules/semantic-tokens-only.d.ts +10 -0
  99. package/dist/eslint/rules/semantic-tokens-only.d.ts.map +1 -0
  100. package/dist/eslint/rules/semantic-tokens-only.js +62 -0
  101. package/dist/eslint/rules/semantic-tokens-only.js.map +1 -0
  102. package/dist/feedback/collector.d.ts +74 -0
  103. package/dist/feedback/collector.d.ts.map +1 -0
  104. package/dist/feedback/collector.js +231 -0
  105. package/dist/feedback/collector.js.map +1 -0
  106. package/dist/feedback/index.d.ts +5 -0
  107. package/dist/feedback/index.d.ts.map +1 -0
  108. package/dist/feedback/index.js +5 -0
  109. package/dist/feedback/index.js.map +1 -0
  110. package/dist/hooks/index.d.ts +8 -0
  111. package/dist/hooks/index.d.ts.map +1 -0
  112. package/dist/hooks/index.js +8 -0
  113. package/dist/hooks/index.js.map +1 -0
  114. package/dist/hooks/memory-checkpoint.d.ts +43 -0
  115. package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
  116. package/dist/hooks/memory-checkpoint.js +257 -0
  117. package/dist/hooks/memory-checkpoint.js.map +1 -0
  118. package/dist/hooks/post-tool-use.d.ts +61 -0
  119. package/dist/hooks/post-tool-use.d.ts.map +1 -0
  120. package/dist/hooks/post-tool-use.js +262 -0
  121. package/dist/hooks/post-tool-use.js.map +1 -0
  122. package/dist/hooks/pre-tool-use.d.ts +34 -0
  123. package/dist/hooks/pre-tool-use.d.ts.map +1 -0
  124. package/dist/hooks/pre-tool-use.js +358 -0
  125. package/dist/hooks/pre-tool-use.js.map +1 -0
  126. package/dist/hooks/session-start.d.ts +38 -0
  127. package/dist/hooks/session-start.d.ts.map +1 -0
  128. package/dist/hooks/session-start.js +274 -0
  129. package/dist/hooks/session-start.js.map +1 -0
  130. package/dist/index.d.ts +29 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +39 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/mcp/index.d.ts +5 -0
  135. package/dist/mcp/index.d.ts.map +1 -0
  136. package/dist/mcp/index.js +5 -0
  137. package/dist/mcp/index.js.map +1 -0
  138. package/dist/mcp/server.d.ts +42 -0
  139. package/dist/mcp/server.d.ts.map +1 -0
  140. package/dist/mcp/server.js +599 -0
  141. package/dist/mcp/server.js.map +1 -0
  142. package/dist/registry/embeddings.d.ts +38 -0
  143. package/dist/registry/embeddings.d.ts.map +1 -0
  144. package/dist/registry/embeddings.js +110 -0
  145. package/dist/registry/embeddings.js.map +1 -0
  146. package/dist/registry/generator.d.ts +41 -0
  147. package/dist/registry/generator.d.ts.map +1 -0
  148. package/dist/registry/generator.js +323 -0
  149. package/dist/registry/generator.js.map +1 -0
  150. package/dist/registry/index.d.ts +6 -0
  151. package/dist/registry/index.d.ts.map +1 -0
  152. package/dist/registry/index.js +6 -0
  153. package/dist/registry/index.js.map +1 -0
  154. package/dist/services/IdeaCollector.d.ts +103 -0
  155. package/dist/services/IdeaCollector.d.ts.map +1 -0
  156. package/dist/services/IdeaCollector.js +371 -0
  157. package/dist/services/IdeaCollector.js.map +1 -0
  158. package/dist/services/ProjectScaffold.d.ts +76 -0
  159. package/dist/services/ProjectScaffold.d.ts.map +1 -0
  160. package/dist/services/ProjectScaffold.js +479 -0
  161. package/dist/services/ProjectScaffold.js.map +1 -0
  162. package/dist/services/ProjectScanner.d.ts +81 -0
  163. package/dist/services/ProjectScanner.d.ts.map +1 -0
  164. package/dist/services/ProjectScanner.js +349 -0
  165. package/dist/services/ProjectScanner.js.map +1 -0
  166. package/dist/services/TaskTracker.d.ts +89 -0
  167. package/dist/services/TaskTracker.d.ts.map +1 -0
  168. package/dist/services/TaskTracker.js +324 -0
  169. package/dist/services/TaskTracker.js.map +1 -0
  170. package/dist/services/WorkPlanManager.d.ts +107 -0
  171. package/dist/services/WorkPlanManager.d.ts.map +1 -0
  172. package/dist/services/WorkPlanManager.js +440 -0
  173. package/dist/services/WorkPlanManager.js.map +1 -0
  174. package/dist/services/auto-inject.d.ts +77 -0
  175. package/dist/services/auto-inject.d.ts.map +1 -0
  176. package/dist/services/auto-inject.js +289 -0
  177. package/dist/services/auto-inject.js.map +1 -0
  178. package/dist/services/auto-tag.d.ts +61 -0
  179. package/dist/services/auto-tag.d.ts.map +1 -0
  180. package/dist/services/auto-tag.js +203 -0
  181. package/dist/services/auto-tag.js.map +1 -0
  182. package/dist/services/cross-project-sync.d.ts +76 -0
  183. package/dist/services/cross-project-sync.d.ts.map +1 -0
  184. package/dist/services/cross-project-sync.js +235 -0
  185. package/dist/services/cross-project-sync.js.map +1 -0
  186. package/dist/services/index.d.ts +17 -0
  187. package/dist/services/index.d.ts.map +1 -0
  188. package/dist/services/index.js +23 -0
  189. package/dist/services/index.js.map +1 -0
  190. package/dist/services/memory-consolidation.d.ts +77 -0
  191. package/dist/services/memory-consolidation.d.ts.map +1 -0
  192. package/dist/services/memory-consolidation.js +298 -0
  193. package/dist/services/memory-consolidation.js.map +1 -0
  194. package/dist/services/semantic-search.d.ts +93 -0
  195. package/dist/services/semantic-search.d.ts.map +1 -0
  196. package/dist/services/semantic-search.js +278 -0
  197. package/dist/services/semantic-search.js.map +1 -0
  198. package/dist/services/weekly-digest.d.ts +105 -0
  199. package/dist/services/weekly-digest.d.ts.map +1 -0
  200. package/dist/services/weekly-digest.js +292 -0
  201. package/dist/services/weekly-digest.js.map +1 -0
  202. package/dist/types/index.d.ts +274 -0
  203. package/dist/types/index.d.ts.map +1 -0
  204. package/dist/types/index.js +84 -0
  205. package/dist/types/index.js.map +1 -0
  206. package/dist/utils/config.d.ts +21 -0
  207. package/dist/utils/config.d.ts.map +1 -0
  208. package/dist/utils/config.js +89 -0
  209. package/dist/utils/config.js.map +1 -0
  210. package/dist/utils/index.d.ts +6 -0
  211. package/dist/utils/index.d.ts.map +1 -0
  212. package/dist/utils/index.js +6 -0
  213. package/dist/utils/index.js.map +1 -0
  214. package/dist/utils/paths.d.ts +28 -0
  215. package/dist/utils/paths.d.ts.map +1 -0
  216. package/dist/utils/paths.js +80 -0
  217. package/dist/utils/paths.js.map +1 -0
  218. package/package.json +95 -0
  219. package/templates/agents/architecture-expert.md +61 -0
  220. package/templates/agents/database-expert.md +62 -0
  221. package/templates/agents/documentation-expert.md +57 -0
  222. package/templates/agents/memory-expert.md +88 -0
  223. package/templates/agents/performance-expert.md +61 -0
  224. package/templates/agents/security-expert.md +59 -0
  225. package/templates/agents/ux-expert.md +63 -0
  226. package/templates/agents/worker.md +75 -0
  227. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -0
  228. package/templates/commands/experts.md +138 -0
  229. package/templates/hooks/README.md +158 -0
  230. package/templates/hooks/project.config.json.template +77 -0
  231. package/templates/hooks/settings.local.json.template +57 -0
  232. package/templates/memory-config.json +82 -0
  233. package/templates/memory-config.schema.json +212 -0
  234. package/templates/settings.json +58 -0
  235. package/templates/workflows/business-improvement.md +264 -0
  236. package/templates/workflows/expert-review.md +153 -0
  237. package/templates/workflows/internal-app.md +245 -0
  238. package/templates/workflows/sync-docs.md +187 -0
@@ -0,0 +1,769 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CMP Memory System CLI
4
+ *
5
+ * Commands:
6
+ * init - Initialize memory system in project (intelligent setup)
7
+ * sync - Sync experts/hooks from npm package
8
+ * validate - Validate project structure
9
+ * generate - Generate embedding registry
10
+ * scan - Scan for patterns
11
+ * improve - Run auto-improvement
12
+ * status - Show memory system status
13
+ * tasks - View and manage tasks
14
+ * ideas - View captured ideas
15
+ * plan - Manage work plans
16
+ */
17
+ // Load environment variables from project root
18
+ import { config as loadEnv } from 'dotenv';
19
+ import { resolve } from 'path';
20
+ // Try to load .env from current working directory (project root)
21
+ loadEnv({ path: resolve(process.cwd(), '.env') });
22
+ // Also try plugin's own .env as fallback
23
+ loadEnv({ path: resolve(import.meta.dirname, '../../.env') });
24
+ import { Command } from 'commander';
25
+ import chalk from 'chalk';
26
+ import fs from 'fs/promises';
27
+ import path from 'path';
28
+ import { loadConfig } from '../utils/config.js';
29
+ import { getProjectRoot, getHooksDir } from '../utils/paths.js';
30
+ import { RegistryGenerator } from '../registry/generator.js';
31
+ import { PatternDetector } from '../auto-improve/pattern-detector.js';
32
+ import { ESLintGenerator } from '../auto-improve/eslint-generator.js';
33
+ const program = new Command();
34
+ program
35
+ .name('cmp-memory')
36
+ .description('CMP Memory System - Task tracking, ideas & workflow for Claude Code')
37
+ .version('1.0.0');
38
+ // =============================================================================
39
+ // INIT COMMAND (Intelligent Setup)
40
+ // =============================================================================
41
+ program
42
+ .command('init')
43
+ .description('Initialize memory system with intelligent project detection')
44
+ .option('-s, --system <system>', 'System identifier (e.g., SWARMSCALE, PANEL)')
45
+ .option('-n, --name <name>', 'Project name')
46
+ .option('-f, --force', 'Overwrite existing files')
47
+ .option('--skip-agents', 'Skip installing standard agents')
48
+ .option('--skip-hooks', 'Skip installing hooks')
49
+ .option('--skip-commands', 'Skip installing commands')
50
+ .action(async (options) => {
51
+ const projectRoot = await getProjectRoot();
52
+ // Require system identifier
53
+ if (!options.system) {
54
+ console.log(chalk.red('Error: --system is required'));
55
+ console.log(chalk.gray(' Example: cmp-memory init --system MYPROJECT'));
56
+ process.exit(1);
57
+ }
58
+ const { createProjectScaffold } = await import('../services/ProjectScaffold.js');
59
+ const scaffold = createProjectScaffold(projectRoot);
60
+ await scaffold.scaffold({
61
+ system: options.system,
62
+ projectName: options.name,
63
+ force: options.force,
64
+ skipAgents: options.skipAgents,
65
+ skipHooks: options.skipHooks,
66
+ skipCommands: options.skipCommands,
67
+ });
68
+ });
69
+ // =============================================================================
70
+ // SYNC COMMAND
71
+ // =============================================================================
72
+ program
73
+ .command('sync')
74
+ .description('Sync experts, agents, and hooks from npm package')
75
+ .option('--experts', 'Only sync expert agents')
76
+ .option('--hooks', 'Only sync hooks')
77
+ .option('--commands', 'Only sync commands')
78
+ .option('-f, --force', 'Overwrite existing files')
79
+ .action(async (options) => {
80
+ console.log(chalk.blue('🔄 Syncing from cmp-memory-system\n'));
81
+ const projectRoot = await getProjectRoot();
82
+ const { createProjectScaffold } = await import('../services/ProjectScaffold.js');
83
+ const scaffold = createProjectScaffold(projectRoot);
84
+ // Load existing config to get system
85
+ const configPath = path.join(projectRoot, '.claude/project.config.json');
86
+ let system = 'UNKNOWN';
87
+ try {
88
+ const configContent = await fs.readFile(configPath, 'utf-8');
89
+ const config = JSON.parse(configContent);
90
+ system = config.system;
91
+ }
92
+ catch {
93
+ console.log(chalk.yellow('⚠ No project.config.json found, using default'));
94
+ }
95
+ // Determine what to sync
96
+ const syncAll = !options.experts && !options.hooks && !options.commands;
97
+ await scaffold.scaffold({
98
+ system,
99
+ force: options.force,
100
+ skipAgents: !syncAll && !options.experts,
101
+ skipHooks: !syncAll && !options.hooks,
102
+ skipCommands: !syncAll && !options.commands,
103
+ });
104
+ });
105
+ // =============================================================================
106
+ // VALIDATE COMMAND
107
+ // =============================================================================
108
+ program
109
+ .command('validate')
110
+ .description('Validate project structure against standards')
111
+ .action(async () => {
112
+ console.log(chalk.blue('🔍 Validating Project Structure\n'));
113
+ const projectRoot = await getProjectRoot();
114
+ const issues = [];
115
+ const passed = [];
116
+ // Check required files
117
+ const requiredFiles = [
118
+ 'CLAUDE.md',
119
+ '.claude/settings.json',
120
+ '.claude/memory-config.json',
121
+ '.claude/project.config.json',
122
+ '.ai-skills/registry.json',
123
+ ];
124
+ for (const file of requiredFiles) {
125
+ const filePath = path.join(projectRoot, file);
126
+ try {
127
+ await fs.access(filePath);
128
+ passed.push(file);
129
+ }
130
+ catch {
131
+ issues.push(`MISSING: ${file}`);
132
+ }
133
+ }
134
+ // Check directories
135
+ const requiredDirs = [
136
+ '.claude/agents',
137
+ '.claude/commands',
138
+ '.claude/hooks',
139
+ ];
140
+ for (const dir of requiredDirs) {
141
+ const dirPath = path.join(projectRoot, dir);
142
+ try {
143
+ const stat = await fs.stat(dirPath);
144
+ if (stat.isDirectory()) {
145
+ const files = await fs.readdir(dirPath);
146
+ if (files.length > 0) {
147
+ passed.push(`${dir}/ (${files.length} files)`);
148
+ }
149
+ else {
150
+ issues.push(`EMPTY: ${dir}/`);
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ issues.push(`MISSING: ${dir}/`);
156
+ }
157
+ }
158
+ // Check experts command exists
159
+ const expertsPath = path.join(projectRoot, '.claude/commands/experts.md');
160
+ try {
161
+ await fs.access(expertsPath);
162
+ passed.push('.claude/commands/experts.md');
163
+ }
164
+ catch {
165
+ issues.push('MISSING: .claude/commands/experts.md (run: cmp-memory sync --commands)');
166
+ }
167
+ // Summary
168
+ console.log(chalk.green('✓ Passed:'));
169
+ for (const p of passed) {
170
+ console.log(chalk.green(` ${p}`));
171
+ }
172
+ if (issues.length > 0) {
173
+ console.log(chalk.red('\n✗ Issues:'));
174
+ for (const issue of issues) {
175
+ console.log(chalk.red(` ${issue}`));
176
+ }
177
+ console.log(chalk.yellow('\nRun: cmp-memory init --system YOUR_SYSTEM --force'));
178
+ }
179
+ else {
180
+ console.log(chalk.green('\n✅ All validations passed!'));
181
+ }
182
+ });
183
+ // =============================================================================
184
+ // SESSION-CONTEXT COMMAND (for hooks)
185
+ // =============================================================================
186
+ program
187
+ .command('session-context')
188
+ .description('Output session context for hooks (internal use)')
189
+ .action(async () => {
190
+ const projectRoot = await getProjectRoot();
191
+ try {
192
+ const config = await loadConfig(projectRoot);
193
+ // Load project config
194
+ const projectConfigPath = path.join(projectRoot, '.claude/project.config.json');
195
+ let projectConfig = null;
196
+ try {
197
+ const content = await fs.readFile(projectConfigPath, 'utf-8');
198
+ projectConfig = JSON.parse(content);
199
+ }
200
+ catch {
201
+ // No project config
202
+ }
203
+ const context = [];
204
+ context.push(`# Session Context - ${config.projectName}`);
205
+ context.push('');
206
+ context.push(`System: ${config.system}`);
207
+ if (projectConfig) {
208
+ context.push(`Framework: ${projectConfig.framework?.name || 'unknown'}`);
209
+ if (projectConfig.framework?.router) {
210
+ context.push(`Router: ${projectConfig.framework.router}`);
211
+ }
212
+ }
213
+ context.push('');
214
+ context.push('## Available Commands');
215
+ context.push('- /experts - AI code review panel');
216
+ context.push('- cmp-memory status - Check memory system');
217
+ context.push('- cmp-memory tasks - View active tasks');
218
+ context.push('');
219
+ // Output context (hooks read stdout)
220
+ console.log(context.join('\n'));
221
+ }
222
+ catch {
223
+ // Silently fail for hooks
224
+ }
225
+ });
226
+ // =============================================================================
227
+ // GENERATE COMMAND
228
+ // =============================================================================
229
+ program
230
+ .command('generate')
231
+ .description('Generate embedding registry from documentation')
232
+ .option('-i, --incremental', 'Only update changed files')
233
+ .option('--files <files>', 'Specific files to process (comma-separated)')
234
+ .action(async (options) => {
235
+ console.log(chalk.blue('📚 Generating Knowledge Registry\n'));
236
+ const generator = new RegistryGenerator();
237
+ if (options.files) {
238
+ const files = options.files.split(',').map((f) => f.trim());
239
+ console.log(`Processing ${files.length} specific files...`);
240
+ await generator.update(files);
241
+ }
242
+ else {
243
+ await generator.generate();
244
+ }
245
+ console.log(chalk.green('\n✅ Registry generation complete!'));
246
+ });
247
+ // =============================================================================
248
+ // SCAN COMMAND
249
+ // =============================================================================
250
+ program
251
+ .command('scan')
252
+ .description('Scan codebase for patterns')
253
+ .option('-d, --dir <directory>', 'Directory to scan', 'src')
254
+ .option('-t, --threshold <number>', 'Pattern threshold', '3')
255
+ .action(async (options) => {
256
+ console.log(chalk.blue('🔍 Scanning for Patterns\n'));
257
+ const projectRoot = await getProjectRoot();
258
+ const config = await loadConfig(projectRoot);
259
+ const detector = new PatternDetector(config);
260
+ // Find TypeScript files
261
+ const { glob } = await import('glob');
262
+ const files = await glob(`${options.dir}/**/*.{ts,tsx}`, {
263
+ cwd: projectRoot,
264
+ absolute: true,
265
+ ignore: ['**/node_modules/**', '**/*.d.ts', '**/*.test.ts'],
266
+ });
267
+ console.log(`Scanning ${files.length} files...`);
268
+ for (const file of files) {
269
+ const content = await fs.readFile(file, 'utf-8');
270
+ detector.scan(content, file);
271
+ }
272
+ const results = detector.getResults();
273
+ console.log(chalk.blue('\n📊 Results:'));
274
+ console.log(` Total patterns: ${results.total}`);
275
+ console.log(` Triggered (≥${options.threshold}): ${results.triggered.length}`);
276
+ if (results.patterns.length > 0) {
277
+ console.log(chalk.blue('\n📋 Detected Patterns:'));
278
+ for (const pattern of results.patterns) {
279
+ const icon = pattern.needsAutoImprove ? '🔴' : '⚪';
280
+ const severity = chalk.gray(`[${pattern.severity}]`);
281
+ console.log(` ${icon} ${pattern.patternId} ${severity}`);
282
+ console.log(` Count: ${pattern.count}, Files: ${pattern.files.length}`);
283
+ }
284
+ }
285
+ if (results.triggered.length > 0) {
286
+ console.log(chalk.yellow('\n⚠️ Patterns ready for auto-improvement:'));
287
+ for (const pattern of results.triggered) {
288
+ console.log(` - ${pattern.patternId} (${pattern.count} occurrences)`);
289
+ }
290
+ console.log(chalk.gray('\n Run: claude-memory improve'));
291
+ }
292
+ });
293
+ // =============================================================================
294
+ // IMPROVE COMMAND
295
+ // =============================================================================
296
+ program
297
+ .command('improve')
298
+ .description('Run auto-improvement for triggered patterns')
299
+ .option('--dry-run', 'Show what would be done without making changes')
300
+ .option('-p, --pattern <pattern>', 'Specific pattern to improve')
301
+ .action(async (options) => {
302
+ console.log(chalk.blue('🔧 Running Auto-Improvement\n'));
303
+ const projectRoot = await getProjectRoot();
304
+ const config = await loadConfig(projectRoot);
305
+ // First scan for patterns
306
+ const detector = new PatternDetector(config);
307
+ const { glob } = await import('glob');
308
+ const files = await glob('src/**/*.{ts,tsx}', {
309
+ cwd: projectRoot,
310
+ absolute: true,
311
+ ignore: ['**/node_modules/**', '**/*.d.ts'],
312
+ });
313
+ for (const file of files) {
314
+ const content = await fs.readFile(file, 'utf-8');
315
+ detector.scan(content, file);
316
+ }
317
+ const results = detector.getResults();
318
+ // Filter patterns to improve
319
+ let patternsToImprove = results.triggered;
320
+ if (options.pattern) {
321
+ patternsToImprove = patternsToImprove.filter(p => p.patternId === options.pattern);
322
+ }
323
+ if (patternsToImprove.length === 0) {
324
+ console.log(chalk.green('✅ No patterns need improvement'));
325
+ return;
326
+ }
327
+ console.log(`Found ${patternsToImprove.length} patterns to improve:`);
328
+ for (const pattern of patternsToImprove) {
329
+ console.log(` - ${pattern.patternId}`);
330
+ }
331
+ if (options.dryRun) {
332
+ console.log(chalk.yellow('\n[DRY RUN] Would generate ESLint rules for above patterns'));
333
+ return;
334
+ }
335
+ // Generate ESLint rules
336
+ const generator = new ESLintGenerator();
337
+ const improvementResults = await generator.generateAllRules(patternsToImprove);
338
+ console.log(chalk.blue('\n📋 Improvement Results:'));
339
+ for (const result of improvementResults) {
340
+ if (result.success) {
341
+ console.log(chalk.green(` ✓ ${result.action}: ${result.filePath}`));
342
+ }
343
+ else {
344
+ console.log(chalk.red(` ✗ ${result.action}: ${result.error}`));
345
+ }
346
+ }
347
+ const successCount = improvementResults.filter(r => r.success).length;
348
+ console.log(chalk.green(`\n✅ Completed: ${successCount}/${improvementResults.length} improvements`));
349
+ });
350
+ // =============================================================================
351
+ // STATUS COMMAND
352
+ // =============================================================================
353
+ program
354
+ .command('status')
355
+ .description('Show memory system status')
356
+ .action(async () => {
357
+ console.log(chalk.blue('📊 Memory System Status\n'));
358
+ const projectRoot = await getProjectRoot();
359
+ // Check config
360
+ let config;
361
+ try {
362
+ config = await loadConfig(projectRoot);
363
+ console.log(chalk.green('✓ Configuration found'));
364
+ console.log(` System: ${config.system}`);
365
+ console.log(` Project: ${config.projectName}`);
366
+ console.log(` Domains: ${config.domains.length}`);
367
+ }
368
+ catch {
369
+ console.log(chalk.red('✗ No configuration found'));
370
+ console.log(chalk.gray(' Run: claude-memory init'));
371
+ return;
372
+ }
373
+ // Check registry
374
+ const registryPath = path.join(projectRoot, '.claude/knowledge/registry.json');
375
+ try {
376
+ const registryContent = await fs.readFile(registryPath, 'utf-8');
377
+ const registry = JSON.parse(registryContent);
378
+ console.log(chalk.green('✓ Registry found'));
379
+ console.log(` Sections: ${registry.sections.length}`);
380
+ console.log(` Generated: ${registry.generatedAt || 'pending'}`);
381
+ }
382
+ catch {
383
+ console.log(chalk.yellow('⚠ No registry found'));
384
+ console.log(chalk.gray(' Run: claude-memory generate'));
385
+ }
386
+ // Check hooks
387
+ const hooksDir = getHooksDir(projectRoot);
388
+ try {
389
+ const hooks = await fs.readdir(hooksDir);
390
+ const hookFiles = hooks.filter(h => h.endsWith('.ts') || h.endsWith('.md'));
391
+ console.log(chalk.green(`✓ Hooks directory (${hookFiles.length} files)`));
392
+ }
393
+ catch {
394
+ console.log(chalk.yellow('⚠ No hooks directory'));
395
+ }
396
+ // Check settings.json
397
+ const settingsPath = path.join(projectRoot, '.claude/settings.json');
398
+ try {
399
+ const settingsContent = await fs.readFile(settingsPath, 'utf-8');
400
+ const settings = JSON.parse(settingsContent);
401
+ const hasMemoryPlugin = settings.plugins?.['metanautical-memory'];
402
+ if (hasMemoryPlugin) {
403
+ console.log(chalk.green('✓ Memory plugin configured in settings.json'));
404
+ }
405
+ else {
406
+ console.log(chalk.yellow('⚠ Memory plugin not in settings.json'));
407
+ }
408
+ }
409
+ catch {
410
+ console.log(chalk.yellow('⚠ No settings.json found'));
411
+ }
412
+ // Features status
413
+ console.log(chalk.blue('\n🔧 Features:'));
414
+ console.log(` Guards: ${config.guards.enabled ? 'Enabled' : 'Disabled'} (${config.guards.rules.length} rules)`);
415
+ console.log(` Embedding: ${config.embedding.enabled ? 'Enabled' : 'Disabled'}`);
416
+ console.log(` Checkpoint: ${config.checkpoint.enabled ? 'Enabled' : 'Disabled'}`);
417
+ console.log(` Auto-improve: ${config.autoImprovement.enabled ? 'Enabled' : 'Disabled'} (threshold: ${config.autoImprovement.violationThreshold})`);
418
+ });
419
+ // =============================================================================
420
+ // DASHBOARD COMMAND
421
+ // =============================================================================
422
+ program
423
+ .command('dashboard')
424
+ .description('Start the memory dashboard web UI')
425
+ .option('-p, --port <port>', 'Port to run on', '3847')
426
+ .option('--no-open', 'Do not open browser automatically')
427
+ .action(async (options) => {
428
+ console.log(chalk.blue('🖥️ Starting Memory Dashboard\n'));
429
+ const { startDashboard } = await import('../dashboard/server.js');
430
+ await startDashboard({
431
+ port: parseInt(options.port, 10),
432
+ openBrowser: options.open !== false,
433
+ });
434
+ });
435
+ // =============================================================================
436
+ // MCP COMMAND
437
+ // =============================================================================
438
+ program
439
+ .command('mcp')
440
+ .description('Start the MCP server for Claude integration')
441
+ .action(async () => {
442
+ console.log(chalk.blue('🔌 Starting MCP Server\n'));
443
+ const { startMCPServer } = await import('../mcp/server.js');
444
+ await startMCPServer();
445
+ });
446
+ // =============================================================================
447
+ // ANALYTICS COMMAND
448
+ // =============================================================================
449
+ program
450
+ .command('analytics')
451
+ .description('Show analytics and system health')
452
+ .option('-p, --period <period>', 'Time period (day, week, month)', 'week')
453
+ .option('--json', 'Output as JSON')
454
+ .action(async (options) => {
455
+ console.log(chalk.blue('📈 Memory System Analytics\n'));
456
+ const projectRoot = await getProjectRoot();
457
+ const config = await loadConfig(projectRoot);
458
+ const { createAnalyticsTracker } = await import('../analytics/tracker.js');
459
+ const tracker = createAnalyticsTracker(config.system);
460
+ const report = await tracker.generateReport();
461
+ if (options.json) {
462
+ console.log(JSON.stringify(report, null, 2));
463
+ return;
464
+ }
465
+ // System Health
466
+ const healthColor = {
467
+ healthy: chalk.green,
468
+ degraded: chalk.yellow,
469
+ critical: chalk.red,
470
+ }[report.health.status];
471
+ console.log(chalk.blue('🏥 System Health:'));
472
+ console.log(` Status: ${healthColor(report.health.status.toUpperCase())}`);
473
+ console.log(` Total Memories: ${report.health.metrics.totalMemories}`);
474
+ console.log(` Active Patterns: ${report.health.metrics.activePatterns}`);
475
+ console.log(` Triggered Patterns: ${report.health.metrics.triggeredPatterns}`);
476
+ console.log(` Recent Sessions (24h): ${report.health.metrics.recentSessions}`);
477
+ console.log(` Feedback Rate: ${(report.health.metrics.feedbackRate * 100).toFixed(1)}%`);
478
+ console.log(` Avg Memory Age: ${report.health.metrics.avgMemoryAge} days`);
479
+ if (report.health.issues.length > 0) {
480
+ console.log(chalk.yellow('\n⚠️ Issues:'));
481
+ for (const issue of report.health.issues) {
482
+ console.log(` - ${issue}`);
483
+ }
484
+ }
485
+ if (report.health.recommendations.length > 0) {
486
+ console.log(chalk.blue('\n💡 Recommendations:'));
487
+ for (const rec of report.health.recommendations) {
488
+ console.log(` - ${rec}`);
489
+ }
490
+ }
491
+ // Usage Stats
492
+ console.log(chalk.blue(`\n📊 Usage (${report.usage.period}):`));
493
+ console.log(` Sessions: ${report.usage.sessions}`);
494
+ console.log(` Memories Created: ${report.usage.memoriesCreated}`);
495
+ console.log(` Memories Accessed: ${report.usage.memoriesAccessed}`);
496
+ console.log(` Searches: ${report.usage.searchesPerformed}`);
497
+ console.log(` Patterns Detected: ${report.usage.patternsDetected}`);
498
+ console.log(` Feedback Given: ${report.usage.feedbackGiven}`);
499
+ // Memory Insights
500
+ if (report.memoryInsights.mostAccessedMemories.length > 0) {
501
+ console.log(chalk.blue('\n🔝 Most Accessed Memories:'));
502
+ for (const m of report.memoryInsights.mostAccessedMemories.slice(0, 5)) {
503
+ console.log(` ${m.accessCount}x - ${m.title}`);
504
+ }
505
+ }
506
+ // Domain Distribution
507
+ const domains = Object.entries(report.memoryInsights.domainDistribution);
508
+ if (domains.length > 0) {
509
+ console.log(chalk.blue('\n📁 Domain Distribution:'));
510
+ for (const [domain, count] of domains.sort((a, b) => b[1] - a[1]).slice(0, 5)) {
511
+ console.log(` ${domain}: ${count}`);
512
+ }
513
+ }
514
+ // Pattern Insights
515
+ if (report.patternInsights.autoImprovementCandidates.length > 0) {
516
+ console.log(chalk.yellow('\n🔧 Auto-Improvement Candidates:'));
517
+ for (const p of report.patternInsights.autoImprovementCandidates) {
518
+ console.log(` ${p.patternId}: ${p.occurrences}x in ${p.files} files`);
519
+ }
520
+ }
521
+ console.log(chalk.gray(`\nGenerated at: ${report.generatedAt}`));
522
+ });
523
+ // =============================================================================
524
+ // FEEDBACK COMMAND
525
+ // =============================================================================
526
+ program
527
+ .command('feedback')
528
+ .description('View feedback statistics')
529
+ .action(async () => {
530
+ console.log(chalk.blue('💬 Feedback Statistics\n'));
531
+ const projectRoot = await getProjectRoot();
532
+ const config = await loadConfig(projectRoot);
533
+ const { createFeedbackCollector } = await import('../feedback/collector.js');
534
+ const collector = createFeedbackCollector(config.system);
535
+ const stats = await collector.getStats();
536
+ console.log(`Total Feedback: ${stats.totalFeedback}`);
537
+ console.log(`Helpful: ${stats.helpfulCount} (${(stats.helpfulRate * 100).toFixed(1)}%)`);
538
+ console.log(`Not Helpful: ${stats.notHelpfulCount}`);
539
+ if (stats.topHelpfulMemories.length > 0) {
540
+ console.log(chalk.green('\n👍 Top Helpful Memories:'));
541
+ for (const m of stats.topHelpfulMemories) {
542
+ console.log(` ${m.helpfulCount}x - ${m.title}`);
543
+ }
544
+ }
545
+ if (stats.topUnhelpfulMemories.length > 0) {
546
+ console.log(chalk.yellow('\n👎 Needs Improvement:'));
547
+ for (const m of stats.topUnhelpfulMemories) {
548
+ console.log(` ${m.unhelpfulCount}x - ${m.title}`);
549
+ }
550
+ }
551
+ // Get deprecation suggestions
552
+ const deprecations = await collector.getSuggestedDeprecations();
553
+ if (deprecations.length > 0) {
554
+ console.log(chalk.red(`\n🗑️ Suggested Deprecations: ${deprecations.length} memories`));
555
+ }
556
+ });
557
+ // =============================================================================
558
+ // TASKS COMMAND
559
+ // =============================================================================
560
+ program
561
+ .command('tasks')
562
+ .description('View and manage tasks')
563
+ .option('-a, --all', 'Show all tasks including completed')
564
+ .option('-l, --limit <number>', 'Limit number of tasks', '10')
565
+ .action(async (options) => {
566
+ console.log(chalk.blue('📋 Tasks\n'));
567
+ const projectRoot = await getProjectRoot();
568
+ const config = await loadConfig(projectRoot);
569
+ const { getTaskTracker } = await import('../services/TaskTracker.js');
570
+ const tracker = getTaskTracker(config.system);
571
+ // Get current task
572
+ const currentTask = await tracker.getCurrentTask();
573
+ if (currentTask) {
574
+ const content = currentTask.content;
575
+ console.log(chalk.green('▶ Current Task:'));
576
+ console.log(` ${content.title}`);
577
+ console.log(` Status: ${content.status}`);
578
+ if (content.filesModified?.length) {
579
+ console.log(` Files: ${content.filesModified.length} modified`);
580
+ }
581
+ console.log('');
582
+ }
583
+ // Get recent tasks
584
+ const tasks = await tracker.getRecentTasks(parseInt(options.limit, 10));
585
+ if (tasks.length > 0) {
586
+ console.log(chalk.blue('📜 Recent Tasks:'));
587
+ for (const task of tasks) {
588
+ const content = task.content;
589
+ const icon = content.status === 'completed' ? '✓' : content.status === 'in_progress' ? '→' : '○';
590
+ console.log(` ${icon} ${content.title} [${content.status}]`);
591
+ }
592
+ }
593
+ else {
594
+ console.log(chalk.gray('No tasks found'));
595
+ }
596
+ });
597
+ // =============================================================================
598
+ // IDEAS COMMAND
599
+ // =============================================================================
600
+ program
601
+ .command('ideas')
602
+ .description('View captured ideas')
603
+ .option('-c, --category <category>', 'Filter by category')
604
+ .option('-p, --priority <priority>', 'Filter by priority')
605
+ .option('-l, --limit <number>', 'Limit number of ideas', '20')
606
+ .action(async (options) => {
607
+ console.log(chalk.blue('💡 Ideas\n'));
608
+ const projectRoot = await getProjectRoot();
609
+ const config = await loadConfig(projectRoot);
610
+ const { getIdeaCollector } = await import('../services/IdeaCollector.js');
611
+ const collector = getIdeaCollector(config.system);
612
+ const stats = await collector.getIdeaStats();
613
+ // Summary
614
+ console.log(`Total Ideas: ${stats.totalIdeas}`);
615
+ console.log(`By Category: ${Object.entries(stats.byCategory).map(([k, v]) => `${k}(${v})`).join(', ')}`);
616
+ console.log(`By Priority: ${Object.entries(stats.byPriority).map(([k, v]) => `${k}(${v})`).join(', ')}`);
617
+ console.log('');
618
+ // List ideas
619
+ const ideas = await collector.getAllIdeas({
620
+ category: options.category,
621
+ priority: options.priority,
622
+ limit: parseInt(options.limit, 10),
623
+ });
624
+ if (ideas.length > 0) {
625
+ console.log(chalk.blue('📝 Ideas:'));
626
+ for (const idea of ideas) {
627
+ const priorityIcon = idea.priority === 'high' ? '🔴' : idea.priority === 'medium' ? '🟡' : '🟢';
628
+ console.log(` ${priorityIcon} [${idea.category}] ${idea.title}`);
629
+ if (idea.relatedFiles?.length) {
630
+ console.log(chalk.gray(` Files: ${idea.relatedFiles.slice(0, 2).join(', ')}`));
631
+ }
632
+ }
633
+ }
634
+ else {
635
+ console.log(chalk.gray('No ideas found'));
636
+ }
637
+ });
638
+ // =============================================================================
639
+ // IMPROVEMENTS COMMAND
640
+ // =============================================================================
641
+ program
642
+ .command('improvements')
643
+ .description('View suggested improvements')
644
+ .option('-t, --type <type>', 'Filter by type')
645
+ .option('-e, --effort <effort>', 'Filter by effort')
646
+ .option('-l, --limit <number>', 'Limit number', '20')
647
+ .action(async (options) => {
648
+ console.log(chalk.blue('🔧 Improvements\n'));
649
+ const projectRoot = await getProjectRoot();
650
+ const config = await loadConfig(projectRoot);
651
+ const { getIdeaCollector } = await import('../services/IdeaCollector.js');
652
+ const collector = getIdeaCollector(config.system);
653
+ const stats = await collector.getImprovementStats();
654
+ // Summary
655
+ console.log(`Total Improvements: ${stats.totalImprovements}`);
656
+ console.log(`By Type: ${Object.entries(stats.byType).map(([k, v]) => `${k}(${v})`).join(', ')}`);
657
+ console.log(`By Effort: ${Object.entries(stats.byEffort).map(([k, v]) => `${k}(${v})`).join(', ')}`);
658
+ console.log('');
659
+ // List improvements
660
+ const improvements = await collector.getAllImprovements({
661
+ type: options.type,
662
+ effort: options.effort,
663
+ limit: parseInt(options.limit, 10),
664
+ });
665
+ if (improvements.length > 0) {
666
+ console.log(chalk.blue('📋 Improvements:'));
667
+ for (const imp of improvements) {
668
+ const effortIcon = imp.effort === 'small' ? '🟢' : imp.effort === 'medium' ? '🟡' : '🔴';
669
+ console.log(` ${effortIcon} [${imp.type}] ${imp.title}`);
670
+ }
671
+ }
672
+ else {
673
+ console.log(chalk.gray('No improvements found'));
674
+ }
675
+ });
676
+ // =============================================================================
677
+ // PLAN COMMAND
678
+ // =============================================================================
679
+ program
680
+ .command('plan')
681
+ .description('Manage work plans')
682
+ .option('-s, --status', 'Show current plan status')
683
+ .option('-c, --complete', 'Complete current task')
684
+ .option('-n, --next', 'Move to next task')
685
+ .option('-h, --history', 'Show plan history')
686
+ .action(async (options) => {
687
+ const projectRoot = await getProjectRoot();
688
+ const config = await loadConfig(projectRoot);
689
+ const { getWorkPlanManager } = await import('../services/WorkPlanManager.js');
690
+ const manager = getWorkPlanManager(config.system);
691
+ if (options.complete) {
692
+ console.log(chalk.blue('Completing current task...'));
693
+ await manager.completeCurrentTask();
694
+ console.log(chalk.green('✓ Task completed'));
695
+ return;
696
+ }
697
+ if (options.history) {
698
+ console.log(chalk.blue('📜 Plan History\n'));
699
+ const history = await manager.getPlanHistory();
700
+ for (const plan of history) {
701
+ const statusIcon = plan.status === 'completed' ? '✓' : plan.status === 'active' ? '→' : '○';
702
+ console.log(` ${statusIcon} ${plan.title} (${plan.progress}%)`);
703
+ }
704
+ return;
705
+ }
706
+ // Default: show status
707
+ console.log(chalk.blue('📋 Work Plan Status\n'));
708
+ const summary = await manager.getPlanSummary();
709
+ if (!summary) {
710
+ console.log(chalk.yellow('No active work plan'));
711
+ console.log(chalk.gray('Create a plan by starting a new task session'));
712
+ return;
713
+ }
714
+ console.log(chalk.green(`Plan: ${summary.title}`));
715
+ console.log(`Progress: ${summary.progress}%`);
716
+ console.log(`Tasks: ${summary.completedTasks}/${summary.totalTasks} completed`);
717
+ if (summary.currentTask) {
718
+ console.log(chalk.blue(`\nCurrent Task: ${summary.currentTask.title}`));
719
+ }
720
+ const tasks = await manager.getPlanTasks();
721
+ console.log(chalk.blue('\nAll Tasks:'));
722
+ for (const task of tasks) {
723
+ const icon = task.status === 'completed' ? '✓' : task.isCurrent ? '→' : '○';
724
+ console.log(` ${icon} ${task.title} [${task.status}]`);
725
+ }
726
+ });
727
+ // =============================================================================
728
+ // CAPTURE COMMAND (quick idea/improvement capture)
729
+ // =============================================================================
730
+ program
731
+ .command('capture <text>')
732
+ .description('Quick capture an idea or improvement')
733
+ .option('-t, --task <taskId>', 'Associate with task')
734
+ .action(async (text, options) => {
735
+ const projectRoot = await getProjectRoot();
736
+ const config = await loadConfig(projectRoot);
737
+ const { getIdeaCollector } = await import('../services/IdeaCollector.js');
738
+ const collector = getIdeaCollector(config.system);
739
+ const result = await collector.quickCapture(text, {
740
+ taskId: options.task,
741
+ });
742
+ if (result.ideaId) {
743
+ console.log(chalk.green(`✓ Captured as idea: ${result.ideaId}`));
744
+ }
745
+ if (result.improvementId) {
746
+ console.log(chalk.green(`✓ Captured as improvement: ${result.improvementId}`));
747
+ }
748
+ });
749
+ // =============================================================================
750
+ // EXPORT COMMAND
751
+ // =============================================================================
752
+ program
753
+ .command('export')
754
+ .description('Export ideas and improvements as markdown')
755
+ .option('-o, --output <file>', 'Output file', 'IDEAS_AND_IMPROVEMENTS.md')
756
+ .action(async (options) => {
757
+ const projectRoot = await getProjectRoot();
758
+ const config = await loadConfig(projectRoot);
759
+ const { getIdeaCollector } = await import('../services/IdeaCollector.js');
760
+ const collector = getIdeaCollector(config.system);
761
+ const markdown = await collector.exportMarkdown();
762
+ await fs.writeFile(path.join(projectRoot, options.output), markdown);
763
+ console.log(chalk.green(`✓ Exported to ${options.output}`));
764
+ });
765
+ // =============================================================================
766
+ // MAIN
767
+ // =============================================================================
768
+ program.parse();
769
+ //# sourceMappingURL=index.js.map