faf-cli 2.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.
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1249 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ai-analyze.d.ts +18 -0
- package/dist/commands/ai-analyze.d.ts.map +1 -0
- package/dist/commands/ai-analyze.js +226 -0
- package/dist/commands/ai-analyze.js.map +1 -0
- package/dist/commands/ai-enhance.d.ts +17 -0
- package/dist/commands/ai-enhance.d.ts.map +1 -0
- package/dist/commands/ai-enhance.js +278 -0
- package/dist/commands/ai-enhance.js.map +1 -0
- package/dist/commands/audit.d.ts +11 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +180 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auto.d.ts +27 -0
- package/dist/commands/auto.d.ts.map +1 -0
- package/dist/commands/auto.js +106 -0
- package/dist/commands/auto.js.map +1 -0
- package/dist/commands/bi-sync.d.ts +43 -0
- package/dist/commands/bi-sync.d.ts.map +1 -0
- package/dist/commands/bi-sync.js +224 -0
- package/dist/commands/bi-sync.js.map +1 -0
- package/dist/commands/chat.d.ts +6 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +227 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/check.d.ts +15 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +58 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/clear.d.ts +15 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +167 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/commit.d.ts +8 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +164 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/convert.d.ts +19 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +102 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/credit.d.ts +13 -0
- package/dist/commands/credit.d.ts.map +1 -0
- package/dist/commands/credit.js +149 -0
- package/dist/commands/credit.js.map +1 -0
- package/dist/commands/edit-helper.d.ts +6 -0
- package/dist/commands/edit-helper.d.ts.map +1 -0
- package/dist/commands/edit-helper.js +55 -0
- package/dist/commands/edit-helper.js.map +1 -0
- package/dist/commands/edit.d.ts +14 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +196 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/faf-auth.d.ts +10 -0
- package/dist/commands/faf-auth.d.ts.map +1 -0
- package/dist/commands/faf-auth.js +162 -0
- package/dist/commands/faf-auth.js.map +1 -0
- package/dist/commands/faf-dna.d.ts +9 -0
- package/dist/commands/faf-dna.d.ts.map +1 -0
- package/dist/commands/faf-dna.js +141 -0
- package/dist/commands/faf-dna.js.map +1 -0
- package/dist/commands/faf-log.d.ts +9 -0
- package/dist/commands/faf-log.d.ts.map +1 -0
- package/dist/commands/faf-log.js +135 -0
- package/dist/commands/faf-log.js.map +1 -0
- package/dist/commands/faf-recover.d.ts +3 -0
- package/dist/commands/faf-recover.d.ts.map +1 -0
- package/dist/commands/faf-recover.js +299 -0
- package/dist/commands/faf-recover.js.map +1 -0
- package/dist/commands/faf-update.d.ts +9 -0
- package/dist/commands/faf-update.d.ts.map +1 -0
- package/dist/commands/faf-update.js +68 -0
- package/dist/commands/faf-update.js.map +1 -0
- package/dist/commands/faq.d.ts +12 -0
- package/dist/commands/faq.d.ts.map +1 -0
- package/dist/commands/faq.js +84 -0
- package/dist/commands/faq.js.map +1 -0
- package/dist/commands/flow.d.ts +11 -0
- package/dist/commands/flow.d.ts.map +1 -0
- package/dist/commands/flow.js +117 -0
- package/dist/commands/flow.js.map +1 -0
- package/dist/commands/formats.d.ts +12 -0
- package/dist/commands/formats.d.ts.map +1 -0
- package/dist/commands/formats.js +109 -0
- package/dist/commands/formats.js.map +1 -0
- package/dist/commands/index.d.ts +14 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +443 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +202 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +11 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +269 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/mirror.d.ts +7 -0
- package/dist/commands/mirror.d.ts.map +1 -0
- package/dist/commands/mirror.js +130 -0
- package/dist/commands/mirror.js.map +1 -0
- package/dist/commands/score.d.ts +11 -0
- package/dist/commands/score.d.ts.map +1 -0
- package/dist/commands/score.js +192 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/search.d.ts +16 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +174 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/share.d.ts +17 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +260 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/show.d.ts +10 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +167 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/stacks.d.ts +51 -0
- package/dist/commands/stacks.d.ts.map +1 -0
- package/dist/commands/stacks.js +180 -0
- package/dist/commands/stacks.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +158 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +11 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +300 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/todo.d.ts +14 -0
- package/dist/commands/todo.d.ts.map +1 -0
- package/dist/commands/todo.js +279 -0
- package/dist/commands/todo.js.map +1 -0
- package/dist/commands/trust.d.ts +33 -0
- package/dist/commands/trust.d.ts.map +1 -0
- package/dist/commands/trust.js +316 -0
- package/dist/commands/trust.js.map +1 -0
- package/dist/commands/validate.d.ts +11 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +100 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/verify.d.ts +36 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +194 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/version.d.ts +5 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +33 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/vibe.d.ts +7 -0
- package/dist/commands/vibe.d.ts.map +1 -0
- package/dist/commands/vibe.js +78 -0
- package/dist/commands/vibe.js.map +1 -0
- package/dist/converters/faf-converters.d.ts +43 -0
- package/dist/converters/faf-converters.d.ts.map +1 -0
- package/dist/converters/faf-converters.js +186 -0
- package/dist/converters/faf-converters.js.map +1 -0
- package/dist/engine-bridge.d.ts +35 -0
- package/dist/engine-bridge.d.ts.map +1 -0
- package/dist/engine-bridge.js +76 -0
- package/dist/engine-bridge.js.map +1 -0
- package/dist/engines/claude-todo-engine.d.ts +115 -0
- package/dist/engines/claude-todo-engine.d.ts.map +1 -0
- package/dist/engines/claude-todo-engine.js +346 -0
- package/dist/engines/claude-todo-engine.js.map +1 -0
- package/dist/engines/drop-coach.d.ts +64 -0
- package/dist/engines/drop-coach.d.ts.map +1 -0
- package/dist/engines/drop-coach.js +222 -0
- package/dist/engines/drop-coach.js.map +1 -0
- package/dist/engines/fab-formats-processor.d.ts +167 -0
- package/dist/engines/fab-formats-processor.d.ts.map +1 -0
- package/dist/engines/fab-formats-processor.js +1274 -0
- package/dist/engines/fab-formats-processor.js.map +1 -0
- package/dist/engines/faf-dna.d.ts +160 -0
- package/dist/engines/faf-dna.d.ts.map +1 -0
- package/dist/engines/faf-dna.js +522 -0
- package/dist/engines/faf-dna.js.map +1 -0
- package/dist/engines/relentless-context-extractor.d.ts +101 -0
- package/dist/engines/relentless-context-extractor.d.ts.map +1 -0
- package/dist/engines/relentless-context-extractor.js +625 -0
- package/dist/engines/relentless-context-extractor.js.map +1 -0
- package/dist/fix-once/colors.d.ts +83 -0
- package/dist/fix-once/colors.d.ts.map +1 -0
- package/dist/fix-once/colors.js +145 -0
- package/dist/fix-once/colors.js.map +1 -0
- package/dist/fix-once/types.d.ts +258 -0
- package/dist/fix-once/types.d.ts.map +1 -0
- package/dist/fix-once/types.js +26 -0
- package/dist/fix-once/types.js.map +1 -0
- package/dist/framework-detector.d.ts +286 -0
- package/dist/framework-detector.d.ts.map +1 -0
- package/dist/framework-detector.js +782 -0
- package/dist/framework-detector.js.map +1 -0
- package/dist/generators/faf-generator-championship.d.ts +11 -0
- package/dist/generators/faf-generator-championship.d.ts.map +1 -0
- package/dist/generators/faf-generator-championship.js +371 -0
- package/dist/generators/faf-generator-championship.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/output/experience-manager.d.ts +58 -0
- package/dist/output/experience-manager.d.ts.map +1 -0
- package/dist/output/experience-manager.js +212 -0
- package/dist/output/experience-manager.js.map +1 -0
- package/dist/schema/faf-schema.d.ts +92 -0
- package/dist/schema/faf-schema.d.ts.map +1 -0
- package/dist/schema/faf-schema.js +173 -0
- package/dist/schema/faf-schema.js.map +1 -0
- package/dist/scoring/championship-scorer.d.ts +114 -0
- package/dist/scoring/championship-scorer.d.ts.map +1 -0
- package/dist/scoring/championship-scorer.js +380 -0
- package/dist/scoring/championship-scorer.js.map +1 -0
- package/dist/scoring/score-calculator.d.ts +29 -0
- package/dist/scoring/score-calculator.d.ts.map +1 -0
- package/dist/scoring/score-calculator.js +520 -0
- package/dist/scoring/score-calculator.js.map +1 -0
- package/dist/telemetry/analytics.d.ts +74 -0
- package/dist/telemetry/analytics.d.ts.map +1 -0
- package/dist/telemetry/analytics.js +370 -0
- package/dist/telemetry/analytics.js.map +1 -0
- package/dist/utils/balance-visualizer.d.ts +38 -0
- package/dist/utils/balance-visualizer.d.ts.map +1 -0
- package/dist/utils/balance-visualizer.js +196 -0
- package/dist/utils/balance-visualizer.js.map +1 -0
- package/dist/utils/championship-style.d.ts +110 -0
- package/dist/utils/championship-style.d.ts.map +1 -0
- package/dist/utils/championship-style.js +213 -0
- package/dist/utils/championship-style.js.map +1 -0
- package/dist/utils/color-utils.d.ts +17 -0
- package/dist/utils/color-utils.d.ts.map +1 -0
- package/dist/utils/color-utils.js +96 -0
- package/dist/utils/color-utils.js.map +1 -0
- package/dist/utils/fab-formats-engine.d.ts +76 -0
- package/dist/utils/fab-formats-engine.d.ts.map +1 -0
- package/dist/utils/fab-formats-engine.js +424 -0
- package/dist/utils/fab-formats-engine.js.map +1 -0
- package/dist/utils/fafignore-parser.d.ts +21 -0
- package/dist/utils/fafignore-parser.d.ts.map +1 -0
- package/dist/utils/fafignore-parser.js +178 -0
- package/dist/utils/fafignore-parser.js.map +1 -0
- package/dist/utils/file-utils.d.ts +65 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +598 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/platform-detector.d.ts +31 -0
- package/dist/utils/platform-detector.d.ts.map +1 -0
- package/dist/utils/platform-detector.js +218 -0
- package/dist/utils/platform-detector.js.map +1 -0
- package/dist/utils/technical-credit.d.ts +36 -0
- package/dist/utils/technical-credit.d.ts.map +1 -0
- package/dist/utils/technical-credit.js +286 -0
- package/dist/utils/technical-credit.js.map +1 -0
- package/dist/utils/trust-cache.d.ts +29 -0
- package/dist/utils/trust-cache.d.ts.map +1 -0
- package/dist/utils/trust-cache.js +123 -0
- package/dist/utils/trust-cache.js.map +1 -0
- package/dist/utils/turbo-cat-knowledge.d.ts +82 -0
- package/dist/utils/turbo-cat-knowledge.d.ts.map +1 -0
- package/dist/utils/turbo-cat-knowledge.js +1346 -0
- package/dist/utils/turbo-cat-knowledge.js.map +1 -0
- package/dist/utils/turbo-cat-pyramid.d.ts +38 -0
- package/dist/utils/turbo-cat-pyramid.d.ts.map +1 -0
- package/dist/utils/turbo-cat-pyramid.js +287 -0
- package/dist/utils/turbo-cat-pyramid.js.map +1 -0
- package/dist/utils/turbo-cat.d.ts +92 -0
- package/dist/utils/turbo-cat.d.ts.map +1 -0
- package/dist/utils/turbo-cat.js +412 -0
- package/dist/utils/turbo-cat.js.map +1 -0
- package/dist/utils/vibe-sync.d.ts +25 -0
- package/dist/utils/vibe-sync.d.ts.map +1 -0
- package/dist/utils/vibe-sync.js +169 -0
- package/dist/utils/vibe-sync.js.map +1 -0
- package/dist/utils/yaml-generator.d.ts +39 -0
- package/dist/utils/yaml-generator.d.ts.map +1 -0
- package/dist/utils/yaml-generator.js +345 -0
- package/dist/utils/yaml-generator.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 📊 FAF CLI Analytics & Telemetry System
|
|
4
|
+
* F1-inspired performance monitoring and user analytics
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.analytics = exports.FafAnalytics = void 0;
|
|
41
|
+
exports.trackCommand = trackCommand;
|
|
42
|
+
exports.trackError = trackError;
|
|
43
|
+
exports.trackPerformance = trackPerformance;
|
|
44
|
+
exports.trackFeatureUsage = trackFeatureUsage;
|
|
45
|
+
exports.withPerformanceTracking = withPerformanceTracking;
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const fs = __importStar(require("fs/promises"));
|
|
49
|
+
const championship_style_1 = require("../utils/championship-style");
|
|
50
|
+
// Telemetry configuration
|
|
51
|
+
const TELEMETRY_ENABLED = process.env.FAF_TELEMETRY !== 'false';
|
|
52
|
+
const TELEMETRY_ENDPOINT = 'https://telemetry.faf.one/v1/events';
|
|
53
|
+
const SESSION_ID = generateSessionId();
|
|
54
|
+
/**
|
|
55
|
+
* Core Analytics Engine
|
|
56
|
+
*/
|
|
57
|
+
class FafAnalytics {
|
|
58
|
+
static instance;
|
|
59
|
+
events = [];
|
|
60
|
+
statsPath;
|
|
61
|
+
constructor() {
|
|
62
|
+
this.statsPath = path.join(os.homedir(), '.faf', 'usage-stats.json');
|
|
63
|
+
}
|
|
64
|
+
static getInstance() {
|
|
65
|
+
if (!FafAnalytics.instance) {
|
|
66
|
+
FafAnalytics.instance = new FafAnalytics();
|
|
67
|
+
}
|
|
68
|
+
return FafAnalytics.instance;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Track command execution
|
|
72
|
+
*/
|
|
73
|
+
async trackCommand(command, args, duration, success) {
|
|
74
|
+
if (!TELEMETRY_ENABLED) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const event = {
|
|
78
|
+
event: 'command_executed',
|
|
79
|
+
timestamp: new Date().toISOString(),
|
|
80
|
+
sessionId: SESSION_ID,
|
|
81
|
+
version: await this.getVersion(),
|
|
82
|
+
platform: this.getPlatformInfo(),
|
|
83
|
+
properties: {
|
|
84
|
+
command,
|
|
85
|
+
args: args.filter(arg => !arg.includes('key') && !arg.includes('token')), // Security: filter sensitive args
|
|
86
|
+
success,
|
|
87
|
+
projectType: await this.detectProjectType()
|
|
88
|
+
},
|
|
89
|
+
performance: {
|
|
90
|
+
duration,
|
|
91
|
+
memory: process.memoryUsage(),
|
|
92
|
+
cpu: this.getCpuInfo()
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
await this.recordEvent(event);
|
|
96
|
+
await this.updateUsageStats(command, duration, success);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Track errors with context
|
|
100
|
+
*/
|
|
101
|
+
async trackError(error, command, args) {
|
|
102
|
+
if (!TELEMETRY_ENABLED) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const event = {
|
|
106
|
+
event: 'error_occurred',
|
|
107
|
+
timestamp: new Date().toISOString(),
|
|
108
|
+
sessionId: SESSION_ID,
|
|
109
|
+
version: await this.getVersion(),
|
|
110
|
+
platform: this.getPlatformInfo(),
|
|
111
|
+
properties: {
|
|
112
|
+
command,
|
|
113
|
+
projectType: await this.detectProjectType()
|
|
114
|
+
},
|
|
115
|
+
error: {
|
|
116
|
+
name: error.name,
|
|
117
|
+
message: error.message,
|
|
118
|
+
stack: error.stack,
|
|
119
|
+
command,
|
|
120
|
+
args: args?.filter(arg => !arg.includes('key') && !arg.includes('token'))
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
await this.recordEvent(event);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Track performance milestones
|
|
127
|
+
*/
|
|
128
|
+
async trackPerformance(milestone, duration, metadata) {
|
|
129
|
+
if (!TELEMETRY_ENABLED) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const event = {
|
|
133
|
+
event: 'performance_milestone',
|
|
134
|
+
timestamp: new Date().toISOString(),
|
|
135
|
+
sessionId: SESSION_ID,
|
|
136
|
+
version: await this.getVersion(),
|
|
137
|
+
platform: this.getPlatformInfo(),
|
|
138
|
+
properties: {
|
|
139
|
+
milestone,
|
|
140
|
+
...metadata
|
|
141
|
+
},
|
|
142
|
+
performance: {
|
|
143
|
+
duration,
|
|
144
|
+
memory: process.memoryUsage()
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
await this.recordEvent(event);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Track feature usage
|
|
151
|
+
*/
|
|
152
|
+
async trackFeatureUsage(feature, context) {
|
|
153
|
+
if (!TELEMETRY_ENABLED) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const event = {
|
|
157
|
+
event: 'feature_used',
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
sessionId: SESSION_ID,
|
|
160
|
+
version: await this.getVersion(),
|
|
161
|
+
platform: this.getPlatformInfo(),
|
|
162
|
+
properties: {
|
|
163
|
+
feature,
|
|
164
|
+
...context
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
await this.recordEvent(event);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get usage statistics
|
|
171
|
+
*/
|
|
172
|
+
async getUsageStats() {
|
|
173
|
+
try {
|
|
174
|
+
const content = await fs.readFile(this.statsPath, 'utf-8');
|
|
175
|
+
return JSON.parse(content);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return {
|
|
179
|
+
totalCommands: 0,
|
|
180
|
+
favoriteCommands: {},
|
|
181
|
+
averageExecutionTime: 0,
|
|
182
|
+
errorRate: 0,
|
|
183
|
+
lastUsed: new Date().toISOString(),
|
|
184
|
+
projectTypes: {}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Display championship-style analytics summary
|
|
190
|
+
*/
|
|
191
|
+
async showAnalyticsSummary() {
|
|
192
|
+
const stats = await this.getUsageStats();
|
|
193
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('📊 FAF CLI Analytics Summary')}`);
|
|
194
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─')} Total commands: ${championship_style_1.FAF_COLORS.fafGreen(stats.totalCommands.toString())}`);
|
|
195
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─')} Average execution: ${championship_style_1.FAF_COLORS.fafGreen(stats.averageExecutionTime.toFixed(0))}ms`);
|
|
196
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─')} Error rate: ${this.formatErrorRate(stats.errorRate)}`);
|
|
197
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('└─')} Last used: ${championship_style_1.FAF_COLORS.fafGreen(new Date(stats.lastUsed).toLocaleDateString())}`);
|
|
198
|
+
if (Object.keys(stats.favoriteCommands).length > 0) {
|
|
199
|
+
console.log();
|
|
200
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('🏆 Top Commands:')}`);
|
|
201
|
+
const topCommands = Object.entries(stats.favoriteCommands)
|
|
202
|
+
.sort(([, a], [, b]) => b - a)
|
|
203
|
+
.slice(0, 3);
|
|
204
|
+
topCommands.forEach(([command, count], index) => {
|
|
205
|
+
const medal = ['🥇', '🥈', '🥉'][index];
|
|
206
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan(' ')}${medal} ${command}: ${count} times`);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Privacy controls
|
|
212
|
+
*/
|
|
213
|
+
async disableTelemetry() {
|
|
214
|
+
process.env.FAF_TELEMETRY = 'false';
|
|
215
|
+
console.log(`${championship_style_1.FAF_COLORS.fafGreen('☑️')} Telemetry disabled. Analytics collection stopped.`);
|
|
216
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('💡')} Re-enable with: ${championship_style_1.FAF_COLORS.fafOrange('export FAF_TELEMETRY=true')}`);
|
|
217
|
+
}
|
|
218
|
+
async enableTelemetry() {
|
|
219
|
+
process.env.FAF_TELEMETRY = 'true';
|
|
220
|
+
console.log(`${championship_style_1.FAF_COLORS.fafGreen('☑️')} Telemetry enabled. Helping improve FAF for everyone!`);
|
|
221
|
+
console.log(`${championship_style_1.FAF_COLORS.fafCyan('🔒')} All data is anonymized and secure.`);
|
|
222
|
+
}
|
|
223
|
+
// =====================================
|
|
224
|
+
// PRIVATE METHODS
|
|
225
|
+
// =====================================
|
|
226
|
+
async recordEvent(event) {
|
|
227
|
+
this.events.push(event);
|
|
228
|
+
// Batch send events (or queue for later if offline)
|
|
229
|
+
if (this.events.length >= 10) {
|
|
230
|
+
await this.flushEvents();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async flushEvents() {
|
|
234
|
+
if (this.events.length === 0) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
// In production, this would send to telemetry endpoint
|
|
239
|
+
// For now, we'll just clear the events
|
|
240
|
+
this.events = [];
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Silent fail - telemetry should never break the CLI
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async updateUsageStats(command, duration, success) {
|
|
247
|
+
const stats = await this.getUsageStats();
|
|
248
|
+
stats.totalCommands++;
|
|
249
|
+
stats.favoriteCommands[command] = (stats.favoriteCommands[command] || 0) + 1;
|
|
250
|
+
stats.averageExecutionTime = (stats.averageExecutionTime * (stats.totalCommands - 1) + duration) / stats.totalCommands;
|
|
251
|
+
stats.lastUsed = new Date().toISOString();
|
|
252
|
+
if (!success) {
|
|
253
|
+
stats.errorRate = (stats.errorRate * (stats.totalCommands - 1) + 1) / stats.totalCommands;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
stats.errorRate = (stats.errorRate * (stats.totalCommands - 1)) / stats.totalCommands;
|
|
257
|
+
}
|
|
258
|
+
const projectType = await this.detectProjectType();
|
|
259
|
+
if (projectType) {
|
|
260
|
+
stats.projectTypes[projectType] = (stats.projectTypes[projectType] || 0) + 1;
|
|
261
|
+
}
|
|
262
|
+
await this.saveUsageStats(stats);
|
|
263
|
+
}
|
|
264
|
+
async saveUsageStats(stats) {
|
|
265
|
+
try {
|
|
266
|
+
await fs.mkdir(path.dirname(this.statsPath), { recursive: true });
|
|
267
|
+
await fs.writeFile(this.statsPath, JSON.stringify(stats, null, 2));
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Silent fail
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async getVersion() {
|
|
274
|
+
try {
|
|
275
|
+
const packagePath = path.join(__dirname, '../../package.json');
|
|
276
|
+
const content = await fs.readFile(packagePath, 'utf-8');
|
|
277
|
+
const pkg = JSON.parse(content);
|
|
278
|
+
return pkg.version;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return 'unknown';
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
getPlatformInfo() {
|
|
285
|
+
return `${os.platform()}-${os.arch()}-node${process.version}`;
|
|
286
|
+
}
|
|
287
|
+
getCpuInfo() {
|
|
288
|
+
const cpus = os.cpus();
|
|
289
|
+
return {
|
|
290
|
+
model: cpus[0]?.model || 'unknown',
|
|
291
|
+
speed: cpus[0]?.speed || 0,
|
|
292
|
+
cores: cpus.length
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
async detectProjectType() {
|
|
296
|
+
try {
|
|
297
|
+
const cwd = process.cwd();
|
|
298
|
+
const files = await fs.readdir(cwd);
|
|
299
|
+
if (files.includes('package.json')) {
|
|
300
|
+
return 'nodejs';
|
|
301
|
+
}
|
|
302
|
+
if (files.includes('requirements.txt') || files.includes('pyproject.toml')) {
|
|
303
|
+
return 'python';
|
|
304
|
+
}
|
|
305
|
+
if (files.includes('Cargo.toml')) {
|
|
306
|
+
return 'rust';
|
|
307
|
+
}
|
|
308
|
+
if (files.includes('go.mod')) {
|
|
309
|
+
return 'golang';
|
|
310
|
+
}
|
|
311
|
+
if (files.includes('pom.xml') || files.includes('build.gradle')) {
|
|
312
|
+
return 'java';
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
formatErrorRate(rate) {
|
|
321
|
+
const percentage = (rate * 100).toFixed(1);
|
|
322
|
+
const color = rate < 0.05 ? championship_style_1.FAF_COLORS.fafGreen :
|
|
323
|
+
rate < 0.15 ? championship_style_1.FAF_COLORS.fafOrange : championship_style_1.FAF_COLORS.fafOrange;
|
|
324
|
+
return color(`${percentage}%`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
exports.FafAnalytics = FafAnalytics;
|
|
328
|
+
/**
|
|
329
|
+
* Convenience functions for analytics tracking
|
|
330
|
+
*/
|
|
331
|
+
exports.analytics = FafAnalytics.getInstance();
|
|
332
|
+
function trackCommand(command, args, duration, success) {
|
|
333
|
+
return exports.analytics.trackCommand(command, args, duration, success);
|
|
334
|
+
}
|
|
335
|
+
function trackError(error, command, args) {
|
|
336
|
+
return exports.analytics.trackError(error, command, args);
|
|
337
|
+
}
|
|
338
|
+
function trackPerformance(milestone, duration, metadata) {
|
|
339
|
+
return exports.analytics.trackPerformance(milestone, duration, metadata);
|
|
340
|
+
}
|
|
341
|
+
function trackFeatureUsage(feature, context) {
|
|
342
|
+
return exports.analytics.trackFeatureUsage(feature, context);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Utility functions
|
|
346
|
+
*/
|
|
347
|
+
function generateSessionId() {
|
|
348
|
+
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Performance monitoring decorator
|
|
352
|
+
*/
|
|
353
|
+
function withPerformanceTracking(fn, name) {
|
|
354
|
+
return (async (...args) => {
|
|
355
|
+
const start = Date.now();
|
|
356
|
+
try {
|
|
357
|
+
const result = await fn(...args);
|
|
358
|
+
const duration = Date.now() - start;
|
|
359
|
+
await trackPerformance(name, duration, { success: true });
|
|
360
|
+
return result;
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
const duration = Date.now() - start;
|
|
364
|
+
await trackPerformance(name, duration, { success: false });
|
|
365
|
+
await trackError(error, name);
|
|
366
|
+
throw error;
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/telemetry/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🎯 AI|HUMAN Balance Visualizer
|
|
3
|
+
* Visual-only gamification that drives +144% human context completion
|
|
4
|
+
* The 50/50 eternal truth: AI detects tech (50%), humans provide meaning (50%)
|
|
5
|
+
*/
|
|
6
|
+
export interface BalanceData {
|
|
7
|
+
aiPercentage: number;
|
|
8
|
+
humanPercentage: number;
|
|
9
|
+
isBalanced: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class BalanceVisualizer {
|
|
12
|
+
private static readonly BAR_WIDTH;
|
|
13
|
+
private static readonly CYAN;
|
|
14
|
+
private static readonly ORANGE;
|
|
15
|
+
private static readonly GREEN;
|
|
16
|
+
/**
|
|
17
|
+
* Calculate balance from FAF data
|
|
18
|
+
* Matches fafdev.tools calculation - INDEPENDENT percentages
|
|
19
|
+
* AI: How complete is technical context (0-100%)
|
|
20
|
+
* HUMAN: How complete is human context (0-100%)
|
|
21
|
+
* Perfect balance when both are high and similar
|
|
22
|
+
*/
|
|
23
|
+
static calculateBalance(fafData: any): BalanceData;
|
|
24
|
+
/**
|
|
25
|
+
* Generate the visual balance bar
|
|
26
|
+
* Matches fafdev.tools - single bar showing AI|HUMAN proportion
|
|
27
|
+
*/
|
|
28
|
+
static generateBalanceBar(balance: BalanceData): string;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a compact balance indicator for inline display
|
|
31
|
+
*/
|
|
32
|
+
static generateCompactBalance(balance: BalanceData): string;
|
|
33
|
+
/**
|
|
34
|
+
* Get balance achievement message for gamification
|
|
35
|
+
*/
|
|
36
|
+
static getAchievementMessage(balance: BalanceData): string | null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=balance-visualizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance-visualizer.d.ts","sourceRoot":"","sources":["../../src/utils/balance-visualizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAa;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAa;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAa;IAE1C;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW;IAqElD;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAkFvD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAa3D;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;CAalE"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🎯 AI|HUMAN Balance Visualizer
|
|
4
|
+
* Visual-only gamification that drives +144% human context completion
|
|
5
|
+
* The 50/50 eternal truth: AI detects tech (50%), humans provide meaning (50%)
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.BalanceVisualizer = void 0;
|
|
9
|
+
const colors_1 = require("../fix-once/colors");
|
|
10
|
+
class BalanceVisualizer {
|
|
11
|
+
static BAR_WIDTH = 40;
|
|
12
|
+
static CYAN = '#00FFFF';
|
|
13
|
+
static ORANGE = '#FFA500';
|
|
14
|
+
static GREEN = '#00FF00';
|
|
15
|
+
/**
|
|
16
|
+
* Calculate balance from FAF data
|
|
17
|
+
* Matches fafdev.tools calculation - INDEPENDENT percentages
|
|
18
|
+
* AI: How complete is technical context (0-100%)
|
|
19
|
+
* HUMAN: How complete is human context (0-100%)
|
|
20
|
+
* Perfect balance when both are high and similar
|
|
21
|
+
*/
|
|
22
|
+
static calculateBalance(fafData) {
|
|
23
|
+
// AI fields (technical detection) - what AI can detect
|
|
24
|
+
const aiFields = [
|
|
25
|
+
'stack.frontend',
|
|
26
|
+
'stack.backend',
|
|
27
|
+
'stack.database',
|
|
28
|
+
'stack.runtime',
|
|
29
|
+
'stack.build',
|
|
30
|
+
'stack.package_manager',
|
|
31
|
+
'project.main_language',
|
|
32
|
+
'project.generated',
|
|
33
|
+
'ai_instructions',
|
|
34
|
+
'preferences.quality_bar',
|
|
35
|
+
'state.version',
|
|
36
|
+
'state.phase'
|
|
37
|
+
];
|
|
38
|
+
// HUMAN fields (context meaning) - what humans provide
|
|
39
|
+
const humanFields = [
|
|
40
|
+
'human_context.who',
|
|
41
|
+
'human_context.what',
|
|
42
|
+
'human_context.why',
|
|
43
|
+
'human_context.where',
|
|
44
|
+
'human_context.when',
|
|
45
|
+
'human_context.how',
|
|
46
|
+
'project.goal',
|
|
47
|
+
'project.mission',
|
|
48
|
+
'state.focus',
|
|
49
|
+
'state.next_milestone',
|
|
50
|
+
'state.blockers',
|
|
51
|
+
'preferences.communication'
|
|
52
|
+
];
|
|
53
|
+
let aiFilledCount = 0;
|
|
54
|
+
let humanFilledCount = 0;
|
|
55
|
+
// Count AI fields
|
|
56
|
+
aiFields.forEach(field => {
|
|
57
|
+
const value = field.split('.').reduce((obj, key) => obj?.[key], fafData);
|
|
58
|
+
if (value && value !== 'None' && value !== 'Not specified' && value !== '') {
|
|
59
|
+
aiFilledCount++;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// Count HUMAN fields
|
|
63
|
+
humanFields.forEach(field => {
|
|
64
|
+
const value = field.split('.').reduce((obj, key) => obj?.[key], fafData);
|
|
65
|
+
if (value && value !== 'Not specified' && value !== '') {
|
|
66
|
+
humanFilledCount++;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// Calculate INDEPENDENT percentages (like fafdev.tools)
|
|
70
|
+
const aiPercentage = Math.round((aiFilledCount / aiFields.length) * 100);
|
|
71
|
+
const humanPercentage = Math.round((humanFilledCount / humanFields.length) * 100);
|
|
72
|
+
// Perfect balance when both are high and within 10% of each other
|
|
73
|
+
const isBalanced = Math.abs(aiPercentage - humanPercentage) <= 10 &&
|
|
74
|
+
aiPercentage >= 50 &&
|
|
75
|
+
humanPercentage >= 50;
|
|
76
|
+
return {
|
|
77
|
+
aiPercentage,
|
|
78
|
+
humanPercentage,
|
|
79
|
+
isBalanced
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Generate the visual balance bar
|
|
84
|
+
* Matches fafdev.tools - single bar showing AI|HUMAN proportion
|
|
85
|
+
*/
|
|
86
|
+
static generateBalanceBar(balance) {
|
|
87
|
+
const { aiPercentage, humanPercentage, isBalanced } = balance;
|
|
88
|
+
// Calculate proportional split (matching fafdev.tools logic)
|
|
89
|
+
const totalContext = aiPercentage + humanPercentage;
|
|
90
|
+
let aiProportion;
|
|
91
|
+
let humanProportion;
|
|
92
|
+
if (totalContext === 0) {
|
|
93
|
+
aiProportion = 50;
|
|
94
|
+
humanProportion = 50;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
aiProportion = Math.round((aiPercentage / totalContext) * 100);
|
|
98
|
+
humanProportion = 100 - aiProportion;
|
|
99
|
+
}
|
|
100
|
+
// Build the visual bar
|
|
101
|
+
const lines = [];
|
|
102
|
+
// Header matching fafdev.tools style
|
|
103
|
+
lines.push('');
|
|
104
|
+
if (isBalanced) {
|
|
105
|
+
lines.push(colors_1.colors.success(colors_1.colors.bold(' PRD Balance')));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
lines.push(colors_1.colors.bright(colors_1.colors.bold(' AI|HUMAN CONTEXT BALANCE')));
|
|
109
|
+
}
|
|
110
|
+
lines.push('');
|
|
111
|
+
// Build the single unified bar
|
|
112
|
+
const aiBarWidth = Math.round((aiProportion / 100) * this.BAR_WIDTH);
|
|
113
|
+
const humanBarWidth = this.BAR_WIDTH - aiBarWidth;
|
|
114
|
+
let barLine = ' ';
|
|
115
|
+
// GREEN celebration when perfectly balanced!
|
|
116
|
+
if (isBalanced) {
|
|
117
|
+
// Entire bar turns GREEN for perfect balance
|
|
118
|
+
barLine += colors_1.bars.green(this.BAR_WIDTH);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Normal cyan/orange split when not balanced
|
|
122
|
+
if (aiBarWidth > 0 && humanBarWidth > 0) {
|
|
123
|
+
barLine += colors_1.bars.cyan(aiBarWidth);
|
|
124
|
+
barLine += colors_1.bars.orange(humanBarWidth);
|
|
125
|
+
}
|
|
126
|
+
else if (aiBarWidth > 0) {
|
|
127
|
+
barLine += colors_1.bars.cyan(this.BAR_WIDTH);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
barLine += colors_1.bars.orange(this.BAR_WIDTH);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
lines.push(barLine);
|
|
134
|
+
// Guidance text
|
|
135
|
+
lines.push('');
|
|
136
|
+
if (isBalanced) {
|
|
137
|
+
lines.push(colors_1.colors.muted(' ⚖️ PERFECT BALANCE!'));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
lines.push(colors_1.colors.muted(' DROP FILES OR ADD CONTEXT TO SEE AI/HUMAN BALANCE'));
|
|
141
|
+
}
|
|
142
|
+
// Status message
|
|
143
|
+
lines.push('');
|
|
144
|
+
if (isBalanced) {
|
|
145
|
+
lines.push(colors_1.colors.success(' ✅ Your context is perfectly balanced!'));
|
|
146
|
+
lines.push(colors_1.colors.success(' 🏆 AI understands your tech, you provide the meaning'));
|
|
147
|
+
}
|
|
148
|
+
else if (aiPercentage > humanPercentage + 20) {
|
|
149
|
+
lines.push(colors_1.colors.warning(' 📝 Add more human context (who, what, why, etc.)'));
|
|
150
|
+
lines.push(colors_1.colors.muted(' 💡 AI detected your tech, now tell your story'));
|
|
151
|
+
}
|
|
152
|
+
else if (humanPercentage > aiPercentage + 20) {
|
|
153
|
+
lines.push(colors_1.colors.warning(' 🔧 Add more technical details (stack, dependencies)'));
|
|
154
|
+
lines.push(colors_1.colors.muted(' 💡 Great story, now specify the implementation'));
|
|
155
|
+
}
|
|
156
|
+
else if (aiPercentage < 30 && humanPercentage < 30) {
|
|
157
|
+
lines.push(colors_1.colors.error(' ⚠️ Both AI and HUMAN context are low'));
|
|
158
|
+
lines.push(colors_1.colors.muted(' 💡 Start by filling in basic project info'));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
lines.push(colors_1.colors.primary(' 🎯 Getting closer to balance!'));
|
|
162
|
+
lines.push(colors_1.colors.muted(` 📊 AI: ${aiPercentage}% | HUMAN: ${humanPercentage}%`));
|
|
163
|
+
}
|
|
164
|
+
return lines.join('\n');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Generate a compact balance indicator for inline display
|
|
168
|
+
*/
|
|
169
|
+
static generateCompactBalance(balance) {
|
|
170
|
+
const { aiPercentage, humanPercentage, isBalanced } = balance;
|
|
171
|
+
if (isBalanced) {
|
|
172
|
+
return colors_1.colors.success('⚖️ BALANCED');
|
|
173
|
+
}
|
|
174
|
+
const aiColor = colors_1.colors.primary;
|
|
175
|
+
const humanColor = colors_1.colors.secondary;
|
|
176
|
+
return `${aiColor(`AI:${aiPercentage}%`)} | ${humanColor(`HUMAN:${humanPercentage}%`)}`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get balance achievement message for gamification
|
|
180
|
+
*/
|
|
181
|
+
static getAchievementMessage(balance) {
|
|
182
|
+
const { isBalanced, aiPercentage, humanPercentage } = balance;
|
|
183
|
+
if (isBalanced && aiPercentage >= 80 && humanPercentage >= 80) {
|
|
184
|
+
return colors_1.colors.success(colors_1.colors.bold('🏆 CHAMPION BALANCE - Both AI and HUMAN above 80%!'));
|
|
185
|
+
}
|
|
186
|
+
else if (isBalanced) {
|
|
187
|
+
return colors_1.colors.success('✨ Balance achieved! Keep adding context to reach Champion status');
|
|
188
|
+
}
|
|
189
|
+
else if (Math.abs(aiPercentage - humanPercentage) <= 5) {
|
|
190
|
+
return colors_1.colors.warning('🔥 So close to perfect balance! Just a few more fields...');
|
|
191
|
+
}
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.BalanceVisualizer = BalanceVisualizer;
|
|
196
|
+
//# sourceMappingURL=balance-visualizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance-visualizer.js","sourceRoot":"","sources":["../../src/utils/balance-visualizer.ts"],"names":[],"mappings":"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"}
|