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.
- package/README.md +266 -90
- package/assets/project-faf-screenshot.png +0 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/git.d.ts.map +1 -1
- package/dist/commands/git.js +9 -7
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/readme.d.ts +11 -6
- package/dist/commands/readme.d.ts.map +1 -1
- package/dist/commands/readme.js +167 -120
- package/dist/commands/readme.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +22 -7
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/sixws.d.ts +6 -0
- package/dist/commands/sixws.d.ts.map +1 -0
- package/dist/commands/sixws.js +154 -0
- package/dist/commands/sixws.js.map +1 -0
- package/dist/github/current-score-calculator.d.ts +15 -0
- package/dist/github/current-score-calculator.d.ts.map +1 -0
- package/dist/github/current-score-calculator.js +125 -0
- package/dist/github/current-score-calculator.js.map +1 -0
- package/dist/github/faf-git-generator.d.ts +58 -0
- package/dist/github/faf-git-generator.d.ts.map +1 -0
- package/dist/github/faf-git-generator.js +557 -0
- package/dist/github/faf-git-generator.js.map +1 -0
- package/dist/github/github-extractor.d.ts +4 -0
- package/dist/github/github-extractor.d.ts.map +1 -1
- package/dist/github/github-extractor.js +27 -0
- package/dist/github/github-extractor.js.map +1 -1
- package/dist/github/repo-selector.d.ts +2 -2
- package/dist/github/repo-selector.d.ts.map +1 -1
- package/dist/github/repo-selector.js +30 -23
- package/dist/github/repo-selector.js.map +1 -1
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +1 -4
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/slot-counter.d.ts +56 -0
- package/dist/utils/slot-counter.d.ts.map +1 -0
- package/dist/utils/slot-counter.js +100 -0
- package/dist/utils/slot-counter.js.map +1 -0
- package/dist/utils/yaml-generator.d.ts.map +1 -1
- package/dist/utils/yaml-generator.js +3 -7
- package/dist/utils/yaml-generator.js.map +1 -1
- package/package.json +7 -2
- package/project.faf +5 -9
- package/scripts/ANTHROPIC-DEMO.sh +203 -0
- package/scripts/boris-ready.sh +169 -0
- package/scripts/bundle-yaml.js +87 -0
- package/scripts/check-version.js +88 -0
- package/scripts/clean-build.js +34 -0
- package/scripts/cleanup-unused.sh +54 -0
- package/scripts/debug-django.txt +9 -0
- package/scripts/debug-mongo.txt +9 -0
- package/scripts/debug-react.txt +9 -0
- package/scripts/debug-rust.txt +9 -0
- package/scripts/debug-whisper.cpp.txt +9 -0
- package/scripts/evaluate-family-member.ts +300 -0
- package/scripts/generate-docs.ts +358 -0
- package/scripts/generate-drift-reports.sh +111 -0
- package/scripts/industry-showcase.json +122 -0
- package/scripts/mcp-ecosystem-research.sh +58 -0
- package/scripts/migrate-yaml-imports.sh +55 -0
- package/scripts/migrate-yaml.ts +132 -0
- package/scripts/performance-validation.ts +460 -0
- package/scripts/postinstall.js +30 -0
- package/scripts/prepare-release.ts +421 -0
- package/scripts/run-industry-showcase.ts +237 -0
- package/scripts/run-test-showcase.ts +244 -0
- package/scripts/setup-github-watch.sh +43 -0
- package/scripts/sync-version.js +35 -0
- package/scripts/test-integration-detection.ts +93 -0
- package/scripts/test-integration-simple.js +93 -0
- package/scripts/test-medal-progression.sh +143 -0
- package/scripts/test-showcase-results.json +109 -0
- package/scripts/test-showcase.json +32 -0
- package/scripts/update-version.js +148 -0
- package/scripts/verify-build.js +343 -0
- package/scripts/version-check.js +78 -0
- 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":"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"}
|
|
@@ -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"}
|