faf-cli 4.2.2 → 4.3.1

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 (81) hide show
  1. package/README.md +266 -90
  2. package/assets/project-faf-screenshot.png +0 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +40 -22
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/git.d.ts.map +1 -1
  7. package/dist/commands/git.js +9 -7
  8. package/dist/commands/git.js.map +1 -1
  9. package/dist/commands/readme.d.ts +11 -6
  10. package/dist/commands/readme.d.ts.map +1 -1
  11. package/dist/commands/readme.js +167 -120
  12. package/dist/commands/readme.js.map +1 -1
  13. package/dist/commands/show.d.ts.map +1 -1
  14. package/dist/commands/show.js +22 -7
  15. package/dist/commands/show.js.map +1 -1
  16. package/dist/commands/sixws.d.ts +6 -0
  17. package/dist/commands/sixws.d.ts.map +1 -0
  18. package/dist/commands/sixws.js +154 -0
  19. package/dist/commands/sixws.js.map +1 -0
  20. package/dist/github/current-score-calculator.d.ts +15 -0
  21. package/dist/github/current-score-calculator.d.ts.map +1 -0
  22. package/dist/github/current-score-calculator.js +125 -0
  23. package/dist/github/current-score-calculator.js.map +1 -0
  24. package/dist/github/faf-git-generator.d.ts +58 -0
  25. package/dist/github/faf-git-generator.d.ts.map +1 -0
  26. package/dist/github/faf-git-generator.js +557 -0
  27. package/dist/github/faf-git-generator.js.map +1 -0
  28. package/dist/github/github-extractor.d.ts +4 -0
  29. package/dist/github/github-extractor.d.ts.map +1 -1
  30. package/dist/github/github-extractor.js +27 -0
  31. package/dist/github/github-extractor.js.map +1 -1
  32. package/dist/github/repo-selector.d.ts +2 -2
  33. package/dist/github/repo-selector.d.ts.map +1 -1
  34. package/dist/github/repo-selector.js +30 -23
  35. package/dist/github/repo-selector.js.map +1 -1
  36. package/dist/utils/file-utils.d.ts.map +1 -1
  37. package/dist/utils/file-utils.js +1 -4
  38. package/dist/utils/file-utils.js.map +1 -1
  39. package/dist/utils/slot-counter.d.ts +56 -0
  40. package/dist/utils/slot-counter.d.ts.map +1 -0
  41. package/dist/utils/slot-counter.js +100 -0
  42. package/dist/utils/slot-counter.js.map +1 -0
  43. package/dist/utils/yaml-generator.d.ts.map +1 -1
  44. package/dist/utils/yaml-generator.js +3 -7
  45. package/dist/utils/yaml-generator.js.map +1 -1
  46. package/package.json +7 -2
  47. package/project.faf +5 -9
  48. package/scripts/ANTHROPIC-DEMO.sh +203 -0
  49. package/scripts/boris-ready.sh +169 -0
  50. package/scripts/bundle-yaml.js +87 -0
  51. package/scripts/check-version.js +88 -0
  52. package/scripts/clean-build.js +34 -0
  53. package/scripts/cleanup-unused.sh +54 -0
  54. package/scripts/debug-django.txt +9 -0
  55. package/scripts/debug-mongo.txt +9 -0
  56. package/scripts/debug-react.txt +9 -0
  57. package/scripts/debug-rust.txt +9 -0
  58. package/scripts/debug-whisper.cpp.txt +9 -0
  59. package/scripts/evaluate-family-member.ts +300 -0
  60. package/scripts/generate-docs.ts +358 -0
  61. package/scripts/generate-drift-reports.sh +111 -0
  62. package/scripts/industry-showcase.json +122 -0
  63. package/scripts/mcp-ecosystem-research.sh +58 -0
  64. package/scripts/migrate-yaml-imports.sh +55 -0
  65. package/scripts/migrate-yaml.ts +132 -0
  66. package/scripts/performance-validation.ts +460 -0
  67. package/scripts/postinstall.js +30 -0
  68. package/scripts/prepare-release.ts +421 -0
  69. package/scripts/run-industry-showcase.ts +237 -0
  70. package/scripts/run-test-showcase.ts +244 -0
  71. package/scripts/setup-github-watch.sh +43 -0
  72. package/scripts/sync-version.js +35 -0
  73. package/scripts/test-integration-detection.ts +93 -0
  74. package/scripts/test-integration-simple.js +93 -0
  75. package/scripts/test-medal-progression.sh +143 -0
  76. package/scripts/test-showcase-results.json +109 -0
  77. package/scripts/test-showcase.json +32 -0
  78. package/scripts/update-version.js +148 -0
  79. package/scripts/verify-build.js +343 -0
  80. package/scripts/version-check.js +78 -0
  81. package/scripts/watch-discussions.sh +86 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * 6Ws Builder Command
4
+ * Opens web interface for interactive project context creation
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.sixwsCommand = sixwsCommand;
44
+ const colors_1 = require("../fix-once/colors");
45
+ const inquirer_1 = __importDefault(require("inquirer"));
46
+ const open_1 = __importDefault(require("open"));
47
+ const yaml_1 = require("../fix-once/yaml");
48
+ const file_utils_1 = require("../utils/file-utils");
49
+ const fs_1 = require("fs");
50
+ const path = __importStar(require("path"));
51
+ async function sixwsCommand() {
52
+ console.log(colors_1.chalk.cyan('\n✨ 6Ws Builder - Web Interface\n'));
53
+ console.log('Opening browser to https://faf.one/6ws...\n');
54
+ // Open browser to 6ws builder
55
+ await (0, open_1.default)('https://faf.one/6ws');
56
+ console.log(colors_1.chalk.gray('Fill out the 6 questions in your browser.'));
57
+ console.log(colors_1.chalk.gray('When done, copy the') + colors_1.chalk.cyan(' human_context: ') + colors_1.chalk.gray('section.\n'));
58
+ // Prompt for paste
59
+ const { yamlInput } = await inquirer_1.default.prompt([
60
+ {
61
+ type: 'editor',
62
+ name: 'yamlInput',
63
+ message: 'Paste the human_context YAML here (opens your editor):',
64
+ default: 'human_context:\n who: ""\n what: ""\n where: ""\n why: ""\n when: ""\n how: ""\n',
65
+ validate: (input) => {
66
+ if (!input || input.trim().length === 0) {
67
+ return 'Please paste the human_context YAML';
68
+ }
69
+ // Validate YAML syntax
70
+ try {
71
+ (0, yaml_1.parse)(input);
72
+ return true;
73
+ }
74
+ catch (error) {
75
+ return `Invalid YAML: ${error.message}`;
76
+ }
77
+ }
78
+ }
79
+ ]);
80
+ // Parse the YAML
81
+ let humanContext;
82
+ try {
83
+ const parsed = (0, yaml_1.parse)(yamlInput);
84
+ humanContext = parsed;
85
+ // Validate it has human_context
86
+ if (!humanContext.human_context) {
87
+ console.log(colors_1.chalk.yellow('\n⚠️ No human_context section found. Adding it...\n'));
88
+ humanContext = { human_context: parsed };
89
+ }
90
+ }
91
+ catch (error) {
92
+ console.log(colors_1.chalk.red(`\n❌ Failed to parse YAML: ${error.message}\n`));
93
+ process.exit(1);
94
+ }
95
+ // Check if project.faf exists
96
+ const fafPath = await (0, file_utils_1.findFafFile)();
97
+ if (fafPath) {
98
+ // Merge into existing file
99
+ console.log(colors_1.chalk.gray(`\nFound existing file: ${fafPath}`));
100
+ const { shouldMerge } = await inquirer_1.default.prompt([
101
+ {
102
+ type: 'confirm',
103
+ name: 'shouldMerge',
104
+ message: 'Merge human_context into existing project.faf?',
105
+ default: true
106
+ }
107
+ ]);
108
+ if (shouldMerge) {
109
+ try {
110
+ const existingYaml = await fs_1.promises.readFile(fafPath, 'utf-8');
111
+ const existingContent = (0, yaml_1.parse)(existingYaml);
112
+ const merged = { ...existingContent, ...humanContext };
113
+ await fs_1.promises.writeFile(fafPath, (0, yaml_1.stringify)(merged), 'utf-8');
114
+ console.log(colors_1.chalk.green(`\n✅ Updated ${fafPath} with human_context\n`));
115
+ }
116
+ catch (error) {
117
+ console.log(colors_1.chalk.red(`\n❌ Failed to merge: ${error.message}\n`));
118
+ process.exit(1);
119
+ }
120
+ }
121
+ else {
122
+ console.log(colors_1.chalk.gray('\nSkipped merge. You can manually add it to your project.faf\n'));
123
+ }
124
+ }
125
+ else {
126
+ // Create new project.faf
127
+ const projectFafPath = path.join(process.cwd(), 'project.faf');
128
+ const { shouldCreate } = await inquirer_1.default.prompt([
129
+ {
130
+ type: 'confirm',
131
+ name: 'shouldCreate',
132
+ message: 'Create new project.faf with this context?',
133
+ default: true
134
+ }
135
+ ]);
136
+ if (shouldCreate) {
137
+ try {
138
+ await fs_1.promises.writeFile(projectFafPath, (0, yaml_1.stringify)(humanContext), 'utf-8');
139
+ console.log(colors_1.chalk.green(`\n✅ Created ${projectFafPath}\n`));
140
+ console.log(colors_1.chalk.gray('Next steps:'));
141
+ console.log(colors_1.chalk.gray(' 1. Run') + colors_1.chalk.cyan(' faf score ') + colors_1.chalk.gray('to check completeness'));
142
+ console.log(colors_1.chalk.gray(' 2. Share project.faf with Claude, Gemini, or ChatGPT\n'));
143
+ }
144
+ catch (error) {
145
+ console.log(colors_1.chalk.red(`\n❌ Failed to create file: ${error.message}\n`));
146
+ process.exit(1);
147
+ }
148
+ }
149
+ else {
150
+ console.log(colors_1.chalk.gray('\nSkipped file creation. You can save it manually.\n'));
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=sixws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sixws.js","sourceRoot":"","sources":["../../src/commands/sixws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 🏆 Current Score Calculator
3
+ *
4
+ * Calculates AI-readiness score for repos AS THEY ARE (before FAF enhancement)
5
+ *
6
+ * Strategy:
7
+ * - Check if .faf exists → score it
8
+ * - No .faf → calculate baseline from README + package.json
9
+ */
10
+ import type { GitHubMetadata } from './github-extractor';
11
+ /**
12
+ * Calculate current score (repo as-is, before FAF generation)
13
+ */
14
+ export declare function calculateCurrentScore(metadata: GitHubMetadata, files: any[]): Promise<number>;
15
+ //# sourceMappingURL=current-score-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-score-calculator.d.ts","sourceRoot":"","sources":["../../src/github/current-score-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC,MAAM,CAAC,CA+BjB"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * 🏆 Current Score Calculator
4
+ *
5
+ * Calculates AI-readiness score for repos AS THEY ARE (before FAF enhancement)
6
+ *
7
+ * Strategy:
8
+ * - Check if .faf exists → score it
9
+ * - No .faf → calculate baseline from README + package.json
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.calculateCurrentScore = calculateCurrentScore;
13
+ const github_extractor_1 = require("./github-extractor");
14
+ /**
15
+ * Calculate current score (repo as-is, before FAF generation)
16
+ */
17
+ async function calculateCurrentScore(metadata, files) {
18
+ // Check if repo has existing .faf file
19
+ const hasFaf = files.some(f => f.path === 'project.faf' ||
20
+ f.path === '.faf' ||
21
+ f.path.endsWith('.faf'));
22
+ if (hasFaf) {
23
+ // Repo has .faf - score it
24
+ try {
25
+ const fafFile = files.find(f => f.path === 'project.faf' || f.path === '.faf');
26
+ if (fafFile) {
27
+ const fafContent = await (0, github_extractor_1.fetchGitHubFileContent)(metadata.owner, metadata.repo, fafFile.path, metadata.defaultBranch || 'main');
28
+ if (fafContent) {
29
+ return scoreFafContent(fafContent);
30
+ }
31
+ }
32
+ }
33
+ catch (error) {
34
+ // Fallback to baseline if can't fetch .faf
35
+ console.error('Failed to fetch existing .faf:', error);
36
+ }
37
+ }
38
+ // No .faf file - calculate baseline score from available data
39
+ return calculateBaselineScore(metadata, files);
40
+ }
41
+ /**
42
+ * Score existing .faf content (simplified version)
43
+ */
44
+ function scoreFafContent(fafContent) {
45
+ let score = 0;
46
+ // Basic presence checks (10 points each, max 60)
47
+ const checks = [
48
+ { pattern: /project:/i, points: 10 },
49
+ { pattern: /stack:/i, points: 10 },
50
+ { pattern: /human_context:/i, points: 10 },
51
+ { pattern: /ai_instructions:/i, points: 10 },
52
+ { pattern: /what:/i, points: 10 },
53
+ { pattern: /why:/i, points: 10 },
54
+ ];
55
+ for (const check of checks) {
56
+ if (check.pattern.test(fafContent)) {
57
+ score += check.points;
58
+ }
59
+ }
60
+ // Quality indicators (5 points each, max 40)
61
+ const qualityChecks = [
62
+ { pattern: /name:\s*\S+/, points: 5 },
63
+ { pattern: /goal:\s*\S+/, points: 5 },
64
+ { pattern: /main_language:\s*\S+/, points: 5 },
65
+ { pattern: /type:\s*\S+/, points: 5 },
66
+ { pattern: /who:\s*\S+/, points: 5 },
67
+ { pattern: /where:\s*\S+/, points: 5 },
68
+ { pattern: /when:\s*\S+/, points: 5 },
69
+ { pattern: /how:\s*\S+/, points: 5 },
70
+ ];
71
+ for (const check of qualityChecks) {
72
+ if (check.pattern.test(fafContent)) {
73
+ score += check.points;
74
+ }
75
+ }
76
+ return Math.min(score, 100);
77
+ }
78
+ /**
79
+ * Calculate baseline score from README + package.json (no .faf)
80
+ */
81
+ function calculateBaselineScore(metadata, files) {
82
+ let score = 0;
83
+ // Has README (+10)
84
+ if (metadata.readme || files.some(f => f.path.toLowerCase().includes('readme'))) {
85
+ score += 10;
86
+ }
87
+ // Has package.json (+10)
88
+ if (metadata.hasPackageJson) {
89
+ score += 10;
90
+ }
91
+ // Has description (+5)
92
+ if (metadata.description && metadata.description.length > 20) {
93
+ score += 5;
94
+ }
95
+ // Has topics/tags (+5)
96
+ if (metadata.topics && metadata.topics.length > 0) {
97
+ score += 5;
98
+ }
99
+ // Popular repo (+5 for 1K+ stars)
100
+ const stars = parseInt(metadata.stars || '0');
101
+ if (stars >= 1000) {
102
+ score += 5;
103
+ }
104
+ // Has license (+5)
105
+ if (metadata.license) {
106
+ score += 5;
107
+ }
108
+ // Recently updated (+5 for < 90 days)
109
+ if (metadata.lastUpdated) {
110
+ const lastUpdate = new Date(metadata.lastUpdated);
111
+ const now = new Date();
112
+ const daysSinceUpdate = (now.getTime() - lastUpdate.getTime()) / (1000 * 60 * 60 * 24);
113
+ if (daysSinceUpdate < 90) {
114
+ score += 5;
115
+ }
116
+ }
117
+ // Has multiple languages (+5)
118
+ if (metadata.languages && metadata.languages.length > 1) {
119
+ score += 5;
120
+ }
121
+ // Baseline repos typically score 20-50%
122
+ // This is intentionally low to show FAF's value
123
+ return Math.min(score, 50);
124
+ }
125
+ //# sourceMappingURL=current-score-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-score-calculator.js","sourceRoot":"","sources":["../../src/github/current-score-calculator.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAQH,sDAkCC;AAvCD,yDAA4D;AAE5D;;GAEG;AACI,KAAK,UAAU,qBAAqB,CACzC,QAAwB,EACxB,KAAY;IAEZ,uCAAuC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC5B,CAAC,CAAC,IAAI,KAAK,aAAa;QACxB,CAAC,CAAC,IAAI,KAAK,MAAM;QACjB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CACxB,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAC/E,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,MAAM,IAAA,yCAAsB,EAC7C,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,IAAI,EACb,OAAO,CAAC,IAAI,EACZ,QAAQ,CAAC,aAAa,IAAI,MAAM,CACjC,CAAC;gBACF,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,OAAO,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,UAAkB;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,iDAAiD;IACjD,MAAM,MAAM,GAAG;QACb,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1C,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5C,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QACjC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;KACjC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,GAAG;QACpB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE;QAC9C,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE;QACpC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE;QACtC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QACrC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE;KACrC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,QAAwB,EAAE,KAAY;IACpE,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,mBAAmB;IACnB,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAChF,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,yBAAyB;IACzB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5B,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC7D,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,kCAAkC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC9C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,mBAAmB;IACnB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,sCAAsC;IACtC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,IAAI,eAAe,GAAG,EAAE,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,wCAAwC;IACxC,gDAAgD;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 🏆 Enhanced FAF Generation for `faf git`
3
+ *
4
+ * Generates 90%+ AI-ready .faf files from GitHub repos WITHOUT cloning
5
+ *
6
+ * Strategy:
7
+ * 1. Fetch README.md → Extract 6 Ws (+30%)
8
+ * 2. Fetch package.json → Deep stack analysis (+15%)
9
+ * 3. Full FAF schema → Match faf-cli init (+20%)
10
+ * 4. Smart defaults → AI instructions, project type (+15%)
11
+ * 5. Enhanced scoring → Championship grade (+10%)
12
+ */
13
+ import type { GitHubMetadata } from './github-extractor';
14
+ export interface Enhanced6Ws {
15
+ who: string;
16
+ what: string;
17
+ why: string;
18
+ where: string;
19
+ when: string;
20
+ how: string;
21
+ confidence: number;
22
+ }
23
+ /**
24
+ * Extract 6 Ws from README content (simplified version for git command)
25
+ */
26
+ export declare function extract6WsFromReadme(readme: string, metadata: GitHubMetadata): Enhanced6Ws;
27
+ /**
28
+ * Enhanced stack detection from package.json
29
+ */
30
+ export interface StackAnalysis {
31
+ frontend?: string;
32
+ backend?: string;
33
+ database?: string;
34
+ testing?: string;
35
+ buildTool?: string;
36
+ runtime?: string;
37
+ language?: string;
38
+ hosting?: string;
39
+ frameworks: string[];
40
+ }
41
+ /**
42
+ * Extract stack from GH API languages array
43
+ * This is the SOURCE OF TRUTH from GitHub - trust it!
44
+ */
45
+ export declare function extractFromLanguages(metadata: GitHubMetadata): StackAnalysis;
46
+ export declare function analyzePackageJson(packageJson: any, metadata: GitHubMetadata): StackAnalysis;
47
+ /**
48
+ * Calculate enhanced quality score (targeting 90%+)
49
+ */
50
+ export declare function calculateEnhancedScore(metadata: GitHubMetadata, has6Ws: boolean, hasPackageJson: boolean, hasReadme: boolean): number;
51
+ /**
52
+ * Generate full FAF structure (matching faf-cli init output)
53
+ */
54
+ export declare function generateEnhancedFaf(metadata: GitHubMetadata, files: any[]): Promise<{
55
+ content: string;
56
+ score: number;
57
+ }>;
58
+ //# sourceMappingURL=faf-git-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faf-git-generator.d.ts","sourceRoot":"","sources":["../../src/github/faf-git-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKzD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,WAAW,CA+E1F;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAyD5E;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,GAAG,aAAa,CAuD5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,OAAO,EACf,cAAc,EAAE,OAAO,EACvB,SAAS,EAAE,OAAO,GACjB,MAAM,CAuCR;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,GAAG,EAAE,GACX,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAkP7C"}