faf-cli 2.3.3 โ†’ 2.3.5

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 (46) hide show
  1. package/README.md +6 -4
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +5 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/chat.d.ts +1 -0
  6. package/dist/commands/chat.d.ts.map +1 -1
  7. package/dist/commands/chat.js +177 -6
  8. package/dist/commands/chat.js.map +1 -1
  9. package/dist/commands/quick.d.ts.map +1 -1
  10. package/dist/commands/quick.js +30 -5
  11. package/dist/commands/quick.js.map +1 -1
  12. package/dist/compiler/faf-compiler.d.ts.map +1 -1
  13. package/dist/compiler/faf-compiler.js +48 -2
  14. package/dist/compiler/faf-compiler.js.map +1 -1
  15. package/dist/generators/faf-generator-championship.d.ts +6 -0
  16. package/dist/generators/faf-generator-championship.d.ts.map +1 -1
  17. package/dist/generators/faf-generator-championship.js +19 -3
  18. package/dist/generators/faf-generator-championship.js.map +1 -1
  19. package/dist/tests/test-chrome-fuzzy.d.ts +5 -0
  20. package/dist/tests/test-chrome-fuzzy.d.ts.map +1 -0
  21. package/dist/tests/test-chrome-fuzzy.js +71 -0
  22. package/dist/tests/test-chrome-fuzzy.js.map +1 -0
  23. package/dist/utils/chrome-extension-confirmer.d.ts +41 -0
  24. package/dist/utils/chrome-extension-confirmer.d.ts.map +1 -0
  25. package/dist/utils/chrome-extension-confirmer.js +188 -0
  26. package/dist/utils/chrome-extension-confirmer.js.map +1 -0
  27. package/dist/utils/chrome-extension-detector.d.ts +74 -0
  28. package/dist/utils/chrome-extension-detector.d.ts.map +1 -0
  29. package/dist/utils/chrome-extension-detector.js +268 -0
  30. package/dist/utils/chrome-extension-detector.js.map +1 -0
  31. package/dist/utils/fab-formats-engine.d.ts.map +1 -1
  32. package/dist/utils/fab-formats-engine.js +3 -0
  33. package/dist/utils/fab-formats-engine.js.map +1 -1
  34. package/dist/utils/turbo-cat-knowledge.d.ts.map +1 -1
  35. package/dist/utils/turbo-cat-knowledge.js +16 -0
  36. package/dist/utils/turbo-cat-knowledge.js.map +1 -1
  37. package/dist/utils/universal-fuzzy-detector.d.ts +64 -0
  38. package/dist/utils/universal-fuzzy-detector.d.ts.map +1 -0
  39. package/dist/utils/universal-fuzzy-detector.js +381 -0
  40. package/dist/utils/universal-fuzzy-detector.js.map +1 -0
  41. package/dist/utils/update-checker.d.ts +15 -0
  42. package/dist/utils/update-checker.d.ts.map +1 -0
  43. package/dist/utils/update-checker.js +203 -0
  44. package/dist/utils/update-checker.js.map +1 -0
  45. package/dist/utils/yaml-generator.js +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * ๐Ÿ†• FAF Update Checker - Keep users informed about new versions
4
+ * Checks once per day, non-intrusive, respects quiet mode
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.checkForUpdates = checkForUpdates;
44
+ exports.forceUpdateCheck = forceUpdateCheck;
45
+ const chalk_1 = __importDefault(require("chalk"));
46
+ const fs_1 = require("fs");
47
+ const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
49
+ const https_1 = __importDefault(require("https"));
50
+ const championship_style_1 = require("./championship-style");
51
+ const CACHE_FILE = path.join(os.homedir(), '.faf-cli-cache', 'update-check.json');
52
+ const CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
53
+ const REGISTRY_URL = 'https://registry.npmjs.org/faf-cli/latest';
54
+ /**
55
+ * Fetch latest version from npm registry
56
+ */
57
+ async function fetchLatestVersion() {
58
+ return new Promise((resolve) => {
59
+ https_1.default.get(REGISTRY_URL, (res) => {
60
+ let data = '';
61
+ res.on('data', (chunk) => data += chunk);
62
+ res.on('end', () => {
63
+ try {
64
+ const json = JSON.parse(data);
65
+ resolve(json.version);
66
+ }
67
+ catch {
68
+ resolve(null);
69
+ }
70
+ });
71
+ }).on('error', () => resolve(null));
72
+ });
73
+ }
74
+ /**
75
+ * Read update cache
76
+ */
77
+ async function readCache() {
78
+ try {
79
+ await fs_1.promises.mkdir(path.dirname(CACHE_FILE), { recursive: true });
80
+ const content = await fs_1.promises.readFile(CACHE_FILE, 'utf-8');
81
+ return JSON.parse(content);
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ /**
88
+ * Write update cache
89
+ */
90
+ async function writeCache(cache) {
91
+ try {
92
+ await fs_1.promises.mkdir(path.dirname(CACHE_FILE), { recursive: true });
93
+ await fs_1.promises.writeFile(CACHE_FILE, JSON.stringify(cache, null, 2));
94
+ }
95
+ catch {
96
+ // Silent fail - not critical
97
+ }
98
+ }
99
+ /**
100
+ * Compare semantic versions
101
+ */
102
+ function isNewerVersion(latest, current) {
103
+ const parseVersion = (v) => {
104
+ const parts = v.replace(/^v/, '').split('.').map(Number);
105
+ return {
106
+ major: parts[0] || 0,
107
+ minor: parts[1] || 0,
108
+ patch: parts[2] || 0
109
+ };
110
+ };
111
+ const latestVer = parseVersion(latest);
112
+ const currentVer = parseVersion(current);
113
+ if (latestVer.major > currentVer.major)
114
+ return true;
115
+ if (latestVer.major < currentVer.major)
116
+ return false;
117
+ if (latestVer.minor > currentVer.minor)
118
+ return true;
119
+ if (latestVer.minor < currentVer.minor)
120
+ return false;
121
+ return latestVer.patch > currentVer.patch;
122
+ }
123
+ /**
124
+ * Check for updates (respects quiet mode)
125
+ */
126
+ async function checkForUpdates(options) {
127
+ // Don't check in quiet mode
128
+ if (options?.quiet)
129
+ return;
130
+ // Don't check in CI/CD environments
131
+ if (process.env.CI || process.env.CONTINUOUS_INTEGRATION)
132
+ return;
133
+ try {
134
+ const packageJson = require('../../package.json');
135
+ const currentVersion = packageJson.version;
136
+ // Check cache
137
+ const cache = await readCache();
138
+ const now = Date.now();
139
+ // Skip if checked recently
140
+ if (cache && (now - cache.lastCheck) < CHECK_INTERVAL) {
141
+ // But still show if update available and not shown yet
142
+ if (cache.latestVersion &&
143
+ cache.currentVersion === currentVersion &&
144
+ isNewerVersion(cache.latestVersion, currentVersion)) {
145
+ showUpdateMessage(cache.latestVersion, currentVersion);
146
+ }
147
+ return;
148
+ }
149
+ // Fetch latest version
150
+ const latestVersion = await fetchLatestVersion();
151
+ if (!latestVersion)
152
+ return;
153
+ // Update cache
154
+ await writeCache({
155
+ lastCheck: now,
156
+ latestVersion,
157
+ currentVersion
158
+ });
159
+ // Show update if available
160
+ if (isNewerVersion(latestVersion, currentVersion)) {
161
+ showUpdateMessage(latestVersion, currentVersion);
162
+ }
163
+ }
164
+ catch {
165
+ // Silent fail - update check is not critical
166
+ }
167
+ }
168
+ /**
169
+ * Show update message
170
+ */
171
+ function showUpdateMessage(latest, current) {
172
+ console.log();
173
+ console.log(championship_style_1.FAF_COLORS.fafOrange('โ”'.repeat(50)));
174
+ console.log(championship_style_1.FAF_COLORS.fafCyan(` ๐Ÿ†• FAF Update Available!`));
175
+ console.log(chalk_1.default.gray(` Current: v${current}`));
176
+ console.log(championship_style_1.FAF_COLORS.fafGreen(` Latest: v${latest}`));
177
+ console.log();
178
+ console.log(chalk_1.default.white(` Update with:`));
179
+ console.log(championship_style_1.FAF_COLORS.fafCyan(` npm update -g faf-cli`));
180
+ console.log();
181
+ console.log(chalk_1.default.gray(` What's new: https://github.com/faf-cli/releases`));
182
+ console.log(championship_style_1.FAF_COLORS.fafOrange('โ”'.repeat(50)));
183
+ console.log();
184
+ }
185
+ /**
186
+ * Force check (for testing or manual trigger)
187
+ */
188
+ async function forceUpdateCheck() {
189
+ const packageJson = require('../../package.json');
190
+ const currentVersion = packageJson.version;
191
+ const latestVersion = await fetchLatestVersion();
192
+ if (!latestVersion) {
193
+ console.log(chalk_1.default.red('Failed to check for updates'));
194
+ return;
195
+ }
196
+ if (isNewerVersion(latestVersion, currentVersion)) {
197
+ showUpdateMessage(latestVersion, currentVersion);
198
+ }
199
+ else {
200
+ console.log(championship_style_1.FAF_COLORS.fafGreen(`โœ… You're on the latest version (v${currentVersion})`));
201
+ }
202
+ }
203
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":"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"}
@@ -199,7 +199,7 @@ function generateFafContent(projectData) {
199
199
  }
200
200
  const fafData = {
201
201
  // FAF schema version (not CLI version)
202
- faf_version: '2.4.0',
202
+ faf_version: '2.3.5',
203
203
  // ๐Ÿค– AI-FIRST SCORING SYSTEM - Live date instead of versions
204
204
  ai_scoring_system: '2025-08-30', // MY scoring logic live date (COUNT ONCE architecture)
205
205
  ai_score: `${projectData.fafScore}%`, // MY evaluation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "faf-cli",
3
- "version": "2.3.3",
3
+ "version": "2.3.5",
4
4
  "description": "๐Ÿ .faf - The JPEG for AIโ„ข - Universal AI-context for any AI, human or team",
5
5
  "icon": "https://faf.one/orange-smiley.svg",
6
6
  "logo": "https://faf.one/orange-smiley.svg",
@@ -47,7 +47,7 @@
47
47
  "version:update": "node scripts/update-version.js",
48
48
  "version:check": "node scripts/check-version.js",
49
49
  "precommit": "npm run version:check",
50
- "postinstall": "echo '\n๐Ÿงกโšก๏ธ FAF CLI v2.2.5 - FREE for all Developers!\nRun \"faf --help\" to get started\n'"
50
+ "postinstall": "echo '\n๐Ÿงกโšก๏ธ FAF CLI v2.3.5 - FREE for all Developers!\nRun \"faf --help\" to get started\n'"
51
51
  },
52
52
  "keywords": [
53
53
  "faf",