mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-08-08 00:10:29 +08:00
- Add pin-template-deps.js to resolve "*" deps to exact npm versions - Integrate pinning into sync-template-skills npm script - Remove check-template-skills-versions.js (no longer needed) - Simplify workflow to single sync step - Flatten skill output: one folder per skill with cleaned names Made-with: Cursor
99 lines
3.6 KiB
JavaScript
99 lines
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import { CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, searchStack } from './core.js';
|
|
import { generateDesignSystem } from './design_system.js';
|
|
|
|
// ============ ARG PARSER ============
|
|
|
|
function parseArgs(argv) {
|
|
const args = { query: null, maxResults: MAX_RESULTS, format: 'ascii' };
|
|
let i = 2;
|
|
while (i < argv.length) {
|
|
const a = argv[i];
|
|
if (a === '--domain' || a === '-d') { args.domain = argv[++i]; }
|
|
else if (a === '--stack' || a === '-s') { args.stack = argv[++i]; }
|
|
else if (a === '--max-results' || a === '-n') { args.maxResults = parseInt(argv[++i], 10); }
|
|
else if (a === '--json') { args.json = true; }
|
|
else if (a === '--design-system' || a === '-ds') { args.designSystem = true; }
|
|
else if (a === '--project-name' || a === '-p') { args.projectName = argv[++i]; }
|
|
else if (a === '--format' || a === '-f') { args.format = argv[++i]; }
|
|
else if (a === '--persist') { args.persist = true; }
|
|
else if (a === '--page') { args.page = argv[++i]; }
|
|
else if (a === '--output-dir' || a === '-o') { args.outputDir = argv[++i]; }
|
|
else if (!a.startsWith('-') && !args.query) { args.query = a; }
|
|
i++;
|
|
}
|
|
return args;
|
|
}
|
|
|
|
// ============ FORMATTER ============
|
|
|
|
function formatOutput(result) {
|
|
if (result.error) return `Error: ${result.error}`;
|
|
|
|
const lines = [];
|
|
if (result.stack) {
|
|
lines.push('## UI Pro Max Stack Guidelines');
|
|
lines.push(`**Stack:** ${result.stack} | **Query:** ${result.query}`);
|
|
} else {
|
|
lines.push('## UI Pro Max Search Results');
|
|
lines.push(`**Domain:** ${result.domain} | **Query:** ${result.query}`);
|
|
}
|
|
lines.push(`**Source:** ${result.file} | **Found:** ${result.count} results\n`);
|
|
|
|
(result.results || []).forEach((row, i) => {
|
|
lines.push(`### Result ${i + 1}`);
|
|
for (const [key, value] of Object.entries(row)) {
|
|
const v = String(value);
|
|
lines.push(`- **${key}:** ${v.length > 300 ? v.slice(0, 300) + '...' : v}`);
|
|
}
|
|
lines.push('');
|
|
});
|
|
|
|
return lines.join('\n');
|
|
}
|
|
|
|
// ============ MAIN ============
|
|
|
|
const args = parseArgs(process.argv);
|
|
|
|
if (!args.query) {
|
|
console.error('Usage: node search.js "<query>" [--domain <d>] [--stack <s>] [--design-system] [-p "Name"]');
|
|
console.error(`Domains: ${Object.keys(CSV_CONFIG).join(', ')}`);
|
|
console.error(`Stacks: ${AVAILABLE_STACKS.join(', ')}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
if (args.designSystem) {
|
|
const result = generateDesignSystem(
|
|
args.query,
|
|
args.projectName,
|
|
args.format,
|
|
!!args.persist,
|
|
args.page || null,
|
|
args.outputDir || null
|
|
);
|
|
console.log(result);
|
|
|
|
if (args.persist) {
|
|
const slug = args.projectName ? args.projectName.toLowerCase().replace(/\s+/g, '-') : 'default';
|
|
console.log('\n' + '='.repeat(60));
|
|
console.log(`✅ Design system persisted to design-system/${slug}/`);
|
|
console.log(` 📄 design-system/${slug}/MASTER.md (Global Source of Truth)`);
|
|
if (args.page) {
|
|
const pageSlug = args.page.toLowerCase().replace(/\s+/g, '-');
|
|
console.log(` 📄 design-system/${slug}/pages/${pageSlug}.md (Page Overrides)`);
|
|
}
|
|
console.log('');
|
|
console.log(`📖 Usage: When building a page, check design-system/${slug}/pages/[page].md first.`);
|
|
console.log(` If exists, its rules override MASTER.md. Otherwise, use MASTER.md.`);
|
|
console.log('='.repeat(60));
|
|
}
|
|
} else if (args.stack) {
|
|
const result = searchStack(args.query, args.stack, args.maxResults);
|
|
console.log(args.json ? JSON.stringify(result, null, 2) : formatOutput(result));
|
|
} else {
|
|
const result = search(args.query, args.domain, args.maxResults);
|
|
console.log(args.json ? JSON.stringify(result, null, 2) : formatOutput(result));
|
|
}
|