anchi-kit 1.1.2 โ†’ 1.1.3

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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # ๐Ÿ’Ž Anchi Kit v1.1.2
1
+ # ๐Ÿ’Ž Anchi Kit v1.1.3
2
2
 
3
3
  > **Hแป‡ ฤiแปu Hร nh Tฦฐ Duy cho AI Code Editor (Cursor, Gemini, Windsurf)**
4
4
  > _Biแบฟn AI tแปซ ngฦฐแปi thแปฃ code (Coder) thร nh Kแปน sฦฐ trฦฐแปŸng (Senior Tech Lead)._
package/docs/ROADMAP.md CHANGED
@@ -104,7 +104,8 @@ Official release of Anchi Kit v1.0.0 vแป›i Dynamic Orchestration v2.0.
104
104
  | v1.0.0 | โœ… Released | 22 commands, 21 agents, 55 skills, Dynamic Orchestration v2.0 |
105
105
  | v1.1.0 | โœ… Released | Team Support, Hive Mind (Git Sync) |
106
106
  | v1.1.1 | โœ… Released | Secure Install, IDE Auto-Detect, Policy Assurance |
107
- | v1.1.2 | โœ… Released | Fix: npm register conflict resolution (Hotfix) |
107
+ | v1.1.2 | โœ… Released | Fix: npm register conflict resolution |
108
+ | v1.1.3 | โœ… Released | Fix: Missing source files in package |
108
109
  | v1.2+ | ๐Ÿ”ฎ Future | Voice commands, VS Code extension, Multi-repo |
109
110
 
110
111
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anchi-kit",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "The Ultimate AI-Native Toolkit for Cursor & Gemini. Installs into any existing project. Includes commands, agents, skills, and architecture presets.",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
@@ -37,6 +37,7 @@
37
37
  "files": [
38
38
  "dist/",
39
39
  "bin/",
40
+ "src/",
40
41
  "scripts/",
41
42
  ".cursor/",
42
43
  ".antigravity/",
@@ -0,0 +1,149 @@
1
+ // =============================================================================
2
+ // anchi-kit Analytics CLI Command
3
+ // Usage statistics and insights
4
+ // =============================================================================
5
+
6
+ const {
7
+ getProjectAnalytics,
8
+ getGlobalAnalytics,
9
+ generateAnalyticsReport
10
+ } = require('../lib/analytics');
11
+ const fs = require('fs');
12
+
13
+ async function analytics(action = 'show', arg = null) {
14
+ const targetDir = process.cwd();
15
+
16
+ console.log('');
17
+ console.log('๐Ÿ“Š anchi-kit Analytics');
18
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
19
+ console.log('');
20
+
21
+ switch (action) {
22
+ case 'show':
23
+ case undefined:
24
+ showProjectAnalytics(targetDir);
25
+ break;
26
+
27
+ case 'global':
28
+ showGlobalAnalytics();
29
+ break;
30
+
31
+ case 'report':
32
+ generateReport(targetDir, arg);
33
+ break;
34
+
35
+ default:
36
+ showHelp();
37
+ break;
38
+ }
39
+
40
+ console.log('');
41
+ }
42
+
43
+ function showProjectAnalytics(targetDir) {
44
+ const analytics = getProjectAnalytics(targetDir);
45
+
46
+ console.log('๐Ÿ“ This Project:\n');
47
+
48
+ console.log('๐Ÿ“Š Summary:');
49
+ console.log(` Commands executed: ${analytics.summary.total_commands}`);
50
+ console.log(` Success rate: ${analytics.summary.success_rate}%`);
51
+ console.log(` Avg duration: ${analytics.summary.avg_duration_ms}ms`);
52
+ console.log(` Active days: ${analytics.summary.active_days}`);
53
+ console.log('');
54
+
55
+ console.log('๐Ÿง  Memory:');
56
+ console.log(` Decisions: ${analytics.summary.decisions_made}`);
57
+ console.log(` Notes: ${analytics.summary.notes_saved}`);
58
+ console.log(` Entities: ${analytics.summary.entities_tracked}`);
59
+ console.log('');
60
+
61
+ if (analytics.command_usage.length > 0) {
62
+ console.log('๐Ÿ”ฅ Top Commands:');
63
+ analytics.command_usage.slice(0, 5).forEach(({ command, count }) => {
64
+ const bar = 'โ–ˆ'.repeat(Math.min(Math.round(count / 2), 20));
65
+ console.log(` ${command.padEnd(12)} ${bar} ${count}`);
66
+ });
67
+ console.log('');
68
+ }
69
+
70
+ if (analytics.daily_activity.length > 0) {
71
+ console.log('๐Ÿ“… Recent Activity:');
72
+ analytics.daily_activity.slice(-7).forEach(({ date, count }) => {
73
+ const bar = 'โ–ˆ'.repeat(Math.min(count, 20));
74
+ console.log(` ${date} ${bar} ${count}`);
75
+ });
76
+ console.log('');
77
+ }
78
+
79
+ if (analytics.recent_errors.length > 0) {
80
+ console.log('โŒ Recent Errors:');
81
+ analytics.recent_errors.forEach(err => {
82
+ console.log(` โ€ข ${err.command}`);
83
+ console.log(` ${err.error || 'Unknown error'}`);
84
+ });
85
+ }
86
+ }
87
+
88
+ function showGlobalAnalytics() {
89
+ const analytics = getGlobalAnalytics();
90
+
91
+ console.log('๐ŸŒ Global Analytics:\n');
92
+
93
+ console.log('๐Ÿ“Š Summary:');
94
+ console.log(` Total projects: ${analytics.summary.total_projects}`);
95
+ console.log(` Learned patterns: ${analytics.summary.total_patterns}`);
96
+ console.log(` Tech combinations: ${analytics.summary.tech_combinations}`);
97
+ console.log('');
98
+
99
+ if (analytics.tech_popularity.length > 0) {
100
+ console.log('๐Ÿ”ฅ Popular Technologies:');
101
+ analytics.tech_popularity.slice(0, 10).forEach(({ tech, count, percentage }) => {
102
+ const bar = 'โ–ˆ'.repeat(Math.min(count * 2, 20));
103
+ console.log(` ${tech.padEnd(15)} ${bar} ${count} (${percentage}%)`);
104
+ });
105
+ console.log('');
106
+ }
107
+
108
+ if (analytics.pattern_frequency.length > 0) {
109
+ console.log('๐Ÿ”ฎ Common Patterns:');
110
+ analytics.pattern_frequency.slice(0, 5).forEach(p => {
111
+ console.log(` โ€ข ${p.name} (${p.occurrences} uses in ${p.projects} projects)`);
112
+ });
113
+ console.log('');
114
+ }
115
+
116
+ if (analytics.recent_projects.length > 0) {
117
+ console.log('๐Ÿ“ Recent Projects:');
118
+ analytics.recent_projects.forEach(p => {
119
+ console.log(` โ€ข ${p.name}`);
120
+ if (p.tech_stack && p.tech_stack.length > 0) {
121
+ console.log(` ${p.tech_stack.slice(0, 5).join(', ')}`);
122
+ }
123
+ });
124
+ }
125
+ }
126
+
127
+ function generateReport(targetDir, outputPath) {
128
+ const { report } = generateAnalyticsReport(targetDir);
129
+
130
+ if (outputPath) {
131
+ fs.writeFileSync(outputPath, report);
132
+ console.log(`โœ… Report saved to: ${outputPath}`);
133
+ } else {
134
+ console.log(report);
135
+ }
136
+ }
137
+
138
+ function showHelp() {
139
+ console.log('Usage:');
140
+ console.log('');
141
+ console.log(' ๐Ÿ“Š View:');
142
+ console.log(' analytics Show this project analytics');
143
+ console.log(' analytics global Show global analytics');
144
+ console.log('');
145
+ console.log(' ๐Ÿ“„ Export:');
146
+ console.log(' analytics report [file] Generate markdown report');
147
+ }
148
+
149
+ module.exports = { analytics };
@@ -0,0 +1,86 @@
1
+ // =============================================================================
2
+ // anchi-kit Analyze Command
3
+ // Access Knowledge Graph functionality
4
+ // =============================================================================
5
+
6
+ const path = require('path');
7
+ const { KnowledgeGraph } = require('../lib/knowledgeGraph');
8
+ const { buildIndex, saveIndex } = require('../lib/codebaseIndexer');
9
+
10
+ async function analyze(action, target) {
11
+ const targetDir = process.cwd();
12
+ const graph = new KnowledgeGraph(targetDir);
13
+
14
+ console.log('');
15
+ console.log('๐Ÿง  anchi-kit Knowledge Graph (Memory v3)');
16
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
17
+ console.log('');
18
+
19
+ if (action === 'build' || action === 'index') {
20
+ console.log('๐Ÿ—๏ธ Building Knowledge Graph...');
21
+
22
+ // 1. Update index first
23
+ const index = buildIndex(targetDir);
24
+ saveIndex(targetDir, index);
25
+
26
+ // 2. Build graph
27
+ graph.buildFromIndex();
28
+
29
+ console.log(`โœ… Graph built: ${graph.nodes.size} nodes, ${graph.edges.length} edges.`);
30
+ return;
31
+ }
32
+
33
+ // Attempt to load existing graph
34
+ if (!graph.load()) {
35
+ console.log('โš ๏ธ Graph not found. Building now...');
36
+ const index = buildIndex(targetDir);
37
+ saveIndex(targetDir, index);
38
+ graph.buildFromIndex();
39
+ }
40
+
41
+ if (action === 'impact') {
42
+ if (!target) {
43
+ console.log('Usage: analyze impact <file_path>');
44
+ return;
45
+ }
46
+
47
+ console.log(`๐Ÿ” Analyzing impact of changing: ${target}`);
48
+
49
+ // Normalize path sep
50
+ const normalizedTarget = target.replace(/\\/g, '/');
51
+
52
+ // Find best match if exact not found
53
+ let searchTarget = normalizedTarget;
54
+ if (!graph.nodes.has(searchTarget)) {
55
+ // Try matching suffix
56
+ for (const id of graph.nodes.keys()) {
57
+ if (id.endsWith(normalizedTarget)) {
58
+ searchTarget = id;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+
64
+ if (!graph.nodes.has(searchTarget)) {
65
+ console.log(`โŒ File not found in graph: ${target}`);
66
+ return;
67
+ }
68
+
69
+ const impacted = graph.findImpact(searchTarget);
70
+
71
+ if (impacted.length === 0) {
72
+ console.log('โœ… Safe to change: No files depend on this.');
73
+ } else {
74
+ console.log(`โš ๏ธ ${impacted.length} files will be affected:\n`);
75
+ impacted.forEach(f => console.log(` ๐Ÿ”ธ ${f}`));
76
+ }
77
+ } else {
78
+ console.log('Usage:');
79
+ console.log(' npx anchi-kit analyze build Rebuild graph');
80
+ console.log(' npx anchi-kit analyze impact <file> Check dependencies');
81
+ }
82
+
83
+ console.log('');
84
+ }
85
+
86
+ module.exports = { analyze };
@@ -0,0 +1,251 @@
1
+ // =============================================================================
2
+ // anchi-kit Audit CLI Command
3
+ // =============================================================================
4
+
5
+ const {
6
+ getAuditLogs,
7
+ getAuditDates,
8
+ getAuditSummary,
9
+ cleanupOldLogs
10
+ } = require('../lib/auditLogger');
11
+ const { getFileHistory } = require('../lib/fileChangeTracker');
12
+
13
+ async function audit(action = 'show', arg = null) {
14
+ const targetDir = process.cwd();
15
+
16
+ console.log('');
17
+ console.log('๐Ÿ“‹ anchi-kit Audit Log');
18
+ console.log('โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•');
19
+ console.log('');
20
+
21
+ switch (action) {
22
+ case 'show':
23
+ case undefined:
24
+ showAuditLogs(targetDir, arg);
25
+ break;
26
+
27
+ case 'summary':
28
+ showAuditSummary(targetDir, arg);
29
+ break;
30
+
31
+ case 'dates':
32
+ showAuditDates(targetDir);
33
+ break;
34
+
35
+ case 'cleanup':
36
+ cleanupAuditLogs(targetDir, arg);
37
+ break;
38
+
39
+ case 'file':
40
+ showFileHistory(targetDir, arg);
41
+ break;
42
+
43
+ default:
44
+ showHelp();
45
+ break;
46
+ }
47
+
48
+ console.log('');
49
+ }
50
+
51
+ function showAuditLogs(targetDir, options) {
52
+ // Parse options
53
+ const opts = parseOptions(options);
54
+
55
+ const logs = getAuditLogs(targetDir, {
56
+ date: opts.date,
57
+ limit: opts.last || 10,
58
+ command: opts.command,
59
+ status: opts.status
60
+ });
61
+
62
+ if (logs.length === 0) {
63
+ console.log(' No audit logs found.');
64
+ if (opts.date) {
65
+ console.log(` Hint: Try with different date or check .ai-audit/ directory`);
66
+ }
67
+ return;
68
+ }
69
+
70
+ console.log(`๐Ÿ“Š Showing ${logs.length} entries:\n`);
71
+
72
+ logs.forEach((log, idx) => {
73
+ const time = new Date(log.timestamp).toLocaleTimeString();
74
+ const status = log.status === 'success' ? 'โœ…' : 'โŒ';
75
+
76
+ console.log(`${idx + 1}. [${time}] ${status} ${log.command}`);
77
+
78
+ if (log.duration_ms) {
79
+ console.log(` Duration: ${log.duration_ms}ms`);
80
+ }
81
+
82
+ if (log.agents && log.agents.length > 0) {
83
+ console.log(` Agents: ${log.agents.join(', ')}`);
84
+ }
85
+
86
+ if (log.skills && log.skills.length > 0) {
87
+ console.log(` Skills: ${log.skills.join(', ')}`);
88
+ }
89
+
90
+ if (log.error) {
91
+ console.log(` Error: ${log.error}`);
92
+ }
93
+
94
+ console.log('');
95
+ });
96
+
97
+ console.log(`โœ… Total: ${logs.length} entries`);
98
+ }
99
+
100
+ function showAuditSummary(targetDir, date) {
101
+ const summary = getAuditSummary(targetDir, date);
102
+
103
+ const dateStr = date || 'today';
104
+ console.log(`๐Ÿ“Š Summary for ${dateStr}:\n`);
105
+
106
+ console.log(` Total commands: ${summary.total}`);
107
+ console.log(` Success: ${summary.success} โœ…`);
108
+ console.log(` Errors: ${summary.error} โŒ`);
109
+
110
+ if (summary.avgDuration > 0) {
111
+ console.log(` Avg duration: ${summary.avgDuration}ms`);
112
+ }
113
+
114
+ if (Object.keys(summary.commands).length > 0) {
115
+ console.log('\n Commands executed:');
116
+ Object.entries(summary.commands)
117
+ .sort((a, b) => b[1] - a[1])
118
+ .forEach(([cmd, count]) => {
119
+ console.log(` โ€ข ${cmd}: ${count}`);
120
+ });
121
+ }
122
+ }
123
+
124
+ function showAuditDates(targetDir) {
125
+ const dates = getAuditDates(targetDir);
126
+
127
+ if (dates.length === 0) {
128
+ console.log(' No audit logs found.');
129
+ return;
130
+ }
131
+
132
+ console.log(`๐Ÿ“… Available audit dates:\n`);
133
+
134
+ dates.forEach(date => {
135
+ const logs = getAuditLogs(targetDir, { date, limit: 1000 });
136
+ console.log(` โ€ข ${date} (${logs.length} entries)`);
137
+ });
138
+
139
+ console.log(`\nโœ… Total: ${dates.length} days`);
140
+ }
141
+
142
+ function cleanupAuditLogs(targetDir, daysStr) {
143
+ const days = parseInt(daysStr) || 30;
144
+
145
+ console.log(`๐Ÿงน Cleaning up logs older than ${days} days...\n`);
146
+
147
+ const deleted = cleanupOldLogs(targetDir, days);
148
+
149
+ if (deleted > 0) {
150
+ console.log(`โœ… Deleted ${deleted} old log file(s)`);
151
+ } else {
152
+ console.log(' No old logs to clean up.');
153
+ }
154
+ }
155
+
156
+ function showFileHistory(targetDir, filePath) {
157
+ if (!filePath) {
158
+ console.log('Usage: npx anchi-kit audit file <path>');
159
+ console.log('Example: npx anchi-kit audit file src/lib/auth.ts');
160
+ return;
161
+ }
162
+
163
+ const history = getFileHistory(targetDir, filePath);
164
+
165
+ if (history.length === 0) {
166
+ console.log(` No history found for: ${filePath}`);
167
+ console.log(' Hint: File changes are tracked when using /do command');
168
+ return;
169
+ }
170
+
171
+ console.log(`๐Ÿ“„ File History: ${filePath}\n`);
172
+
173
+ history.forEach((change, idx) => {
174
+ const date = new Date(change.timestamp).toLocaleDateString();
175
+ const time = new Date(change.timestamp).toLocaleTimeString();
176
+ const type = {
177
+ 'created': 'โœจ Created',
178
+ 'modified': '๐Ÿ“ Modified',
179
+ 'deleted': '๐Ÿ—‘๏ธ Deleted'
180
+ }[change.change_type] || change.change_type;
181
+
182
+ console.log(`${idx + 1}. [${date} ${time}] ${type}`);
183
+
184
+ if (change.audit_id) {
185
+ console.log(` Audit ID: ${change.audit_id}`);
186
+ }
187
+
188
+ if (change.decision_id) {
189
+ console.log(` Decision ID: ${change.decision_id}`);
190
+ }
191
+
192
+ if (change.diff_summary) {
193
+ console.log(` Changes: ${change.diff_summary}`);
194
+ }
195
+
196
+ console.log('');
197
+ });
198
+
199
+ console.log(`โœ… Total: ${history.length} change(s)`);
200
+ }
201
+
202
+ function parseOptions(optionsStr) {
203
+ const opts = {};
204
+
205
+ if (!optionsStr) return opts;
206
+
207
+ const parts = optionsStr.split(' ');
208
+
209
+ for (let i = 0; i < parts.length; i++) {
210
+ const part = parts[i];
211
+
212
+ if (part === '--last' && parts[i + 1]) {
213
+ opts.last = parseInt(parts[i + 1]);
214
+ i++;
215
+ } else if (part === '--date' && parts[i + 1]) {
216
+ opts.date = parts[i + 1];
217
+ i++;
218
+ } else if (part === '--command' && parts[i + 1]) {
219
+ opts.command = parts[i + 1];
220
+ i++;
221
+ } else if (part === '--status' && parts[i + 1]) {
222
+ opts.status = parts[i + 1];
223
+ i++;
224
+ }
225
+ }
226
+
227
+ return opts;
228
+ }
229
+
230
+ function showHelp() {
231
+ console.log('Usage:');
232
+ console.log('');
233
+ console.log(' ๐Ÿ“Š View Logs:');
234
+ console.log(' audit Show recent logs');
235
+ console.log(' audit --last 5 Show last 5 entries');
236
+ console.log(' audit --date 2025-12-26 Show logs for date');
237
+ console.log(' audit --command "/do" Filter by command');
238
+ console.log(' audit --status error Show only errors');
239
+ console.log('');
240
+ console.log(' ๐Ÿ“ˆ Statistics:');
241
+ console.log(' audit summary Show summary stats');
242
+ console.log(' audit dates List available dates');
243
+ console.log('');
244
+ console.log(' ๐Ÿ“„ File History:');
245
+ console.log(' audit file <path> Show file change history');
246
+ console.log('');
247
+ console.log(' ๐Ÿงน Maintenance:');
248
+ console.log(' audit cleanup 30 Delete logs older than 30 days');
249
+ }
250
+
251
+ module.exports = { audit };
@@ -0,0 +1,142 @@
1
+ // =============================================================================
2
+ // anchi-kit Brain Command (Unified Intelligence Hub)
3
+ // Consolidates Memory, Learning, and Audit capabilities
4
+ // =============================================================================
5
+
6
+ const { memory } = require('./memory');
7
+ const { learn } = require('./learn');
8
+ const { audit } = require('./audit');
9
+ const { patterns } = require('./patterns');
10
+ const { analyze } = require('./analyze');
11
+
12
+ const { loadMemory } = require('../lib/memoryManager');
13
+ const { loadGlobalMemory } = require('../lib/multiProjectLearning');
14
+ const { getAuditSummary } = require('../lib/auditLogger');
15
+ const { loadIndex } = require('../lib/codebaseIndexer');
16
+
17
+ // Colors
18
+ const colors = {
19
+ reset: '\x1b[0m',
20
+ cyan: '\x1b[36m',
21
+ green: '\x1b[32m',
22
+ yellow: '\x1b[33m',
23
+ gray: '\x1b[90m',
24
+ bold: '\x1b[1m',
25
+ };
26
+
27
+ async function brain(subCommand, arg1, arg2) {
28
+ const targetDir = process.cwd();
29
+
30
+ // 1. Dispatch Logic
31
+ switch (subCommand) {
32
+ case 'memory':
33
+ // Delegate to memory command
34
+ await memory(arg1, arg2);
35
+ break;
36
+
37
+ case 'learn':
38
+ // Delegate to learn command
39
+ await learn(arg1, arg2);
40
+ break;
41
+
42
+ case 'audit':
43
+ // Delegate to audit command
44
+ await audit(arg1, arg2);
45
+ break;
46
+
47
+ case 'patterns':
48
+ // Specialized learning
49
+ await patterns(arg1, arg2);
50
+ break;
51
+
52
+ case 'analyze':
53
+ // Impact analysis
54
+ await analyze(arg1, arg2);
55
+ break;
56
+
57
+ case 'status':
58
+ case undefined: // Default: Show Dashboard
59
+ showBrainStatus(targetDir);
60
+ break;
61
+
62
+ default:
63
+ console.log(`โŒ Unknown brain area: ${subCommand}`);
64
+ showBrainHelp();
65
+ break;
66
+ }
67
+ }
68
+
69
+ function showBrainStatus(targetDir) {
70
+ console.log('');
71
+ console.log(`${colors.cyan}${colors.bold}๐Ÿง  anchi-kit Brain Status${colors.reset}`);
72
+ console.log(`${colors.gray}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${colors.reset}`);
73
+ console.log('');
74
+
75
+ // 1. Memory Status (Context)
76
+ const mem = loadMemory(targetDir);
77
+ const hasProjectName = !!mem.project.name;
78
+ const memStatus = hasProjectName ? `${colors.green}Active${colors.reset}` : `${colors.gray}Empty${colors.reset}`;
79
+
80
+ console.log(`๐Ÿ“š ${colors.bold}Memory Context${colors.reset} [${memStatus}]`);
81
+ console.log(` โ€ข Decisions: ${mem.decisions.length}`);
82
+ console.log(` โ€ข Notes: ${mem.notes.length}`);
83
+ console.log(` โ€ข Entities: ${Object.keys(mem.entities).length}`);
84
+ if (mem.session.last_accessed) {
85
+ console.log(` โ€ข Last active: ${new Date(mem.session.last_accessed).toLocaleTimeString()}`);
86
+ }
87
+ console.log('');
88
+
89
+ // 2. Learning Status (Skill)
90
+ const globalMem = loadGlobalMemory();
91
+ const learnedPatterns = globalMem.learned_patterns.length;
92
+ const totalProjects = globalMem.projects.length;
93
+
94
+ console.log(`๐ŸŽ“ ${colors.bold}Global Learning${colors.reset}`);
95
+ console.log(` โ€ข Projects registered: ${totalProjects}`);
96
+ console.log(` โ€ข Patterns mastered: ${learnedPatterns}`);
97
+ console.log('');
98
+
99
+ // 3. Codebase Index (Perception)
100
+ const index = loadIndex(targetDir);
101
+ const indexStatus = index ? `${colors.green}Indexed${colors.reset}` : `${colors.yellow}Needs Scan${colors.reset}`;
102
+
103
+ console.log(`๐Ÿ‘๏ธ ${colors.bold}Code Perception${colors.reset} [${indexStatus}]`);
104
+ if (index) {
105
+ console.log(` โ€ข Files known: ${index.totalFiles}`);
106
+ console.log(` โ€ข Last scan: ${new Date(index.indexedAt).toLocaleTimeString()}`);
107
+ } else {
108
+ console.log(` โ€ข Hint: Run 'npx anchi-kit patterns scan'`);
109
+ }
110
+ console.log('');
111
+
112
+ // 4. Audit Health (Conscience)
113
+ const auditSummary = getAuditSummary(targetDir); // Defaults to today
114
+ const successRate = auditSummary.total > 0
115
+ ? Math.round((auditSummary.success / auditSummary.total) * 100)
116
+ : 100;
117
+ const healthColor = successRate >= 90 ? colors.green : successRate >= 70 ? colors.yellow : colors.red;
118
+
119
+ console.log(`๐Ÿ›ก๏ธ ${colors.bold}Health & Audit${colors.reset} (Today)`);
120
+ console.log(` โ€ข Commands: ${auditSummary.total}`);
121
+ console.log(` โ€ข Success: ${healthColor}${successRate}%${colors.reset}`);
122
+ if (auditSummary.error > 0) {
123
+ console.log(` โ€ข Errors: ${colors.red}${auditSummary.error}${colors.reset}`);
124
+ }
125
+ console.log('');
126
+
127
+ console.log(`${colors.gray}Use 'npx anchi-kit brain help' for commands${colors.reset}`);
128
+ console.log('');
129
+ }
130
+
131
+ function showBrainHelp() {
132
+ console.log('Usage: npx anchi-kit brain <area> [action]');
133
+ console.log('');
134
+ console.log('Areas:');
135
+ console.log(' memory Context & Decisions (add, show, search)');
136
+ console.log(' learn Cross-project Intelligence (register, suggest)');
137
+ console.log(' audit Logs & History (show, summary)');
138
+ console.log(' status Show this dashboard (default)');
139
+ console.log('');
140
+ }
141
+
142
+ module.exports = { brain };