@ekanos/cli 0.1.7 → 0.1.9
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/dist/commands/publish.d.ts +5 -0
- package/dist/commands/publish.js +1 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/status.d.ts +27 -1
- package/dist/commands/status.js +145 -12
- package/dist/commands/status.js.map +1 -1
- package/dist/generated/fa-free-names.d.ts +9 -0
- package/dist/generated/fa-free-names.js +2599 -0
- package/dist/generated/fa-free-names.js.map +1 -0
- package/dist/icon-findings.d.ts +23 -0
- package/dist/icon-findings.js +120 -0
- package/dist/icon-findings.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/publish-api.d.ts +47 -3
- package/dist/publish-api.js +30 -11
- package/dist/publish-api.js.map +1 -1
- package/dist/validate-findings.js +2 -0
- package/dist/validate-findings.js.map +1 -1
- package/package.json +4 -2
- package/templates/package.json.tmpl +3 -0
- package/templates/skills/build-integration/references/widget-design.md +5 -0
- package/templates/skills/polish-widgets/references/patterns.md +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fa-free-names.js","sourceRoot":"","sources":["../../src/generated/fa-free-names.ts"],"names":[],"mappings":"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","sourcesContent":["// GENERATED FILE — do not hand-edit.\n//\n// Regenerate with `pnpm --filter @ekanos/cli generate:fa-free-names` after\n// @ekanos/ui's Free icon-name list, or @ekanos/harness's Pro→Free glyph\n// shim, changes. Source:\n// - @ekanos/ui's committed `fa-free-icon-names.generated.ts`, itself\n// generated from `@fortawesome/fontawesome-free@7.3.1`.\n// - @ekanos/harness's `styles/styles.src.css` Pro→Free shim comments.\n//\n// `@ekanos/cli` deliberately does not runtime-depend on `@ekanos/ui` or\n// `@ekanos/harness` (both are browser packages; the CLI is Node) — this\n// file is generated, dependency-free data so `ekanos validate`'s icon check\n// can still flag a Pro-only `fa-*` name without importing either.\n// See `scripts/generate-fa-free-names.mjs` and\n// `src/__tests__/fa-free-names-drift.test.ts`.\n\nexport const FA_FREE_VERSION = '7.3.1';\n\n/** Every icon name Font Awesome Free ships — NOT Fusion's set (Pro, a superset). */\nexport const FA_FREE_ICON_NAMES: ReadonlySet<string> = new Set([\n '11ty',\n '42-group',\n '500px',\n 'a11y-project',\n 'accessible-icon',\n 'accusoft',\n 'ad',\n 'address-book',\n 'address-card',\n 'adjust',\n 'adn',\n 'adversal',\n 'affiliatetheme',\n 'air-freshener',\n 'airbnb',\n 'alarm-clock',\n 'algolia',\n 'align-center',\n 'align-justify',\n 'align-left',\n 'align-right',\n 'alipay',\n 'allergies',\n 'amazon',\n 'amazon-pay',\n 'ambulance',\n 'american-sign-language-interpreting',\n 'amilia',\n 'anchor',\n 'anchor-circle-check',\n 'anchor-circle-exclamation',\n 'anchor-circle-xmark',\n 'anchor-lock',\n 'android',\n 'angellist',\n 'angle-double-down',\n 'angle-double-left',\n 'angle-double-right',\n 'angle-double-up',\n 'angle-down',\n 'angle-left',\n 'angle-right',\n 'angle-up',\n 'angles-down',\n 'angles-left',\n 'angles-right',\n 'angles-up',\n 'angry',\n 'angrycreative',\n 'angular',\n 'ankh',\n 'app-store',\n 'app-store-ios',\n 'apper',\n 'apple',\n 'apple-alt',\n 'apple-pay',\n 'apple-whole',\n 'aquarius',\n 'arch-linux',\n 'archive',\n 'archway',\n 'area-chart',\n 'aries',\n 'arrow-alt-circle-down',\n 'arrow-alt-circle-left',\n 'arrow-alt-circle-right',\n 'arrow-alt-circle-up',\n 'arrow-circle-down',\n 'arrow-circle-left',\n 'arrow-circle-right',\n 'arrow-circle-up',\n 'arrow-down',\n 'arrow-down-1-9',\n 'arrow-down-9-1',\n 'arrow-down-a-z',\n 'arrow-down-long',\n 'arrow-down-short-wide',\n 'arrow-down-up-across-line',\n 'arrow-down-up-lock',\n 'arrow-down-wide-short',\n 'arrow-down-z-a',\n 'arrow-left',\n 'arrow-left-long',\n 'arrow-left-rotate',\n 'arrow-pointer',\n 'arrow-right',\n 'arrow-right-arrow-left',\n 'arrow-right-from-bracket',\n 'arrow-right-from-file',\n 'arrow-right-long',\n 'arrow-right-rotate',\n 'arrow-right-to-bracket',\n 'arrow-right-to-city',\n 'arrow-right-to-file',\n 'arrow-rotate-back',\n 'arrow-rotate-backward',\n 'arrow-rotate-forward',\n 'arrow-rotate-left',\n 'arrow-rotate-right',\n 'arrow-trend-down',\n 'arrow-trend-up',\n 'arrow-turn-down',\n 'arrow-turn-up',\n 'arrow-up',\n 'arrow-up-1-9',\n 'arrow-up-9-1',\n 'arrow-up-a-z',\n 'arrow-up-from-bracket',\n 'arrow-up-from-ground-water',\n 'arrow-up-from-water-pump',\n 'arrow-up-long',\n 'arrow-up-right-dots',\n 'arrow-up-right-from-square',\n 'arrow-up-short-wide',\n 'arrow-up-wide-short',\n 'arrow-up-z-a',\n 'arrows',\n 'arrows-alt',\n 'arrows-alt-h',\n 'arrows-alt-v',\n 'arrows-down-to-line',\n 'arrows-down-to-people',\n 'arrows-h',\n 'arrows-left-right',\n 'arrows-left-right-to-line',\n 'arrows-rotate',\n 'arrows-spin',\n 'arrows-split-up-and-left',\n 'arrows-to-circle',\n 'arrows-to-dot',\n 'arrows-to-eye',\n 'arrows-turn-right',\n 'arrows-turn-to-dots',\n 'arrows-up-down',\n 'arrows-up-down-left-right',\n 'arrows-up-to-line',\n 'arrows-v',\n 'artstation',\n 'asl-interpreting',\n 'assistive-listening-systems',\n 'asymmetrik',\n 'atlas',\n 'atlassian',\n 'atom',\n 'audible',\n 'audio-description',\n 'austral-sign',\n 'automobile',\n 'autoprefixer',\n 'avianex',\n 'aviato',\n 'award',\n 'aws',\n 'baby',\n 'baby-carriage',\n 'backspace',\n 'backward',\n 'backward-fast',\n 'backward-step',\n 'bacon',\n 'bacteria',\n 'bacterium',\n 'bag-shopping',\n 'bahai',\n 'baht-sign',\n 'balance-scale',\n 'balance-scale-left',\n 'balance-scale-right',\n 'ban',\n 'ban-smoking',\n 'band-aid',\n 'bandage',\n 'bandcamp',\n 'bangladeshi-taka-sign',\n 'bank',\n 'bar-chart',\n 'barcode',\n 'bars',\n 'bars-progress',\n 'bars-staggered',\n 'baseball',\n 'baseball-ball',\n 'baseball-bat-ball',\n 'basket-shopping',\n 'basketball',\n 'basketball-ball',\n 'bath',\n 'bathtub',\n 'battery',\n 'battery-0',\n 'battery-2',\n 'battery-3',\n 'battery-4',\n 'battery-5',\n 'battery-car',\n 'battery-empty',\n 'battery-full',\n 'battery-half',\n 'battery-quarter',\n 'battery-three-quarters',\n 'battle-net',\n 'bed',\n 'bed-pulse',\n 'beer',\n 'beer-mug-empty',\n 'behance',\n 'behance-square',\n 'bell',\n 'bell-concierge',\n 'bell-slash',\n 'bezier-curve',\n 'bgg',\n 'bible',\n 'bicycle',\n 'biking',\n 'bilibili',\n 'bimobject',\n 'binoculars',\n 'biohazard',\n 'birthday-cake',\n 'bitbucket',\n 'bitcoin',\n 'bitcoin-sign',\n 'bity',\n 'black-tie',\n 'blackberry',\n 'blackboard',\n 'blender',\n 'blender-phone',\n 'blind',\n 'blog',\n 'blogger',\n 'blogger-b',\n 'bluesky',\n 'bluetooth',\n 'bluetooth-b',\n 'board-game-geek',\n 'bold',\n 'bolt',\n 'bolt-lightning',\n 'bomb',\n 'bone',\n 'bong',\n 'book',\n 'book-atlas',\n 'book-bible',\n 'book-bookmark',\n 'book-dead',\n 'book-journal-whills',\n 'book-medical',\n 'book-open',\n 'book-open-reader',\n 'book-quran',\n 'book-reader',\n 'book-skull',\n 'book-tanakh',\n 'bookmark',\n 'bootstrap',\n 'border-all',\n 'border-none',\n 'border-style',\n 'border-top-left',\n 'bore-hole',\n 'bots',\n 'bottle-droplet',\n 'bottle-water',\n 'bowl-food',\n 'bowl-rice',\n 'bowling-ball',\n 'box',\n 'box-archive',\n 'box-open',\n 'box-tissue',\n 'boxes',\n 'boxes-alt',\n 'boxes-packing',\n 'boxes-stacked',\n 'braille',\n 'brain',\n 'brave',\n 'brave-reverse',\n 'brazilian-real-sign',\n 'bread-slice',\n 'bridge',\n 'bridge-circle-check',\n 'bridge-circle-exclamation',\n 'bridge-circle-xmark',\n 'bridge-lock',\n 'bridge-water',\n 'briefcase',\n 'briefcase-clock',\n 'briefcase-medical',\n 'broadcast-tower',\n 'broom',\n 'broom-ball',\n 'brush',\n 'btc',\n 'bucket',\n 'buffer',\n 'bug',\n 'bug-slash',\n 'bugs',\n 'build-awesome',\n 'building',\n 'building-circle-arrow-right',\n 'building-circle-check',\n 'building-circle-exclamation',\n 'building-circle-xmark',\n 'building-columns',\n 'building-flag',\n 'building-lock',\n 'building-ngo',\n 'building-shield',\n 'building-un',\n 'building-user',\n 'building-wheat',\n 'bullhorn',\n 'bullseye',\n 'burger',\n 'burn',\n 'buromobelexperte',\n 'burst',\n 'bus',\n 'bus-alt',\n 'bus-side',\n 'bus-simple',\n 'business-time',\n 'buy-n-large',\n 'buysellads',\n 'cab',\n 'cable-car',\n 'cake',\n 'cake-candles',\n 'calculator',\n 'calendar',\n 'calendar-alt',\n 'calendar-check',\n 'calendar-day',\n 'calendar-days',\n 'calendar-minus',\n 'calendar-plus',\n 'calendar-times',\n 'calendar-week',\n 'calendar-xmark',\n 'camera',\n 'camera-alt',\n 'camera-retro',\n 'camera-rotate',\n 'campground',\n 'canadian-maple-leaf',\n 'cancel',\n 'cancer',\n 'candy-cane',\n 'cannabis',\n 'capricorn',\n 'capsules',\n 'car',\n 'car-alt',\n 'car-battery',\n 'car-burst',\n 'car-crash',\n 'car-on',\n 'car-rear',\n 'car-side',\n 'car-tunnel',\n 'caravan',\n 'caret-down',\n 'caret-left',\n 'caret-right',\n 'caret-square-down',\n 'caret-square-left',\n 'caret-square-right',\n 'caret-square-up',\n 'caret-up',\n 'carriage-baby',\n 'carrot',\n 'cart-arrow-down',\n 'cart-flatbed',\n 'cart-flatbed-suitcase',\n 'cart-plus',\n 'cart-shopping',\n 'cash-app',\n 'cash-register',\n 'cat',\n 'cc-amazon-pay',\n 'cc-amex',\n 'cc-apple-pay',\n 'cc-diners-club',\n 'cc-discover',\n 'cc-jcb',\n 'cc-mastercard',\n 'cc-paypal',\n 'cc-stripe',\n 'cc-visa',\n 'cedi-sign',\n 'cent-sign',\n 'centercode',\n 'centos',\n 'certificate',\n 'chain',\n 'chain-broken',\n 'chain-slash',\n 'chair',\n 'chalkboard',\n 'chalkboard-teacher',\n 'chalkboard-user',\n 'champagne-glasses',\n 'charging-station',\n 'chart-area',\n 'chart-bar',\n 'chart-column',\n 'chart-diagram',\n 'chart-gantt',\n 'chart-line',\n 'chart-pie',\n 'chart-simple',\n 'check',\n 'check-circle',\n 'check-double',\n 'check-square',\n 'check-to-slot',\n 'cheese',\n 'chess',\n 'chess-bishop',\n 'chess-board',\n 'chess-king',\n 'chess-knight',\n 'chess-pawn',\n 'chess-queen',\n 'chess-rook',\n 'chevron-circle-down',\n 'chevron-circle-left',\n 'chevron-circle-right',\n 'chevron-circle-up',\n 'chevron-down',\n 'chevron-left',\n 'chevron-right',\n 'chevron-up',\n 'child',\n 'child-combatant',\n 'child-dress',\n 'child-reaching',\n 'child-rifle',\n 'children',\n 'chrome',\n 'chromecast',\n 'church',\n 'circle',\n 'circle-arrow-down',\n 'circle-arrow-left',\n 'circle-arrow-right',\n 'circle-arrow-up',\n 'circle-check',\n 'circle-chevron-down',\n 'circle-chevron-left',\n 'circle-chevron-right',\n 'circle-chevron-up',\n 'circle-dollar-to-slot',\n 'circle-dot',\n 'circle-down',\n 'circle-exclamation',\n 'circle-h',\n 'circle-half-stroke',\n 'circle-info',\n 'circle-left',\n 'circle-minus',\n 'circle-nodes',\n 'circle-notch',\n 'circle-pause',\n 'circle-play',\n 'circle-plus',\n 'circle-question',\n 'circle-radiation',\n 'circle-right',\n 'circle-stop',\n 'circle-up',\n 'circle-user',\n 'circle-xmark',\n 'circle-zulip',\n 'city',\n 'clapperboard',\n 'claude',\n 'clinic-medical',\n 'clipboard',\n 'clipboard-check',\n 'clipboard-list',\n 'clipboard-question',\n 'clipboard-user',\n 'clock',\n 'clock-four',\n 'clock-rotate-left',\n 'clone',\n 'close',\n 'closed-captioning',\n 'closed-captioning-slash',\n 'cloud',\n 'cloud-arrow-down',\n 'cloud-arrow-up',\n 'cloud-bolt',\n 'cloud-download',\n 'cloud-download-alt',\n 'cloud-meatball',\n 'cloud-moon',\n 'cloud-moon-rain',\n 'cloud-rain',\n 'cloud-showers-heavy',\n 'cloud-showers-water',\n 'cloud-sun',\n 'cloud-sun-rain',\n 'cloud-upload',\n 'cloud-upload-alt',\n 'cloudflare',\n 'cloudscale',\n 'cloudsmith',\n 'cloudversify',\n 'clover',\n 'cmplid',\n 'cny',\n 'cocktail',\n 'code',\n 'code-branch',\n 'code-commit',\n 'code-compare',\n 'code-fork',\n 'code-merge',\n 'code-pull-request',\n 'codeberg',\n 'codepen',\n 'codiepie',\n 'coffee',\n 'cog',\n 'cogs',\n 'coins',\n 'colon-sign',\n 'columns',\n 'comment',\n 'comment-alt',\n 'comment-dollar',\n 'comment-dots',\n 'comment-medical',\n 'comment-nodes',\n 'comment-slash',\n 'comment-sms',\n 'commenting',\n 'comments',\n 'comments-dollar',\n 'compact-disc',\n 'compass',\n 'compass-drafting',\n 'compress',\n 'compress-alt',\n 'compress-arrows-alt',\n 'computer',\n 'computer-mouse',\n 'concierge-bell',\n 'confluence',\n 'connectdevelop',\n 'contact-book',\n 'contact-card',\n 'contao',\n 'cookie',\n 'cookie-bite',\n 'copilot',\n 'copy',\n 'copyright',\n 'cotton-bureau',\n 'couch',\n 'cow',\n 'cpanel',\n 'creative-commons',\n 'creative-commons-by',\n 'creative-commons-nc',\n 'creative-commons-nc-eu',\n 'creative-commons-nc-jp',\n 'creative-commons-nd',\n 'creative-commons-pd',\n 'creative-commons-pd-alt',\n 'creative-commons-remix',\n 'creative-commons-sa',\n 'creative-commons-sampling',\n 'creative-commons-sampling-plus',\n 'creative-commons-share',\n 'creative-commons-zero',\n 'credit-card',\n 'credit-card-alt',\n 'critical-role',\n 'crop',\n 'crop-alt',\n 'crop-simple',\n 'cross',\n 'crosshairs',\n 'crow',\n 'crown',\n 'crutch',\n 'cruzeiro-sign',\n 'css',\n 'css3',\n 'css3-alt',\n 'cube',\n 'cubes',\n 'cubes-stacked',\n 'cut',\n 'cutlery',\n 'cuttlefish',\n 'd-and-d',\n 'd-and-d-beyond',\n 'dailymotion',\n 'dart-lang',\n 'dashboard',\n 'dashcube',\n 'database',\n 'deaf',\n 'deafness',\n 'debian',\n 'dedent',\n 'deezer',\n 'delete-left',\n 'delicious',\n 'democrat',\n 'deploydog',\n 'deskpro',\n 'desktop',\n 'desktop-alt',\n 'dev',\n 'deviantart',\n 'devpost',\n 'dharmachakra',\n 'dhl',\n 'diagnoses',\n 'diagram-next',\n 'diagram-predecessor',\n 'diagram-project',\n 'diagram-successor',\n 'diamond',\n 'diamond-turn-right',\n 'diaspora',\n 'dice',\n 'dice-d20',\n 'dice-d6',\n 'dice-five',\n 'dice-four',\n 'dice-one',\n 'dice-six',\n 'dice-three',\n 'dice-two',\n 'digg',\n 'digging',\n 'digital-ocean',\n 'digital-tachograph',\n 'directions',\n 'discord',\n 'discourse',\n 'disease',\n 'display',\n 'disqus',\n 'divide',\n 'dizzy',\n 'dna',\n 'dochub',\n 'docker',\n 'dog',\n 'dolibarr',\n 'dolly',\n 'dolly-box',\n 'dolly-flatbed',\n 'donate',\n 'dong-sign',\n 'door-closed',\n 'door-open',\n 'dot-circle',\n 'dove',\n 'down-left-and-up-right-to-center',\n 'down-long',\n 'download',\n 'draft2digital',\n 'drafting-compass',\n 'dragon',\n 'draw-polygon',\n 'dribbble',\n 'dribbble-square',\n 'drivers-license',\n 'dropbox',\n 'droplet',\n 'droplet-slash',\n 'drum',\n 'drum-steelpan',\n 'drumstick-bite',\n 'drupal',\n 'dumbbell',\n 'dumpster',\n 'dumpster-fire',\n 'dungeon',\n 'duolingo',\n 'dyalog',\n 'ear-deaf',\n 'ear-listen',\n 'earlybirds',\n 'earth',\n 'earth-africa',\n 'earth-america',\n 'earth-americas',\n 'earth-asia',\n 'earth-europe',\n 'earth-oceania',\n 'ebay',\n 'edge',\n 'edge-legacy',\n 'edit',\n 'egg',\n 'eject',\n 'elementor',\n 'elevator',\n 'eleventy',\n 'ellipsis',\n 'ellipsis-h',\n 'ellipsis-v',\n 'ellipsis-vertical',\n 'ello',\n 'ember',\n 'empire',\n 'envelope',\n 'envelope-circle-check',\n 'envelope-open',\n 'envelope-open-text',\n 'envelope-square',\n 'envelopes-bulk',\n 'envira',\n 'eraser',\n 'erlang',\n 'ethereum',\n 'ethernet',\n 'etsy',\n 'eur',\n 'euro',\n 'euro-sign',\n 'evernote',\n 'exchange',\n 'exchange-alt',\n 'exclamation-circle',\n 'exclamation-triangle',\n 'expand',\n 'expand-alt',\n 'expand-arrows-alt',\n 'expeditedssl',\n 'explosion',\n 'external-link',\n 'external-link-alt',\n 'external-link-square',\n 'external-link-square-alt',\n 'eye',\n 'eye-dropper',\n 'eye-dropper-empty',\n 'eye-low-vision',\n 'eye-slash',\n 'eyedropper',\n 'face-angry',\n 'face-dizzy',\n 'face-flushed',\n 'face-frown',\n 'face-frown-open',\n 'face-grimace',\n 'face-grin',\n 'face-grin-beam',\n 'face-grin-beam-sweat',\n 'face-grin-hearts',\n 'face-grin-squint',\n 'face-grin-squint-tears',\n 'face-grin-stars',\n 'face-grin-tears',\n 'face-grin-tongue',\n 'face-grin-tongue-squint',\n 'face-grin-tongue-wink',\n 'face-grin-wide',\n 'face-grin-wink',\n 'face-kiss',\n 'face-kiss-beam',\n 'face-kiss-wink-heart',\n 'face-laugh',\n 'face-laugh-beam',\n 'face-laugh-squint',\n 'face-laugh-wink',\n 'face-meh',\n 'face-meh-blank',\n 'face-rolling-eyes',\n 'face-sad-cry',\n 'face-sad-tear',\n 'face-smile',\n 'face-smile-beam',\n 'face-smile-wink',\n 'face-surprise',\n 'face-tired',\n 'facebook',\n 'facebook-f',\n 'facebook-messenger',\n 'facebook-square',\n 'fan',\n 'fantasy-flight-games',\n 'fast-backward',\n 'fast-forward',\n 'faucet',\n 'faucet-drip',\n 'fax',\n 'feather',\n 'feather-alt',\n 'feather-pointed',\n 'fedex',\n 'fediverse',\n 'fedora',\n 'feed',\n 'female',\n 'ferry',\n 'fighter-jet',\n 'figma',\n 'file',\n 'file-alt',\n 'file-archive',\n 'file-arrow-down',\n 'file-arrow-up',\n 'file-audio',\n 'file-circle-check',\n 'file-circle-exclamation',\n 'file-circle-minus',\n 'file-circle-plus',\n 'file-circle-question',\n 'file-circle-xmark',\n 'file-clipboard',\n 'file-code',\n 'file-contract',\n 'file-csv',\n 'file-download',\n 'file-edit',\n 'file-excel',\n 'file-export',\n 'file-fragment',\n 'file-half-dashed',\n 'file-image',\n 'file-import',\n 'file-invoice',\n 'file-invoice-dollar',\n 'file-lines',\n 'file-medical',\n 'file-medical-alt',\n 'file-pdf',\n 'file-pen',\n 'file-powerpoint',\n 'file-prescription',\n 'file-shield',\n 'file-signature',\n 'file-text',\n 'file-upload',\n 'file-video',\n 'file-waveform',\n 'file-word',\n 'file-zipper',\n 'files-pinwheel',\n 'fill',\n 'fill-drip',\n 'film',\n 'film-alt',\n 'film-simple',\n 'filter',\n 'filter-circle-dollar',\n 'filter-circle-xmark',\n 'fingerprint',\n 'fire',\n 'fire-alt',\n 'fire-burner',\n 'fire-extinguisher',\n 'fire-flame-curved',\n 'fire-flame-simple',\n 'firefox',\n 'firefox-browser',\n 'first-aid',\n 'first-order',\n 'first-order-alt',\n 'firstdraft',\n 'fish',\n 'fish-fins',\n 'fist-raised',\n 'flag',\n 'flag-checkered',\n 'flag-usa',\n 'flask',\n 'flask-vial',\n 'flickr',\n 'flipboard',\n 'floppy-disk',\n 'florin-sign',\n 'flushed',\n 'flutter',\n 'fly',\n 'folder',\n 'folder-blank',\n 'folder-closed',\n 'folder-minus',\n 'folder-open',\n 'folder-plus',\n 'folder-tree',\n 'font',\n 'font-awesome',\n 'font-awesome-alt',\n 'font-awesome-flag',\n 'font-awesome-logo-full',\n 'fonticons',\n 'fonticons-fi',\n 'football',\n 'football-ball',\n 'forgejo',\n 'fort-awesome',\n 'fort-awesome-alt',\n 'forumbee',\n 'forward',\n 'forward-fast',\n 'forward-step',\n 'foursquare',\n 'franc-sign',\n 'free-code-camp',\n 'freebsd',\n 'frog',\n 'frown',\n 'frown-open',\n 'fulcrum',\n 'funnel-dollar',\n 'futbol',\n 'futbol-ball',\n 'galactic-republic',\n 'galactic-senate',\n 'gamepad',\n 'gas-pump',\n 'gauge',\n 'gauge-high',\n 'gauge-med',\n 'gauge-simple',\n 'gauge-simple-high',\n 'gauge-simple-med',\n 'gavel',\n 'gbp',\n 'gear',\n 'gears',\n 'gem',\n 'gemini',\n 'genderless',\n 'get-pocket',\n 'gg',\n 'gg-circle',\n 'ghost',\n 'gift',\n 'gifts',\n 'git',\n 'git-alt',\n 'git-square',\n 'gitee',\n 'github',\n 'github-alt',\n 'github-square',\n 'gitkraken',\n 'gitlab',\n 'gitlab-square',\n 'gitter',\n 'glass-cheers',\n 'glass-martini',\n 'glass-martini-alt',\n 'glass-water',\n 'glass-water-droplet',\n 'glass-whiskey',\n 'glasses',\n 'glide',\n 'glide-g',\n 'globaleaks',\n 'globe',\n 'globe-africa',\n 'globe-americas',\n 'globe-asia',\n 'globe-europe',\n 'globe-oceania',\n 'gofore',\n 'golang',\n 'golf-ball',\n 'golf-ball-tee',\n 'goodreads',\n 'goodreads-g',\n 'google',\n 'google-drive',\n 'google-pay',\n 'google-play',\n 'google-plus',\n 'google-plus-g',\n 'google-plus-square',\n 'google-scholar',\n 'google-wallet',\n 'gopuram',\n 'graduation-cap',\n 'gratipay',\n 'grav',\n 'greater-than-equal',\n 'grid-horizontal',\n 'grid-vertical',\n 'grimace',\n 'grin',\n 'grin-alt',\n 'grin-beam',\n 'grin-beam-sweat',\n 'grin-hearts',\n 'grin-squint',\n 'grin-squint-tears',\n 'grin-stars',\n 'grin-tears',\n 'grin-tongue',\n 'grin-tongue-squint',\n 'grin-tongue-wink',\n 'grin-wink',\n 'grip',\n 'grip-horizontal',\n 'grip-lines',\n 'grip-lines-vertical',\n 'grip-vertical',\n 'gripfire',\n 'group-arrows-rotate',\n 'grunt',\n 'guarani-sign',\n 'guilded',\n 'guitar',\n 'gulp',\n 'gun',\n 'h-square',\n 'hacker-news',\n 'hacker-news-square',\n 'hackerrank',\n 'hamburger',\n 'hammer',\n 'hamsa',\n 'hand',\n 'hand-back-fist',\n 'hand-dots',\n 'hand-fist',\n 'hand-holding',\n 'hand-holding-dollar',\n 'hand-holding-droplet',\n 'hand-holding-hand',\n 'hand-holding-heart',\n 'hand-holding-medical',\n 'hand-holding-usd',\n 'hand-holding-water',\n 'hand-lizard',\n 'hand-middle-finger',\n 'hand-paper',\n 'hand-peace',\n 'hand-point-down',\n 'hand-point-left',\n 'hand-point-right',\n 'hand-point-up',\n 'hand-pointer',\n 'hand-rock',\n 'hand-scissors',\n 'hand-sparkles',\n 'hand-spock',\n 'handcuffs',\n 'hands',\n 'hands-american-sign-language-interpreting',\n 'hands-asl-interpreting',\n 'hands-bound',\n 'hands-bubbles',\n 'hands-clapping',\n 'hands-helping',\n 'hands-holding',\n 'hands-holding-child',\n 'hands-holding-circle',\n 'hands-praying',\n 'hands-wash',\n 'handshake',\n 'handshake-alt',\n 'handshake-alt-slash',\n 'handshake-angle',\n 'handshake-simple',\n 'handshake-simple-slash',\n 'handshake-slash',\n 'hanukiah',\n 'hard-drive',\n 'hard-hat',\n 'hard-of-hearing',\n 'hashnode',\n 'hat-cowboy',\n 'hat-cowboy-side',\n 'hat-hard',\n 'hat-wizard',\n 'haykal',\n 'hdd',\n 'head-side-cough',\n 'head-side-cough-slash',\n 'head-side-mask',\n 'head-side-virus',\n 'header',\n 'heading',\n 'headphones',\n 'headphones-alt',\n 'headphones-simple',\n 'headset',\n 'heart',\n 'heart-broken',\n 'heart-circle-bolt',\n 'heart-circle-check',\n 'heart-circle-exclamation',\n 'heart-circle-minus',\n 'heart-circle-plus',\n 'heart-circle-xmark',\n 'heart-crack',\n 'heart-music-camera-bolt',\n 'heart-pulse',\n 'heartbeat',\n 'helicopter',\n 'helicopter-symbol',\n 'helmet-safety',\n 'helmet-un',\n 'heptagon',\n 'hexagon',\n 'hexagon-nodes',\n 'hexagon-nodes-bolt',\n 'highlighter',\n 'hiking',\n 'hill-avalanche',\n 'hill-rockslide',\n 'hippo',\n 'hips',\n 'hire-a-helper',\n 'history',\n 'hive',\n 'hockey-puck',\n 'holly-berry',\n 'home',\n 'home-alt',\n 'home-lg',\n 'home-lg-alt',\n 'home-user',\n 'hooli',\n 'hornbill',\n 'horse',\n 'horse-head',\n 'hospital',\n 'hospital-alt',\n 'hospital-symbol',\n 'hospital-user',\n 'hospital-wide',\n 'hot-tub',\n 'hot-tub-person',\n 'hotdog',\n 'hotel',\n 'hotjar',\n 'hourglass',\n 'hourglass-1',\n 'hourglass-2',\n 'hourglass-3',\n 'hourglass-empty',\n 'hourglass-end',\n 'hourglass-half',\n 'hourglass-start',\n 'house',\n 'house-chimney',\n 'house-chimney-crack',\n 'house-chimney-medical',\n 'house-chimney-user',\n 'house-chimney-window',\n 'house-circle-check',\n 'house-circle-exclamation',\n 'house-circle-xmark',\n 'house-crack',\n 'house-damage',\n 'house-fire',\n 'house-flag',\n 'house-flood-water',\n 'house-flood-water-circle-arrow-right',\n 'house-laptop',\n 'house-lock',\n 'house-medical',\n 'house-medical-circle-check',\n 'house-medical-circle-exclamation',\n 'house-medical-circle-xmark',\n 'house-medical-flag',\n 'house-signal',\n 'house-tsunami',\n 'house-user',\n 'houzz',\n 'hryvnia',\n 'hryvnia-sign',\n 'html5',\n 'hubspot',\n 'hugging-face',\n 'hurricane',\n 'i-cursor',\n 'ice-cream',\n 'icicles',\n 'icons',\n 'id-badge',\n 'id-card',\n 'id-card-alt',\n 'id-card-clip',\n 'ideal',\n 'igloo',\n 'ils',\n 'image',\n 'image-portrait',\n 'images',\n 'imdb',\n 'inbox',\n 'indent',\n 'indian-rupee',\n 'indian-rupee-sign',\n 'industry',\n 'infinity',\n 'info',\n 'info-circle',\n 'innosoft',\n 'inr',\n 'instagram',\n 'instagram-square',\n 'instalod',\n 'institution',\n 'intercom',\n 'internet-archive',\n 'internet-explorer',\n 'invision',\n 'ioxhost',\n 'italic',\n 'itch-io',\n 'itunes',\n 'itunes-note',\n 'jar',\n 'jar-wheat',\n 'java',\n 'jedi',\n 'jedi-order',\n 'jenkins',\n 'jet-fighter',\n 'jet-fighter-up',\n 'jira',\n 'joget',\n 'joint',\n 'joomla',\n 'journal-whills',\n 'jpy',\n 'js',\n 'js-square',\n 'jsfiddle',\n 'jug-detergent',\n 'julia',\n 'jxl',\n 'kaaba',\n 'kaggle',\n 'kakao-talk',\n 'key',\n 'keybase',\n 'keyboard',\n 'keycdn',\n 'khanda',\n 'kickstarter',\n 'kickstarter-k',\n 'kip-sign',\n 'kiss',\n 'kiss-beam',\n 'kiss-wink-heart',\n 'kit-medical',\n 'kitchen-set',\n 'kiwi-bird',\n 'ko-fi',\n 'korvue',\n 'krw',\n 'kubernetes',\n 'ladder-water',\n 'land-mine-on',\n 'landmark',\n 'landmark-alt',\n 'landmark-dome',\n 'landmark-flag',\n 'language',\n 'laptop',\n 'laptop-code',\n 'laptop-file',\n 'laptop-house',\n 'laptop-medical',\n 'laravel',\n 'lari-sign',\n 'lastfm',\n 'lastfm-square',\n 'laugh',\n 'laugh-beam',\n 'laugh-squint',\n 'laugh-wink',\n 'layer-group',\n 'leaf',\n 'leanpub',\n 'leetcode',\n 'left-long',\n 'left-right',\n 'legal',\n 'lemon',\n 'leo',\n 'less',\n 'less-than-equal',\n 'lets-encrypt',\n 'letterboxd',\n 'level-down',\n 'level-down-alt',\n 'level-up',\n 'level-up-alt',\n 'libra',\n 'life-ring',\n 'lightbulb',\n 'line',\n 'line-chart',\n 'lines-leaning',\n 'link',\n 'link-slash',\n 'linkedin',\n 'linkedin-in',\n 'linktree',\n 'linode',\n 'linux',\n 'lira-sign',\n 'list',\n 'list-1-2',\n 'list-alt',\n 'list-check',\n 'list-dots',\n 'list-numeric',\n 'list-ol',\n 'list-squares',\n 'list-ul',\n 'litecoin-sign',\n 'location',\n 'location-arrow',\n 'location-crosshairs',\n 'location-dot',\n 'location-pin',\n 'location-pin-lock',\n 'lock',\n 'lock-open',\n 'locust',\n 'long-arrow-alt-down',\n 'long-arrow-alt-left',\n 'long-arrow-alt-right',\n 'long-arrow-alt-up',\n 'long-arrow-down',\n 'long-arrow-left',\n 'long-arrow-right',\n 'long-arrow-up',\n 'lotus',\n 'low-vision',\n 'luggage-cart',\n 'lumon',\n 'lumon-drop',\n 'lungs',\n 'lungs-virus',\n 'lyft',\n 'magento',\n 'magic',\n 'magic-wand-sparkles',\n 'magnet',\n 'magnifying-glass',\n 'magnifying-glass-arrow-right',\n 'magnifying-glass-chart',\n 'magnifying-glass-dollar',\n 'magnifying-glass-location',\n 'magnifying-glass-minus',\n 'magnifying-glass-plus',\n 'mail-bulk',\n 'mail-forward',\n 'mail-reply',\n 'mail-reply-all',\n 'mailchimp',\n 'male',\n 'manat-sign',\n 'mandalorian',\n 'map',\n 'map-location',\n 'map-location-dot',\n 'map-marked',\n 'map-marked-alt',\n 'map-marker',\n 'map-marker-alt',\n 'map-pin',\n 'map-signs',\n 'markdown',\n 'marker',\n 'mars',\n 'mars-and-venus',\n 'mars-and-venus-burst',\n 'mars-double',\n 'mars-stroke',\n 'mars-stroke-h',\n 'mars-stroke-right',\n 'mars-stroke-up',\n 'mars-stroke-v',\n 'martini-glass',\n 'martini-glass-citrus',\n 'martini-glass-empty',\n 'mask',\n 'mask-face',\n 'mask-ventilator',\n 'masks-theater',\n 'mastodon',\n 'matrix',\n 'mattermost',\n 'mattress-pillow',\n 'maxcdn',\n 'maximize',\n 'mdb',\n 'medal',\n 'medapps',\n 'medium',\n 'medium-m',\n 'medkit',\n 'medrt',\n 'meetup',\n 'megaport',\n 'meh',\n 'meh-blank',\n 'meh-rolling-eyes',\n 'memory',\n 'mendeley',\n 'menorah',\n 'mercury',\n 'message',\n 'meta',\n 'meteor',\n 'microblog',\n 'microchip',\n 'microphone',\n 'microphone-alt',\n 'microphone-alt-slash',\n 'microphone-lines',\n 'microphone-lines-slash',\n 'microphone-slash',\n 'microscope',\n 'microsoft',\n 'mill-sign',\n 'minimize',\n 'mintbit',\n 'minus',\n 'minus-circle',\n 'minus-square',\n 'mitten',\n 'mix',\n 'mixcloud',\n 'mixer',\n 'mizuni',\n 'mobile',\n 'mobile-alt',\n 'mobile-android',\n 'mobile-android-alt',\n 'mobile-button',\n 'mobile-phone',\n 'mobile-retro',\n 'mobile-screen',\n 'mobile-screen-button',\n 'mobile-vibrate',\n 'modx',\n 'monero',\n 'money-bill',\n 'money-bill-1',\n 'money-bill-1-wave',\n 'money-bill-alt',\n 'money-bill-transfer',\n 'money-bill-trend-up',\n 'money-bill-wave',\n 'money-bill-wave-alt',\n 'money-bill-wheat',\n 'money-bills',\n 'money-check',\n 'money-check-alt',\n 'money-check-dollar',\n 'monument',\n 'moon',\n 'mortar-board',\n 'mortar-pestle',\n 'mosque',\n 'mosquito',\n 'mosquito-net',\n 'motorcycle',\n 'mound',\n 'mountain',\n 'mountain-city',\n 'mountain-sun',\n 'mouse',\n 'mouse-pointer',\n 'mug-hot',\n 'mug-saucer',\n 'multiply',\n 'museum',\n 'music',\n 'naira-sign',\n 'napster',\n 'navicon',\n 'neos',\n 'network-wired',\n 'neuter',\n 'newspaper',\n 'nextcloud',\n 'nfc-directional',\n 'nfc-symbol',\n 'nimblr',\n 'node',\n 'node-js',\n 'non-binary',\n 'not-equal',\n 'notdef',\n 'note-sticky',\n 'notes-medical',\n 'notion',\n 'npm',\n 'ns8',\n 'nutritionix',\n 'object-group',\n 'object-ungroup',\n 'obs-studio',\n 'obsidian',\n 'octagon',\n 'octopus-deploy',\n 'odnoklassniki',\n 'odnoklassniki-square',\n 'odysee',\n 'oil-can',\n 'oil-well',\n 'old-republic',\n 'om',\n 'openai',\n 'opencart',\n 'openid',\n 'openstreetmap',\n 'opensuse',\n 'opera',\n 'optin-monster',\n 'orcid',\n 'osi',\n 'otter',\n 'outdent',\n 'padlet',\n 'page4',\n 'pagelines',\n 'pager',\n 'paint-brush',\n 'paint-roller',\n 'paintbrush',\n 'palette',\n 'palfed',\n 'pallet',\n 'pandora',\n 'panorama',\n 'paper-plane',\n 'paperclip',\n 'parachute-box',\n 'paragraph',\n 'parking',\n 'passport',\n 'pastafarianism',\n 'paste',\n 'patreon',\n 'pause',\n 'pause-circle',\n 'paw',\n 'paypal',\n 'peace',\n 'pen',\n 'pen-alt',\n 'pen-clip',\n 'pen-fancy',\n 'pen-nib',\n 'pen-ruler',\n 'pen-square',\n 'pen-to-square',\n 'pencil',\n 'pencil-alt',\n 'pencil-ruler',\n 'pencil-square',\n 'pentagon',\n 'people-arrows',\n 'people-arrows-left-right',\n 'people-carry',\n 'people-carry-box',\n 'people-group',\n 'people-line',\n 'people-pulling',\n 'people-robbery',\n 'people-roof',\n 'pepper-hot',\n 'perbyte',\n 'periscope',\n 'person',\n 'person-arrow-down-to-line',\n 'person-arrow-up-from-line',\n 'person-biking',\n 'person-booth',\n 'person-breastfeeding',\n 'person-burst',\n 'person-cane',\n 'person-chalkboard',\n 'person-circle-check',\n 'person-circle-exclamation',\n 'person-circle-minus',\n 'person-circle-plus',\n 'person-circle-question',\n 'person-circle-xmark',\n 'person-digging',\n 'person-dots-from-line',\n 'person-dress',\n 'person-dress-burst',\n 'person-drowning',\n 'person-falling',\n 'person-falling-burst',\n 'person-half-dress',\n 'person-harassing',\n 'person-hiking',\n 'person-military-pointing',\n 'person-military-rifle',\n 'person-military-to-person',\n 'person-praying',\n 'person-pregnant',\n 'person-rays',\n 'person-rifle',\n 'person-running',\n 'person-shelter',\n 'person-skating',\n 'person-skiing',\n 'person-skiing-nordic',\n 'person-snowboarding',\n 'person-swimming',\n 'person-through-window',\n 'person-walking',\n 'person-walking-arrow-loop-left',\n 'person-walking-arrow-right',\n 'person-walking-dashed-line-arrow-right',\n 'person-walking-luggage',\n 'person-walking-with-cane',\n 'peseta-sign',\n 'peso-sign',\n 'phabricator',\n 'phoenix-framework',\n 'phoenix-squadron',\n 'phone',\n 'phone-alt',\n 'phone-flip',\n 'phone-slash',\n 'phone-square',\n 'phone-square-alt',\n 'phone-volume',\n 'photo-film',\n 'photo-video',\n 'php',\n 'picture-in-picture',\n 'pie-chart',\n 'pied-piper',\n 'pied-piper-alt',\n 'pied-piper-hat',\n 'pied-piper-pp',\n 'pied-piper-square',\n 'piggy-bank',\n 'pills',\n 'ping-pong-paddle-ball',\n 'pinterest',\n 'pinterest-p',\n 'pinterest-square',\n 'pisces',\n 'pix',\n 'pixelfed',\n 'pixiv',\n 'pizza-slice',\n 'place-of-worship',\n 'plane',\n 'plane-arrival',\n 'plane-circle-check',\n 'plane-circle-exclamation',\n 'plane-circle-xmark',\n 'plane-departure',\n 'plane-lock',\n 'plane-slash',\n 'plane-up',\n 'plant-wilt',\n 'plate-wheat',\n 'play',\n 'play-circle',\n 'playstation',\n 'plug',\n 'plug-circle-bolt',\n 'plug-circle-check',\n 'plug-circle-exclamation',\n 'plug-circle-minus',\n 'plug-circle-plus',\n 'plug-circle-xmark',\n 'plus-circle',\n 'plus-minus',\n 'plus-square',\n 'podcast',\n 'poll',\n 'poll-h',\n 'poo',\n 'poo-bolt',\n 'poo-storm',\n 'poop',\n 'portrait',\n 'postgresql',\n 'pound-sign',\n 'power-off',\n 'pray',\n 'praying-hands',\n 'prescription',\n 'prescription-bottle',\n 'prescription-bottle-alt',\n 'prescription-bottle-medical',\n 'print',\n 'procedures',\n 'product-hunt',\n 'project-diagram',\n 'pump-medical',\n 'pump-soap',\n 'pushed',\n 'puzzle-piece',\n 'python',\n 'qq',\n 'qrcode',\n 'question-circle',\n 'quidditch',\n 'quidditch-broom-ball',\n 'quinscape',\n 'quora',\n 'quote-left',\n 'quote-left-alt',\n 'quote-right',\n 'quote-right-alt',\n 'quran',\n 'r-project',\n 'radiation',\n 'radiation-alt',\n 'radio',\n 'rainbow',\n 'random',\n 'ranking-star',\n 'raspberry-pi',\n 'ravelry',\n 'react',\n 'reacteurope',\n 'readme',\n 'rebel',\n 'receipt',\n 'record-vinyl',\n 'rectangle-ad',\n 'rectangle-list',\n 'rectangle-times',\n 'rectangle-xmark',\n 'recycle',\n 'red-river',\n 'reddit',\n 'reddit-alien',\n 'reddit-square',\n 'redhat',\n 'redo',\n 'redo-alt',\n 'refresh',\n 'registered',\n 'remove',\n 'remove-format',\n 'rendact',\n 'renren',\n 'reorder',\n 'repeat',\n 'reply',\n 'reply-all',\n 'replyd',\n 'republican',\n 'researchgate',\n 'resolving',\n 'restroom',\n 'retweet',\n 'rev',\n 'ribbon',\n 'right-from-bracket',\n 'right-left',\n 'right-long',\n 'right-to-bracket',\n 'ring',\n 'rmb',\n 'road',\n 'road-barrier',\n 'road-bridge',\n 'road-circle-check',\n 'road-circle-exclamation',\n 'road-circle-xmark',\n 'road-lock',\n 'road-spikes',\n 'roblox-creator-studio',\n 'robot',\n 'rocket',\n 'rocketchat',\n 'rockrms',\n 'rod-asclepius',\n 'rod-snake',\n 'ror',\n 'rotate',\n 'rotate-back',\n 'rotate-backward',\n 'rotate-forward',\n 'rotate-left',\n 'rotate-right',\n 'rouble',\n 'route',\n 'rss',\n 'rss-square',\n 'rub',\n 'ruble',\n 'ruble-sign',\n 'rug',\n 'ruler',\n 'ruler-combined',\n 'ruler-horizontal',\n 'ruler-vertical',\n 'running',\n 'rupee',\n 'rupee-sign',\n 'rupiah-sign',\n 'rust',\n 'sack-dollar',\n 'sack-xmark',\n 'sad-cry',\n 'sad-tear',\n 'safari',\n 'sagittarius',\n 'sailboat',\n 'salesforce',\n 'sass',\n 'satellite',\n 'satellite-dish',\n 'save',\n 'scale-balanced',\n 'scale-unbalanced',\n 'scale-unbalanced-flip',\n 'scaleway',\n 'schlix',\n 'school',\n 'school-circle-check',\n 'school-circle-exclamation',\n 'school-circle-xmark',\n 'school-flag',\n 'school-lock',\n 'scissors',\n 'scorpio',\n 'screenpal',\n 'screwdriver',\n 'screwdriver-wrench',\n 'scribd',\n 'scroll',\n 'scroll-torah',\n 'sd-card',\n 'search',\n 'search-dollar',\n 'search-location',\n 'search-minus',\n 'search-plus',\n 'searchengin',\n 'section',\n 'seedling',\n 'sellcast',\n 'sellsy',\n 'septagon',\n 'server',\n 'servicestack',\n 'shapes',\n 'share',\n 'share-alt',\n 'share-alt-square',\n 'share-from-square',\n 'share-nodes',\n 'share-square',\n 'sheet-plastic',\n 'shekel',\n 'shekel-sign',\n 'sheqel',\n 'sheqel-sign',\n 'shield',\n 'shield-alt',\n 'shield-blank',\n 'shield-cat',\n 'shield-dog',\n 'shield-halved',\n 'shield-heart',\n 'shield-virus',\n 'ship',\n 'shipping-fast',\n 'shirt',\n 'shirtsinbulk',\n 'shoe-prints',\n 'shoelace',\n 'shop',\n 'shop-lock',\n 'shop-slash',\n 'shopify',\n 'shopping-bag',\n 'shopping-basket',\n 'shopping-cart',\n 'shopware',\n 'shower',\n 'shrimp',\n 'shuffle',\n 'shuttle-space',\n 'shuttle-van',\n 'sign',\n 'sign-hanging',\n 'sign-in',\n 'sign-in-alt',\n 'sign-language',\n 'sign-out',\n 'sign-out-alt',\n 'signal',\n 'signal-5',\n 'signal-messenger',\n 'signal-perfect',\n 'signature',\n 'signing',\n 'signs-post',\n 'sim-card',\n 'simplybuilt',\n 'single-quote-left',\n 'single-quote-right',\n 'sink',\n 'sistrix',\n 'sitemap',\n 'sith',\n 'sitrox',\n 'skating',\n 'sketch',\n 'skiing',\n 'skiing-nordic',\n 'skull',\n 'skull-crossbones',\n 'skyatlas',\n 'skype',\n 'slack',\n 'slack-hash',\n 'slash',\n 'sleigh',\n 'sliders',\n 'sliders-h',\n 'slideshare',\n 'smile',\n 'smile-beam',\n 'smile-wink',\n 'smog',\n 'smoking',\n 'smoking-ban',\n 'sms',\n 'snapchat',\n 'snapchat-ghost',\n 'snapchat-square',\n 'snowboarding',\n 'snowflake',\n 'snowman',\n 'snowplow',\n 'soap',\n 'soccer-ball',\n 'socks',\n 'solana',\n 'solar-panel',\n 'sort',\n 'sort-alpha-asc',\n 'sort-alpha-desc',\n 'sort-alpha-down',\n 'sort-alpha-down-alt',\n 'sort-alpha-up',\n 'sort-alpha-up-alt',\n 'sort-amount-asc',\n 'sort-amount-desc',\n 'sort-amount-down',\n 'sort-amount-down-alt',\n 'sort-amount-up',\n 'sort-amount-up-alt',\n 'sort-asc',\n 'sort-desc',\n 'sort-down',\n 'sort-numeric-asc',\n 'sort-numeric-desc',\n 'sort-numeric-down',\n 'sort-numeric-down-alt',\n 'sort-numeric-up',\n 'sort-numeric-up-alt',\n 'sort-up',\n 'soundcloud',\n 'sourcetree',\n 'spa',\n 'space-awesome',\n 'space-shuttle',\n 'spaghetti-monster-flying',\n 'speakap',\n 'speaker-deck',\n 'spell-check',\n 'spider',\n 'spinner',\n 'spiral',\n 'splotch',\n 'spoon',\n 'spotify',\n 'spray-can',\n 'spray-can-sparkles',\n 'sprout',\n 'square',\n 'square-arrow-up-right',\n 'square-behance',\n 'square-binary',\n 'square-bluesky',\n 'square-build-awesome-stroke',\n 'square-caret-down',\n 'square-caret-left',\n 'square-caret-right',\n 'square-caret-up',\n 'square-check',\n 'square-deskpro',\n 'square-dribbble',\n 'square-envelope',\n 'square-facebook',\n 'square-figma',\n 'square-font-awesome',\n 'square-font-awesome-stroke',\n 'square-full',\n 'square-git',\n 'square-github',\n 'square-gitlab',\n 'square-google-plus',\n 'square-h',\n 'square-hacker-news',\n 'square-instagram',\n 'square-js',\n 'square-kickstarter',\n 'square-lastfm',\n 'square-letterboxd',\n 'square-linkedin',\n 'square-minus',\n 'square-nfi',\n 'square-odnoklassniki',\n 'square-parking',\n 'square-pen',\n 'square-person-confined',\n 'square-phone',\n 'square-phone-flip',\n 'square-pied-piper',\n 'square-pinterest',\n 'square-plus',\n 'square-poll-horizontal',\n 'square-poll-vertical',\n 'square-reddit',\n 'square-root-alt',\n 'square-root-variable',\n 'square-rss',\n 'square-share-nodes',\n 'square-snapchat',\n 'square-steam',\n 'square-threads',\n 'square-tumblr',\n 'square-twitter',\n 'square-up-right',\n 'square-upwork',\n 'square-viadeo',\n 'square-vimeo',\n 'square-virus',\n 'square-web-awesome',\n 'square-web-awesome-stroke',\n 'square-whatsapp',\n 'square-x-twitter',\n 'square-xing',\n 'square-xmark',\n 'square-youtube',\n 'squarespace',\n 'stack-exchange',\n 'stack-overflow',\n 'stackpath',\n 'staff-aesculapius',\n 'staff-snake',\n 'stairs',\n 'stamp',\n 'stapler',\n 'star',\n 'star-and-crescent',\n 'star-half',\n 'star-half-alt',\n 'star-half-stroke',\n 'star-of-david',\n 'star-of-life',\n 'staylinked',\n 'steam',\n 'steam-square',\n 'steam-symbol',\n 'step-backward',\n 'step-forward',\n 'sterling-sign',\n 'stethoscope',\n 'sticker-mule',\n 'sticky-note',\n 'stop',\n 'stop-circle',\n 'stopwatch',\n 'stopwatch-20',\n 'store',\n 'store-alt',\n 'store-alt-slash',\n 'store-slash',\n 'storybook',\n 'strava',\n 'stream',\n 'street-view',\n 'strikethrough',\n 'stripe',\n 'stripe-s',\n 'stroopwafel',\n 'stubber',\n 'studiovinari',\n 'stumbleupon',\n 'stumbleupon-circle',\n 'subscript',\n 'substack',\n 'subtract',\n 'subway',\n 'suitcase',\n 'suitcase-medical',\n 'suitcase-rolling',\n 'sun',\n 'sun-plant-wilt',\n 'superpowers',\n 'superscript',\n 'supple',\n 'supportnow',\n 'surprise',\n 'suse',\n 'svelte',\n 'swatchbook',\n 'swift',\n 'swimmer',\n 'swimming-pool',\n 'symfony',\n 'symfonycasts',\n 'synagogue',\n 'sync',\n 'sync-alt',\n 'syringe',\n 't-shirt',\n 'table',\n 'table-cells',\n 'table-cells-column-lock',\n 'table-cells-large',\n 'table-cells-row-lock',\n 'table-cells-row-unlock',\n 'table-columns',\n 'table-list',\n 'table-tennis',\n 'table-tennis-paddle-ball',\n 'tablet',\n 'tablet-alt',\n 'tablet-android',\n 'tablet-button',\n 'tablet-screen-button',\n 'tablets',\n 'tachograph-digital',\n 'tachometer',\n 'tachometer-alt',\n 'tachometer-alt-average',\n 'tachometer-alt-fast',\n 'tachometer-average',\n 'tachometer-fast',\n 'tag',\n 'tags',\n 'tailwind-css',\n 'tanakh',\n 'tape',\n 'tarp',\n 'tarp-droplet',\n 'tasks',\n 'tasks-alt',\n 'taurus',\n 'taxi',\n 'teamspeak',\n 'teeth',\n 'teeth-open',\n 'telegram',\n 'telegram-plane',\n 'teletype',\n 'television',\n 'temperature-0',\n 'temperature-1',\n 'temperature-2',\n 'temperature-3',\n 'temperature-4',\n 'temperature-arrow-down',\n 'temperature-arrow-up',\n 'temperature-down',\n 'temperature-empty',\n 'temperature-full',\n 'temperature-half',\n 'temperature-high',\n 'temperature-low',\n 'temperature-quarter',\n 'temperature-three-quarters',\n 'temperature-up',\n 'tencent-weibo',\n 'tenge',\n 'tenge-sign',\n 'tent',\n 'tent-arrow-down-to-line',\n 'tent-arrow-left-right',\n 'tent-arrow-turn-left',\n 'tent-arrows-down',\n 'tents',\n 'terminal',\n 'tesla',\n 'tex',\n 'text-height',\n 'text-slash',\n 'text-width',\n 'th',\n 'th-large',\n 'th-list',\n 'the-red-yeti',\n 'theater-masks',\n 'themeco',\n 'themeisle',\n 'thermometer',\n 'thermometer-0',\n 'thermometer-1',\n 'thermometer-2',\n 'thermometer-3',\n 'thermometer-4',\n 'thermometer-empty',\n 'thermometer-full',\n 'thermometer-half',\n 'thermometer-quarter',\n 'thermometer-three-quarters',\n 'think-peaks',\n 'threads',\n 'threema',\n 'thumb-tack',\n 'thumb-tack-slash',\n 'thumbs-down',\n 'thumbs-up',\n 'thumbtack',\n 'thumbtack-slash',\n 'thunderstorm',\n 'ticket',\n 'ticket-alt',\n 'ticket-simple',\n 'tidal',\n 'tiktok',\n 'timeline',\n 'times',\n 'times-circle',\n 'times-rectangle',\n 'times-square',\n 'tint',\n 'tint-slash',\n 'tired',\n 'toggle-off',\n 'toggle-on',\n 'toilet',\n 'toilet-paper',\n 'toilet-paper-alt',\n 'toilet-paper-blank',\n 'toilet-paper-slash',\n 'toilet-portable',\n 'toilets-portable',\n 'toolbox',\n 'tools',\n 'tooth',\n 'tor-browser',\n 'torah',\n 'torii-gate',\n 'tornado',\n 'tower-broadcast',\n 'tower-cell',\n 'tower-observation',\n 'tractor',\n 'trade-federation',\n 'trademark',\n 'traffic-light',\n 'trailer',\n 'train',\n 'train-subway',\n 'train-tram',\n 'tram',\n 'transgender',\n 'transgender-alt',\n 'trash',\n 'trash-alt',\n 'trash-arrow-up',\n 'trash-can',\n 'trash-can-arrow-up',\n 'trash-restore',\n 'trash-restore-alt',\n 'tree',\n 'tree-city',\n 'trello',\n 'triangle-circle-square',\n 'triangle-exclamation',\n 'trophy',\n 'trowel',\n 'trowel-bricks',\n 'truck',\n 'truck-arrow-right',\n 'truck-droplet',\n 'truck-fast',\n 'truck-field',\n 'truck-field-un',\n 'truck-front',\n 'truck-loading',\n 'truck-medical',\n 'truck-monster',\n 'truck-moving',\n 'truck-pickup',\n 'truck-plane',\n 'truck-ramp-box',\n 'try',\n 'tshirt',\n 'tty',\n 'tumblr',\n 'tumblr-square',\n 'turkish-lira',\n 'turkish-lira-sign',\n 'turn-down',\n 'turn-up',\n 'tv',\n 'tv-alt',\n 'twitch',\n 'twitter',\n 'twitter-square',\n 'typescript',\n 'typo3',\n 'uber',\n 'ubuntu',\n 'uikit',\n 'ultralytics',\n 'ultralytics-hub',\n 'ultralytics-yolo',\n 'umbraco',\n 'umbrella',\n 'umbrella-beach',\n 'uncharted',\n 'underline',\n 'undo',\n 'undo-alt',\n 'uniregistry',\n 'unison',\n 'unity',\n 'universal-access',\n 'university',\n 'unlink',\n 'unlock',\n 'unlock-alt',\n 'unlock-keyhole',\n 'unreal-engine',\n 'unsorted',\n 'unsplash',\n 'untappd',\n 'up-down',\n 'up-down-left-right',\n 'up-long',\n 'up-right-and-down-left-from-center',\n 'up-right-from-square',\n 'upload',\n 'ups',\n 'upwork',\n 'usb',\n 'user',\n 'user-alt',\n 'user-alt-slash',\n 'user-astronaut',\n 'user-check',\n 'user-circle',\n 'user-clock',\n 'user-cog',\n 'user-doctor',\n 'user-edit',\n 'user-friends',\n 'user-gear',\n 'user-graduate',\n 'user-group',\n 'user-injured',\n 'user-large',\n 'user-large-slash',\n 'user-lock',\n 'user-md',\n 'user-minus',\n 'user-ninja',\n 'user-nurse',\n 'user-pen',\n 'user-plus',\n 'user-secret',\n 'user-shield',\n 'user-slash',\n 'user-tag',\n 'user-tie',\n 'user-times',\n 'user-xmark',\n 'users',\n 'users-between-lines',\n 'users-cog',\n 'users-gear',\n 'users-line',\n 'users-rays',\n 'users-rectangle',\n 'users-slash',\n 'users-viewfinder',\n 'usps',\n 'ussunnah',\n 'utensil-spoon',\n 'utensils',\n 'vaadin',\n 'van-shuttle',\n 'vault',\n 'vcard',\n 'vector-polygon',\n 'venmo',\n 'venmo-v',\n 'venus',\n 'venus-double',\n 'venus-mars',\n 'vest',\n 'vest-patches',\n 'viacoin',\n 'viadeo',\n 'viadeo-square',\n 'vial',\n 'vial-circle-check',\n 'vial-virus',\n 'vials',\n 'viber',\n 'video',\n 'video-camera',\n 'video-slash',\n 'vihara',\n 'vim',\n 'vimeo',\n 'vimeo-square',\n 'vimeo-v',\n 'vine',\n 'virgo',\n 'virus',\n 'virus-covid',\n 'virus-covid-slash',\n 'virus-slash',\n 'viruses',\n 'visual-studio',\n 'vk',\n 'vnv',\n 'voicemail',\n 'volcano',\n 'volleyball',\n 'volleyball-ball',\n 'volume',\n 'volume-control-phone',\n 'volume-down',\n 'volume-high',\n 'volume-low',\n 'volume-medium',\n 'volume-mute',\n 'volume-off',\n 'volume-times',\n 'volume-up',\n 'volume-xmark',\n 'vote-yea',\n 'vr-cardboard',\n 'vsco',\n 'vuejs',\n 'w3c',\n 'walkie-talkie',\n 'walking',\n 'wallet',\n 'wand-magic',\n 'wand-magic-sparkles',\n 'wand-sparkles',\n 'warehouse',\n 'warning',\n 'watchman-monitoring',\n 'water',\n 'water-ladder',\n 'wave-square',\n 'waze',\n 'web-awesome',\n 'webflow',\n 'weebly',\n 'weibo',\n 'weight',\n 'weight-hanging',\n 'weight-scale',\n 'weixin',\n 'whatsapp',\n 'whatsapp-square',\n 'wheat-alt',\n 'wheat-awn',\n 'wheat-awn-circle-exclamation',\n 'wheelchair',\n 'wheelchair-alt',\n 'wheelchair-move',\n 'whiskey-glass',\n 'whmcs',\n 'wifi',\n 'wifi-3',\n 'wifi-strong',\n 'wikipedia-w',\n 'wind',\n 'window-close',\n 'window-maximize',\n 'window-minimize',\n 'window-restore',\n 'windows',\n 'wine-bottle',\n 'wine-glass',\n 'wine-glass-alt',\n 'wine-glass-empty',\n 'wirsindhandwerk',\n 'wix',\n 'wizards-of-the-coast',\n 'wodu',\n 'wolf-pack-battalion',\n 'won',\n 'won-sign',\n 'wordpress',\n 'wordpress-simple',\n 'worm',\n 'wpbeginner',\n 'wpexplorer',\n 'wpforms',\n 'wpressr',\n 'wrench',\n 'wsh',\n 'x-ray',\n 'x-twitter',\n 'xbox',\n 'xing',\n 'xing-square',\n 'xmark',\n 'xmark-circle',\n 'xmark-square',\n 'xmarks-lines',\n 'xmpp',\n 'xrp',\n 'xrpl',\n 'y-combinator',\n 'yahoo',\n 'yammer',\n 'yandex',\n 'yandex-international',\n 'yarn',\n 'yelp',\n 'yen',\n 'yen-sign',\n 'yin-yang',\n 'yoast',\n 'youtube',\n 'youtube-shorts',\n 'youtube-square',\n 'zap',\n 'zhihu',\n 'zoom',\n 'zulip',\n]);\n\n/**\n * Hand-curated Pro-only name → nearest Free alternative, sourced from\n * @ekanos/harness's Pro→Free glyph shim. Not exhaustive — a Pro-only name\n * with no shim entry has no known Free substitute here.\n */\nexport const FA_PRO_TO_FREE_HINTS: ReadonlyMap<string, string> = new Map([\n ['cloud-bolt-sun', 'cloud-bolt'],\n ['cloud-drizzle', 'cloud-rain'],\n ['cloud-fog', 'smog'],\n ['cloud-hail', 'cloud-meatball'],\n ['cloud-hail-mixed', 'cloud-meatball'],\n ['cloud-question', 'circle-question'],\n ['cloud-showers', 'cloud-showers-heavy'],\n ['cloud-snow', 'snowflake'],\n ['clouds', 'cloud'],\n ['clouds-moon', 'cloud-moon'],\n ['clouds-sun', 'cloud-sun'],\n ['fog', 'smog'],\n ['moon-cloud', 'cloud-moon'],\n ['moon-stars', 'moon'],\n ['sparkles', 'wand-magic-sparkles'],\n ['sun-bright', 'sun'],\n ['sun-cloud', 'cloud-sun'],\n]);\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Finding } from '@ekanos/integration-schema';
|
|
2
|
+
/**
|
|
3
|
+
* Flags Font Awesome **Pro**-only `fa-*` icon names in a project's widget
|
|
4
|
+
* source — today this is a silent, runtime-only failure: `@ekanos/ui`'s
|
|
5
|
+
* `Icon` warns once via `console.warn` in dev, but ships nothing to
|
|
6
|
+
* `validate`, so a partner only discovers a Pro-only name when the generated
|
|
7
|
+
* harness (Font Awesome **Free**-only, see `@ekanos/harness`) renders the
|
|
8
|
+
* circle-question fallback in place of the intended glyph — or never
|
|
9
|
+
* discovers it, if nobody was watching the console.
|
|
10
|
+
*
|
|
11
|
+
* `validate` has no live component tree to inspect the way the runtime
|
|
12
|
+
* warning does, and the definition's `component`/`icon` fields are live
|
|
13
|
+
* React values by the time `loadDefinition` resolves them (function
|
|
14
|
+
* references, not paths) — there is no file path to walk back to from an
|
|
15
|
+
* already-imported component. So this scans the project's own `src/**\/*.{ts,tsx}`
|
|
16
|
+
* on disk instead, the same fallback `collectProjectFindings` would use if it
|
|
17
|
+
* needed source text rather than a loaded value.
|
|
18
|
+
*
|
|
19
|
+
* WARN, not error: a Pro-only name is broken UX in a Free-only host, not an
|
|
20
|
+
* unbuildable submission — plenty of Fusion-hosted partners run under Pro,
|
|
21
|
+
* where the exact same name renders correctly.
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectIconFindings(projectDir: string): Finding[];
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { FA_FREE_ICON_NAMES, FA_PRO_TO_FREE_HINTS, } from './generated/fa-free-names.js';
|
|
4
|
+
/**
|
|
5
|
+
* Flags Font Awesome **Pro**-only `fa-*` icon names in a project's widget
|
|
6
|
+
* source — today this is a silent, runtime-only failure: `@ekanos/ui`'s
|
|
7
|
+
* `Icon` warns once via `console.warn` in dev, but ships nothing to
|
|
8
|
+
* `validate`, so a partner only discovers a Pro-only name when the generated
|
|
9
|
+
* harness (Font Awesome **Free**-only, see `@ekanos/harness`) renders the
|
|
10
|
+
* circle-question fallback in place of the intended glyph — or never
|
|
11
|
+
* discovers it, if nobody was watching the console.
|
|
12
|
+
*
|
|
13
|
+
* `validate` has no live component tree to inspect the way the runtime
|
|
14
|
+
* warning does, and the definition's `component`/`icon` fields are live
|
|
15
|
+
* React values by the time `loadDefinition` resolves them (function
|
|
16
|
+
* references, not paths) — there is no file path to walk back to from an
|
|
17
|
+
* already-imported component. So this scans the project's own `src/**\/*.{ts,tsx}`
|
|
18
|
+
* on disk instead, the same fallback `collectProjectFindings` would use if it
|
|
19
|
+
* needed source text rather than a loaded value.
|
|
20
|
+
*
|
|
21
|
+
* WARN, not error: a Pro-only name is broken UX in a Free-only host, not an
|
|
22
|
+
* unbuildable submission — plenty of Fusion-hosted partners run under Pro,
|
|
23
|
+
* where the exact same name renders correctly.
|
|
24
|
+
*/
|
|
25
|
+
export function collectIconFindings(projectDir) {
|
|
26
|
+
const srcDir = path.join(projectDir, 'src');
|
|
27
|
+
if (!fs.existsSync(srcDir))
|
|
28
|
+
return [];
|
|
29
|
+
const findings = [];
|
|
30
|
+
for (const file of walkTsFiles(srcDir)) {
|
|
31
|
+
findings.push(...collectIconFindingsInFile(file));
|
|
32
|
+
}
|
|
33
|
+
return findings;
|
|
34
|
+
}
|
|
35
|
+
function* walkTsFiles(dir) {
|
|
36
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
37
|
+
const full = path.join(dir, entry.name);
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
yield* walkTsFiles(full);
|
|
40
|
+
}
|
|
41
|
+
else if (/\.(ts|tsx)$/.test(entry.name)) {
|
|
42
|
+
yield full;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* One Font Awesome style-family token, e.g. the `fa-solid` in
|
|
48
|
+
* `"fa-solid fa-house"` (see `@kit/ui`'s `buildFaIconValue`, which produces
|
|
49
|
+
* exactly this two-token shape). Kept in sync by hand with `FA_ICON_STYLES`
|
|
50
|
+
* in `packages/ui/src/custom/icon-shared.ts` — a style name is never itself
|
|
51
|
+
* an icon name, so it must not be treated as one, but that file is a browser
|
|
52
|
+
* package this one may not import.
|
|
53
|
+
*/
|
|
54
|
+
const FA_STYLE_TOKEN = '(?:solid|regular|light|thin|duotone|sharp|brands|classic)';
|
|
55
|
+
/**
|
|
56
|
+
* A quoted string literal whose ENTIRE contents are a bare `fa-<name>` value
|
|
57
|
+
* or a two-token `fa-<style> fa-<name>` value — anchored to the quote
|
|
58
|
+
* boundaries (the backreference to the opening quote must follow the name
|
|
59
|
+
* pattern immediately) so this cannot match a `fa-`-prefixed SUBSTRING inside
|
|
60
|
+
* a longer, unrelated string.
|
|
61
|
+
*
|
|
62
|
+
* Parameterized on its own backreference number because it is spliced into
|
|
63
|
+
* `FA_ICON_CONTEXT_RE` twice — each copy opens its own capture group, so a
|
|
64
|
+
* hardcoded `\1` in the second copy would wrongly point at the FIRST copy's
|
|
65
|
+
* quote group instead of its own.
|
|
66
|
+
*/
|
|
67
|
+
function faIconLiteral(quoteGroup) {
|
|
68
|
+
return `(['"\`])(?:fa-${FA_STYLE_TOKEN}\\s+)?fa-([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\\${quoteGroup}`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Only literals in a position that plausibly HOLDS an icon name: the `name`/
|
|
72
|
+
* `icon` prop or object key an `<Icon>`, a widget's `category.icon`, or a
|
|
73
|
+
* config object typically uses, or a direct argument to `resolveIcon`/
|
|
74
|
+
* `renderIcon` (`@ekanos/ui`'s runtime helpers).
|
|
75
|
+
*
|
|
76
|
+
* This is a heuristic, not a parser — it will miss an icon name built up any
|
|
77
|
+
* other way (a variable, a template with interpolation, an indirect prop
|
|
78
|
+
* name), and in principle a `name`/`icon` key on some unrelated object could
|
|
79
|
+
* coincidentally hold an `fa-`-shaped string and get flagged. Both failure
|
|
80
|
+
* modes are accepted: a scan that required full TS type information to be
|
|
81
|
+
* exact is not worth the cost here, and this project's own convention names
|
|
82
|
+
* icon props/keys `name` or `icon` specifically to keep that collision rare.
|
|
83
|
+
* Group numbers: 1 = quote, 2 = name for the `name`/`icon` branch; 3 = quote,
|
|
84
|
+
* 4 = name for the `resolveIcon`/`renderIcon` branch.
|
|
85
|
+
*/
|
|
86
|
+
const FA_ICON_CONTEXT_RE = new RegExp(`\\b(?:name|icon)\\s*[:=]\\s*\\{?\\s*${faIconLiteral(1)}` +
|
|
87
|
+
`|\\b(?:resolveIcon|renderIcon)\\(\\s*${faIconLiteral(3)}`, 'g');
|
|
88
|
+
function collectIconFindingsInFile(file) {
|
|
89
|
+
var _a;
|
|
90
|
+
const source = fs.readFileSync(file, 'utf8');
|
|
91
|
+
const findings = [];
|
|
92
|
+
const seen = new Set();
|
|
93
|
+
for (const match of source.matchAll(FA_ICON_CONTEXT_RE)) {
|
|
94
|
+
const iconName = (_a = match[2]) !== null && _a !== void 0 ? _a : match[4];
|
|
95
|
+
if (!iconName || FA_FREE_ICON_NAMES.has(iconName))
|
|
96
|
+
continue;
|
|
97
|
+
const dedupeKey = `${iconName}@${match.index}`;
|
|
98
|
+
if (seen.has(dedupeKey))
|
|
99
|
+
continue;
|
|
100
|
+
seen.add(dedupeKey);
|
|
101
|
+
const line = source.slice(0, match.index).split('\n').length;
|
|
102
|
+
const alternative = FA_PRO_TO_FREE_HINTS.get(iconName);
|
|
103
|
+
findings.push({
|
|
104
|
+
check: 'icons/pro-only',
|
|
105
|
+
severity: 'warn',
|
|
106
|
+
file,
|
|
107
|
+
line,
|
|
108
|
+
message: `"fa-${iconName}" is not in the Font Awesome Free set. Fusion itself ` +
|
|
109
|
+
'loads Font Awesome Pro, so this renders fine there, but the ' +
|
|
110
|
+
'generated harness (and any other Free-only host) shows the ' +
|
|
111
|
+
'circle-question placeholder instead of the intended glyph.',
|
|
112
|
+
hint: alternative
|
|
113
|
+
? `Use "fa-${alternative}" instead — the nearest Free equivalent.`
|
|
114
|
+
: 'Pick a Free icon name — Pro names render as placeholder discs ' +
|
|
115
|
+
'outside Pro-licensed hosts.',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return findings;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=icon-findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-findings.js","sourceRoot":"","sources":["../src/icon-findings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Finding } from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport {\n FA_FREE_ICON_NAMES,\n FA_PRO_TO_FREE_HINTS,\n} from './generated/fa-free-names';\n\n/**\n * Flags Font Awesome **Pro**-only `fa-*` icon names in a project's widget\n * source — today this is a silent, runtime-only failure: `@ekanos/ui`'s\n * `Icon` warns once via `console.warn` in dev, but ships nothing to\n * `validate`, so a partner only discovers a Pro-only name when the generated\n * harness (Font Awesome **Free**-only, see `@ekanos/harness`) renders the\n * circle-question fallback in place of the intended glyph — or never\n * discovers it, if nobody was watching the console.\n *\n * `validate` has no live component tree to inspect the way the runtime\n * warning does, and the definition's `component`/`icon` fields are live\n * React values by the time `loadDefinition` resolves them (function\n * references, not paths) — there is no file path to walk back to from an\n * already-imported component. So this scans the project's own `src/**\\/*.{ts,tsx}`\n * on disk instead, the same fallback `collectProjectFindings` would use if it\n * needed source text rather than a loaded value.\n *\n * WARN, not error: a Pro-only name is broken UX in a Free-only host, not an\n * unbuildable submission — plenty of Fusion-hosted partners run under Pro,\n * where the exact same name renders correctly.\n */\nexport function collectIconFindings(projectDir: string): Finding[] {\n const srcDir = path.join(projectDir, 'src');\n if (!fs.existsSync(srcDir)) return [];\n\n const findings: Finding[] = [];\n for (const file of walkTsFiles(srcDir)) {\n findings.push(...collectIconFindingsInFile(file));\n }\n return findings;\n}\n\nfunction* walkTsFiles(dir: string): Generator<string> {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkTsFiles(full);\n } else if (/\\.(ts|tsx)$/.test(entry.name)) {\n yield full;\n }\n }\n}\n\n/**\n * One Font Awesome style-family token, e.g. the `fa-solid` in\n * `\"fa-solid fa-house\"` (see `@kit/ui`'s `buildFaIconValue`, which produces\n * exactly this two-token shape). Kept in sync by hand with `FA_ICON_STYLES`\n * in `packages/ui/src/custom/icon-shared.ts` — a style name is never itself\n * an icon name, so it must not be treated as one, but that file is a browser\n * package this one may not import.\n */\nconst FA_STYLE_TOKEN =\n '(?:solid|regular|light|thin|duotone|sharp|brands|classic)';\n\n/**\n * A quoted string literal whose ENTIRE contents are a bare `fa-<name>` value\n * or a two-token `fa-<style> fa-<name>` value — anchored to the quote\n * boundaries (the backreference to the opening quote must follow the name\n * pattern immediately) so this cannot match a `fa-`-prefixed SUBSTRING inside\n * a longer, unrelated string.\n *\n * Parameterized on its own backreference number because it is spliced into\n * `FA_ICON_CONTEXT_RE` twice — each copy opens its own capture group, so a\n * hardcoded `\\1` in the second copy would wrongly point at the FIRST copy's\n * quote group instead of its own.\n */\nfunction faIconLiteral(quoteGroup: number): string {\n return `(['\"\\`])(?:fa-${FA_STYLE_TOKEN}\\\\s+)?fa-([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\\\\${quoteGroup}`;\n}\n\n/**\n * Only literals in a position that plausibly HOLDS an icon name: the `name`/\n * `icon` prop or object key an `<Icon>`, a widget's `category.icon`, or a\n * config object typically uses, or a direct argument to `resolveIcon`/\n * `renderIcon` (`@ekanos/ui`'s runtime helpers).\n *\n * This is a heuristic, not a parser — it will miss an icon name built up any\n * other way (a variable, a template with interpolation, an indirect prop\n * name), and in principle a `name`/`icon` key on some unrelated object could\n * coincidentally hold an `fa-`-shaped string and get flagged. Both failure\n * modes are accepted: a scan that required full TS type information to be\n * exact is not worth the cost here, and this project's own convention names\n * icon props/keys `name` or `icon` specifically to keep that collision rare.\n * Group numbers: 1 = quote, 2 = name for the `name`/`icon` branch; 3 = quote,\n * 4 = name for the `resolveIcon`/`renderIcon` branch.\n */\nconst FA_ICON_CONTEXT_RE = new RegExp(\n `\\\\b(?:name|icon)\\\\s*[:=]\\\\s*\\\\{?\\\\s*${faIconLiteral(1)}` +\n `|\\\\b(?:resolveIcon|renderIcon)\\\\(\\\\s*${faIconLiteral(3)}`,\n 'g',\n);\n\nfunction collectIconFindingsInFile(file: string): Finding[] {\n const source = fs.readFileSync(file, 'utf8');\n const findings: Finding[] = [];\n const seen = new Set<string>();\n\n for (const match of source.matchAll(FA_ICON_CONTEXT_RE)) {\n const iconName = match[2] ?? match[4];\n if (!iconName || FA_FREE_ICON_NAMES.has(iconName)) continue;\n\n const dedupeKey = `${iconName}@${match.index}`;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const line = source.slice(0, match.index).split('\\n').length;\n const alternative = FA_PRO_TO_FREE_HINTS.get(iconName);\n\n findings.push({\n check: 'icons/pro-only',\n severity: 'warn',\n file,\n line,\n message:\n `\"fa-${iconName}\" is not in the Font Awesome Free set. Fusion itself ` +\n 'loads Font Awesome Pro, so this renders fine there, but the ' +\n 'generated harness (and any other Free-only host) shows the ' +\n 'circle-question placeholder instead of the intended glyph.',\n hint: alternative\n ? `Use \"fa-${alternative}\" instead — the nearest Free equivalent.`\n : 'Pick a Free icon name — Pro names render as placeholder discs ' +\n 'outside Pro-licensed hosts.',\n });\n }\n\n return findings;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,12 @@ export interface RunOptions {
|
|
|
15
15
|
*/
|
|
16
16
|
stdinIsTTY?: boolean;
|
|
17
17
|
confirm?: (question: string) => Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Test-only override for `status --watch`'s poll delay — see `StatusArgs`
|
|
20
|
+
* in `commands/status.ts`. Never set this from real CLI wiring; it exists
|
|
21
|
+
* so a test can exercise the poll loop without waiting 30s per iteration.
|
|
22
|
+
*/
|
|
23
|
+
sleep?: (ms: number) => Promise<void>;
|
|
18
24
|
}
|
|
19
25
|
/**
|
|
20
26
|
* The single entry point. Resolves the agent-native envelope once, dispatches
|
package/dist/index.js
CHANGED
|
@@ -59,6 +59,8 @@ const COMMAND_SPECS = {
|
|
|
59
59
|
status: {
|
|
60
60
|
host: { type: 'string' },
|
|
61
61
|
dir: { type: 'string' },
|
|
62
|
+
findings: { type: 'boolean' },
|
|
63
|
+
watch: { type: 'boolean' },
|
|
62
64
|
},
|
|
63
65
|
sources: {
|
|
64
66
|
host: { type: 'string' },
|
|
@@ -102,6 +104,8 @@ const USAGE = [
|
|
|
102
104
|
' whoami Print the identity the stored session authenticates as, plus',
|
|
103
105
|
' a compact list of the sources you hold a seat on',
|
|
104
106
|
" status Show login state and this project's submissions on the host",
|
|
107
|
+
' (--findings for full gate findings, --watch to block until',
|
|
108
|
+
" this project's current version reaches a gate verdict)",
|
|
105
109
|
' sources List every source you hold a developer/source-admin seat on',
|
|
106
110
|
' use Set this project\'s publish target ("ekanos use <source-slug>")',
|
|
107
111
|
' publish Validate, pack and submit the integration to a Fusion host',
|
|
@@ -248,6 +252,9 @@ export async function run(argv, options = {}) {
|
|
|
248
252
|
host: parsed.flags.host,
|
|
249
253
|
dir,
|
|
250
254
|
env,
|
|
255
|
+
findings: parsed.flags.findings === true,
|
|
256
|
+
watch: parsed.flags.watch === true,
|
|
257
|
+
sleep: options.sleep,
|
|
251
258
|
});
|
|
252
259
|
case 'sources':
|
|
253
260
|
return await runSources(ctx, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\n\nimport { runDev } from './commands/dev';\nimport { runInit } from './commands/init';\nimport { runLogin } from './commands/login';\nimport { runLogout } from './commands/logout';\nimport { runPublish } from './commands/publish';\nimport { runSources } from './commands/sources';\nimport { runStatus } from './commands/status';\nimport { runTest } from './commands/test';\nimport { runUpgrade } from './commands/upgrade';\nimport { runUse } from './commands/use';\nimport { runValidate } from './commands/validate';\nimport { runWhoami } from './commands/whoami';\nimport { CliContext, type WriteStream } from './context';\nimport { toCliError, usageError } from './errors';\nimport { EXIT_CODES } from './exit-codes';\nimport { type FlagSpecs, parseArgv } from './parse-argv';\n\nexport { CliContext } from './context';\nexport { EXIT_CODES, ERROR_CODES } from './exit-codes';\nexport type { ExitCode, ErrorCode } from './exit-codes';\n\nconst GLOBAL_SPECS: FlagSpecs = {\n json: { type: 'boolean' },\n help: { type: 'boolean' },\n version: { type: 'boolean' },\n};\n\nconst COMMAND_SPECS: Record<string, FlagSpecs> = {\n init: {\n slug: { type: 'string' },\n dir: { type: 'string' },\n force: { type: 'boolean' },\n yes: { type: 'boolean' },\n // Repeatable: each occurrence appends one docs entry (URL or relative\n // path) to the scaffolded ekanos.json.\n docs: { type: 'string', repeatable: true },\n },\n validate: {\n dir: { type: 'string' },\n },\n dev: {\n dir: { type: 'string' },\n port: { type: 'string' },\n host: { type: 'string' },\n force: { type: 'boolean' },\n start: { type: 'boolean' },\n },\n test: {\n dir: { type: 'string' },\n },\n login: {\n host: { type: 'string' },\n force: { type: 'boolean' },\n },\n logout: {\n host: { type: 'string' },\n all: { type: 'boolean' },\n },\n whoami: {\n host: { type: 'string' },\n },\n status: {\n host: { type: 'string' },\n dir: { type: 'string' },\n },\n sources: {\n host: { type: 'string' },\n dir: { type: 'string' },\n },\n use: {\n host: { type: 'string' },\n dir: { type: 'string' },\n },\n publish: {\n host: { type: 'string' },\n source: { type: 'string' },\n dir: { type: 'string' },\n yes: { type: 'boolean' },\n },\n upgrade: {\n dir: { type: 'string' },\n host: { type: 'string' },\n check: { type: 'boolean' },\n yes: { type: 'boolean' },\n // `--no-verify` is the negation of this — parse-argv's `--no-<bool>`\n // convention (same as `--no-json`/`--no-start`), not a flag of its own.\n verify: { type: 'boolean' },\n },\n};\n\n/** Commands that take a positional argument, and what it means. Every other command is positional-free. */\nconst POSITIONAL_COMMANDS: Record<string, string> = {\n use: 'source-slug',\n};\n\nconst COMMANDS = Object.keys(COMMAND_SPECS);\n\nconst USAGE = [\n 'Usage: ekanos <command> [options]',\n '',\n 'Commands:',\n ' init Scaffold a new integration project into ./<slug> (--slug <slug> --yes)',\n ' validate Validate ekanos.json + the integration definition (--json)',\n ' dev Scaffold .ekanos/harness and run it with your own Next',\n ' test Run the project test script via its package manager (--json)',\n ' login Authenticate against a Fusion host in a browser (--host <url>)',\n ' logout Revoke and delete the stored session (--host <url> | --all)',\n ' whoami Print the identity the stored session authenticates as, plus',\n ' a compact list of the sources you hold a seat on',\n \" status Show login state and this project's submissions on the host\",\n ' sources List every source you hold a developer/source-admin seat on',\n ' use Set this project\\'s publish target (\"ekanos use <source-slug>\")',\n ' publish Validate, pack and submit the integration to a Fusion host',\n ' upgrade Move this toolchain to a coherent target version, with',\n ' verify-and-rollback (--check --yes --no-verify --host <url>)',\n '',\n 'Keeping the toolchain current:',\n ' validate, dev and publish all check for a newer @ekanos/cli in the',\n ' background (never blocking, silenced by EKANOS_NO_UPDATE_CHECK) and warn',\n ' on stderr when one exists. Run \"ekanos upgrade --check\" any time a',\n ' validate finding smells like version skew (an unrecognized-key error you',\n ' are confident is correct) — it is read-only and safe to run freely. A',\n ' bare \"ekanos upgrade\" MUTATES the project (installs the target versions,',\n ' verifies with validate + the test script, rolls back on any failure).',\n '',\n 'Host resolution (logout, whoami, status, sources, use, publish, upgrade):',\n ' --host, else EKANOS_HOST, else the \"host\" field in ekanos.json, else the',\n ' sole stored login. \"ekanos publish\" saves host and source to ekanos.json.',\n ' \"ekanos login\" never reads ekanos.json for a host (--host, else',\n ' EKANOS_HOST, else the sole stored login) — it is the verb that creates',\n ' credentials, so a committed file must never choose where they go.',\n '',\n 'Publish targeting (see \"ekanos sources\" / \"ekanos use\"):',\n ' publish refuses (FORBIDDEN) a source you hold no seat on. With multiple',\n ' seats and an implicit (ekanos.json) source, a human run asks to confirm',\n ' the target; a scripted/JSON run needs --source or --yes to proceed —',\n ' it never prompts and never guesses.',\n '',\n 'Global options:',\n ' --json Emit a single JSON envelope on stdout (auto-on when piped);',\n ' --no-json forces the human-readable form',\n ' --version Print the CLI version',\n ' --help Show this help',\n].join('\\n');\n\nexport interface RunOptions {\n stdout?: WriteStream;\n stderr?: WriteStream;\n env?: Record<string, string | undefined>;\n cwd?: string;\n /**\n * Test-only overrides for `publish`'s interactive-confirm gate — see\n * `PublishArgs` in `commands/publish.ts`. Never set these from real CLI\n * wiring; they exist so a test can exercise the human y/N confirm branch\n * without a real terminal.\n */\n stdinIsTTY?: boolean;\n confirm?: (question: string) => Promise<boolean>;\n}\n\n/**\n * The single entry point. Resolves the agent-native envelope once, dispatches\n * to a verb, and guarantees exactly one terminal emission (success or error).\n * Returns the process exit code — `bin.ts` is the only place that calls\n * `process.exit`, so this stays fully testable.\n */\nexport async function run(\n argv: readonly string[],\n options: RunOptions = {},\n): Promise<number> {\n const jsonFlag = scanJsonFlag(argv);\n const ctx = new CliContext({\n jsonFlag,\n stdout: options.stdout,\n stderr: options.stderr,\n env: options.env,\n });\n const cwd = options.cwd ?? process.cwd();\n const env = options.env ?? process.env;\n\n try {\n // `--version` is global and verb-independent, so it is answered before the\n // command is even resolved: `ekanos --version` and `ekanos validate\n // --version` both report the tool's version and exit 0.\n if (scanFlagPresence(argv, 'version')) {\n return emitVersion(ctx);\n }\n\n const { command, rest } = splitCommand(argv);\n\n // Top-level help / no command.\n if (!command) {\n if (scanFlagPresence(rest, 'help') || argv.length === 0) {\n return emitHelp(ctx);\n }\n // A leading token that is not a command (e.g. `--nonsense`).\n ctx.emitClaudeCodeHint({\n tool: 'ekanos',\n error: 'unknown-command',\n commands: COMMANDS,\n usage: USAGE,\n });\n throw usageError(\n `Unknown command or flag \"${argv[0]}\".`,\n `Run one of: ${COMMANDS.join(', ')}. See \"ekanos --help\".`,\n );\n }\n\n if (!COMMANDS.includes(command)) {\n ctx.emitClaudeCodeHint({\n tool: 'ekanos',\n error: 'unknown-command',\n given: command,\n commands: COMMANDS,\n usage: USAGE,\n });\n throw usageError(\n `Unknown command \"${command}\".`,\n `Run one of: ${COMMANDS.join(', ')}. See \"ekanos --help\".`,\n );\n }\n\n const specs: FlagSpecs = { ...GLOBAL_SPECS, ...COMMAND_SPECS[command] };\n const parsed = parseArgv(rest, specs);\n\n if (parsed.flags.help === true) {\n return emitCommandHelp(ctx, command);\n }\n\n const positionalName = POSITIONAL_COMMANDS[command];\n\n if (!positionalName && parsed.positionals.length > 0) {\n throw usageError(\n `\"${command}\" takes no positional arguments (got \"${parsed.positionals[0]}\").`,\n `Pass options as flags, e.g. \"--dir <path>\". See \"ekanos ${command} --help\".`,\n );\n }\n\n if (positionalName && parsed.positionals.length > 1) {\n throw usageError(\n `\"${command}\" takes at most one positional argument (a ` +\n `${positionalName}), got ${parsed.positionals.length}.`,\n `Pass exactly one, e.g. \"ekanos ${command} <${positionalName}>\". ` +\n `See \"ekanos ${command} --help\".`,\n );\n }\n\n const dir = (parsed.flags.dir as string | undefined) ?? cwd;\n\n switch (command) {\n case 'init':\n return runInit(ctx, {\n slug: parsed.flags.slug as string | undefined,\n dir: parsed.flags.dir as string | undefined,\n cwd,\n force: parsed.flags.force === true,\n yes: parsed.flags.yes === true,\n docs: parsed.flags.docs as string[] | undefined,\n });\n case 'validate':\n return await runValidate(ctx, { dir, env });\n case 'dev':\n return await runDev(ctx, {\n dir,\n port: parsed.flags.port as string | undefined,\n host: parsed.flags.host as string | undefined,\n force: parsed.flags.force === true,\n start: parsed.flags.start as boolean | undefined,\n env,\n });\n case 'test':\n return await runTest(ctx, { dir, passthrough: parsed.passthrough });\n case 'login':\n return await runLogin(ctx, {\n host: parsed.flags.host as string | undefined,\n force: parsed.flags.force === true,\n cwd,\n env,\n });\n case 'logout':\n return await runLogout(ctx, {\n host: parsed.flags.host as string | undefined,\n all: parsed.flags.all === true,\n cwd,\n env,\n });\n case 'whoami':\n return await runWhoami(ctx, {\n host: parsed.flags.host as string | undefined,\n cwd,\n env,\n });\n case 'status':\n return await runStatus(ctx, {\n host: parsed.flags.host as string | undefined,\n dir,\n env,\n });\n case 'sources':\n return await runSources(ctx, {\n host: parsed.flags.host as string | undefined,\n dir,\n env,\n });\n case 'use':\n return await runUse(ctx, {\n host: parsed.flags.host as string | undefined,\n dir,\n slug: parsed.positionals[0],\n env,\n });\n case 'publish':\n return await runPublish(ctx, {\n host: parsed.flags.host as string | undefined,\n source: parsed.flags.source as string | undefined,\n dir,\n yes: parsed.flags.yes === true,\n env,\n stdinIsTTY: options.stdinIsTTY,\n confirm: options.confirm,\n });\n case 'upgrade':\n return await runUpgrade(ctx, {\n dir,\n host: parsed.flags.host as string | undefined,\n env,\n check: parsed.flags.check === true,\n yes: parsed.flags.yes === true,\n noVerify: parsed.flags.verify === false,\n stdinIsTTY: options.stdinIsTTY,\n confirm: options.confirm,\n });\n default:\n // Unreachable — COMMANDS gate above — but keeps the switch total.\n throw usageError(\n `Unknown command \"${command}\".`,\n `Run one of: ${COMMANDS.join(', ')}.`,\n );\n }\n } catch (error) {\n return ctx.fail(toCliError(error));\n }\n}\n\n/**\n * Presence of `--json` (or `--no-json`) BEFORE the first `--` passthrough.\n *\n * Tri-state on purpose. `undefined` means \"the user expressed no preference\",\n * which is what lets the context fall back to inferring the mode from a\n * non-TTY stdout or CLAUDECODE. Collapsing `--no-json` to `false` here would\n * make it indistinguishable from absence, and the flag could then never turn\n * JSON mode OFF in exactly the cases it exists for.\n */\nfunction scanJsonFlag(argv: readonly string[]): boolean | undefined {\n for (const token of argv) {\n if (token === '--') break;\n if (token === '--json') return true;\n if (token === '--no-json') return false;\n }\n return undefined;\n}\n\nfunction scanFlagPresence(argv: readonly string[], name: string): boolean {\n for (const token of argv) {\n if (token === '--') break;\n if (token === `--${name}`) return true;\n }\n return false;\n}\n\n/**\n * Split argv into the command (first bare token before `--`) and the rest\n * (everything else, order preserved, including global flags and the `--`\n * passthrough). Global flags are all booleans, so any bare token is the\n * command — no value-consumption ambiguity.\n */\nfunction splitCommand(argv: readonly string[]): {\n command: string | null;\n rest: string[];\n} {\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]!;\n if (token === '--') break;\n if (!token.startsWith('-')) {\n return {\n command: token,\n rest: [...argv.slice(0, i), ...argv.slice(i + 1)],\n };\n }\n }\n return { command: null, rest: [...argv] };\n}\n\n/**\n * The CLI's own version, read from the package manifest at runtime rather than\n * baked in by the build — one source of truth, so a release bump cannot leave\n * `--version` reporting a stale number. The path resolves identically from\n * `src/index.ts` and from the emitted `dist/index.js`, both of which sit one\n * directory below the package root.\n */\nfunction readVersion(): string {\n const manifest = new URL('../package.json', import.meta.url);\n const parsed: unknown = JSON.parse(fs.readFileSync(manifest, 'utf8'));\n\n return typeof parsed === 'object' &&\n parsed !== null &&\n 'version' in parsed &&\n typeof parsed.version === 'string'\n ? parsed.version\n : '0.0.0';\n}\n\nfunction emitVersion(ctx: CliContext): number {\n const version = readVersion();\n\n return ctx.succeed({ name: 'ekanos', version }, version);\n}\n\nfunction emitHelp(ctx: CliContext): number {\n ctx.emitClaudeCodeHint({\n tool: 'ekanos',\n commands: COMMANDS,\n usage: USAGE,\n exitCodes: EXIT_CODES,\n });\n return ctx.succeed({ usage: USAGE, commands: COMMANDS }, USAGE);\n}\n\nfunction emitCommandHelp(ctx: CliContext, command: string): number {\n const specs = COMMAND_SPECS[command] ?? {};\n const flags = Object.keys(specs).map((name) => `--${name}`);\n const help = `Usage: ekanos ${command} [${flags.join('] [')}]`;\n ctx.emitClaudeCodeHint({ tool: 'ekanos', command, flags });\n return ctx.succeed({ command, flags }, help);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAkB,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,YAAY,GAAc;IAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;IACzB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;CAC7B,CAAC;AAEF,MAAM,aAAa,GAA8B;IAC/C,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACxB,sEAAsE;QACtE,uCAAuC;QACvC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE;KAC3C;IACD,QAAQ,EAAE;QACR,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACxB;IACD,GAAG,EAAE;QACH,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC3B;IACD,IAAI,EAAE;QACJ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACxB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC3B;IACD,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KACzB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC3B;IACD,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACxB;IACD,GAAG,EAAE;QACH,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACxB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KACzB;IACD,OAAO,EAAE;QACP,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACxB,qEAAqE;QACrE,wEAAwE;QACxE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC5B;CACF,CAAC;AAEF,2GAA2G;AAC3G,MAAM,mBAAmB,GAA2B;IAClD,GAAG,EAAE,aAAa;CACnB,CAAC;AAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAE5C,MAAM,KAAK,GAAG;IACZ,mCAAmC;IACnC,EAAE;IACF,WAAW;IACX,qFAAqF;IACrF,yEAAyE;IACzE,qEAAqE;IACrE,2EAA2E;IAC3E,6EAA6E;IAC7E,0EAA0E;IAC1E,2EAA2E;IAC3E,+DAA+D;IAC/D,0EAA0E;IAC1E,yEAAyE;IACzE,qEAAqE;IACrE,0EAA0E;IAC1E,8EAA8E;IAC9E,yEAAyE;IACzE,qEAAqE;IACrE,2EAA2E;IAC3E,EAAE;IACF,gCAAgC;IAChC,sEAAsE;IACtE,4EAA4E;IAC5E,sEAAsE;IACtE,4EAA4E;IAC5E,yEAAyE;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,EAAE;IACF,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,mEAAmE;IACnE,0EAA0E;IAC1E,qEAAqE;IACrE,EAAE;IACF,0DAA0D;IAC1D,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,uCAAuC;IACvC,EAAE;IACF,iBAAiB;IACjB,0EAA0E;IAC1E,uDAAuD;IACvD,oCAAoC;IACpC,6BAA6B;CAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAuBb;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,IAAuB,EACvB,UAAsB,EAAE;;IAExB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC;QACzB,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAA,OAAO,CAAC,GAAG,mCAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,MAAA,OAAO,CAAC,GAAG,mCAAI,OAAO,CAAC,GAAG,CAAC;IAEvC,IAAI,CAAC;QACH,2EAA2E;QAC3E,oEAAoE;QACpE,wDAAwD;QACxD,IAAI,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAE7C,+BAA+B;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YACD,6DAA6D;YAC7D,GAAG,CAAC,kBAAkB,CAAC;gBACrB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,iBAAiB;gBACxB,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,MAAM,UAAU,CACd,4BAA4B,IAAI,CAAC,CAAC,CAAC,IAAI,EACvC,eAAe,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAC3D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,kBAAkB,CAAC;gBACrB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,iBAAiB;gBACxB,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,MAAM,UAAU,CACd,oBAAoB,OAAO,IAAI,EAC/B,eAAe,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAC3D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,mCAAmB,YAAY,GAAK,aAAa,CAAC,OAAO,CAAC,CAAE,CAAC;QACxE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,UAAU,CACd,IAAI,OAAO,yCAAyC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAC9E,2DAA2D,OAAO,WAAW,CAC9E,CAAC;QACJ,CAAC;QAED,IAAI,cAAc,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,UAAU,CACd,IAAI,OAAO,6CAA6C;gBACtD,GAAG,cAAc,UAAU,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,EACzD,kCAAkC,OAAO,KAAK,cAAc,MAAM;gBAChE,eAAe,OAAO,WAAW,CACpC,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAC,MAAM,CAAC,KAAK,CAAC,GAA0B,mCAAI,GAAG,CAAC;QAE5D,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,GAAG,EAAE;oBAClB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAyB;oBAC3C,GAAG;oBACH,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;oBAClC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI;oBAC9B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA4B;iBAChD,CAAC,CAAC;YACL,KAAK,UAAU;gBACb,OAAO,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9C,KAAK,KAAK;gBACR,OAAO,MAAM,MAAM,CAAC,GAAG,EAAE;oBACvB,GAAG;oBACH,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;oBAClC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAA4B;oBAChD,GAAG;iBACJ,CAAC,CAAC;YACL,KAAK,MAAM;gBACT,OAAO,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACtE,KAAK,OAAO;gBACV,OAAO,MAAM,QAAQ,CAAC,GAAG,EAAE;oBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;oBAClC,GAAG;oBACH,GAAG;iBACJ,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE;oBAC1B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI;oBAC9B,GAAG;oBACH,GAAG;iBACJ,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE;oBAC1B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG;oBACH,GAAG;iBACJ,CAAC,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE;oBAC1B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG;oBACH,GAAG;oBACH,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI;oBACxC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;oBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAC,CAAC;YACL,KAAK,SAAS;gBACZ,OAAO,MAAM,UAAU,CAAC,GAAG,EAAE;oBAC3B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG;oBACH,GAAG;iBACJ,CAAC,CAAC;YACL,KAAK,KAAK;gBACR,OAAO,MAAM,MAAM,CAAC,GAAG,EAAE;oBACvB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG;oBACH,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC3B,GAAG;iBACJ,CAAC,CAAC;YACL,KAAK,SAAS;gBACZ,OAAO,MAAM,UAAU,CAAC,GAAG,EAAE;oBAC3B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAA4B;oBACjD,GAAG;oBACH,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI;oBAC9B,GAAG;oBACH,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;iBACzB,CAAC,CAAC;YACL,KAAK,SAAS;gBACZ,OAAO,MAAM,UAAU,CAAC,GAAG,EAAE;oBAC3B,GAAG;oBACH,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAA0B;oBAC7C,GAAG;oBACH,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;oBAClC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI;oBAC9B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK;oBACvC,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;iBACzB,CAAC,CAAC;YACL;gBACE,kEAAkE;gBAClE,MAAM,UAAU,CACd,oBAAoB,OAAO,IAAI,EAC/B,eAAe,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtC,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,IAAuB;IAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM;QAC1B,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,KAAK,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAuB,EAAE,IAAY;IAC7D,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM;QAC1B,IAAI,KAAK,KAAK,KAAK,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAuB;IAI3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM;QAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtE,OAAO,OAAO,MAAM,KAAK,QAAQ;QAC/B,MAAM,KAAK,IAAI;QACf,SAAS,IAAI,MAAM;QACnB,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAClC,CAAC,CAAC,MAAM,CAAC,OAAO;QAChB,CAAC,CAAC,OAAO,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,GAAe;IAClC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,OAAO,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAe;IAC/B,GAAG,CAAC,kBAAkB,CAAC;QACrB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,KAAK;QACZ,SAAS,EAAE,UAAU;KACtB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,GAAe,EAAE,OAAe;;IACvD,MAAM,KAAK,GAAG,MAAA,aAAa,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,iBAAiB,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC/D,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import * as fs from 'node:fs';\n\nimport { runDev } from './commands/dev';\nimport { runInit } from './commands/init';\nimport { runLogin } from './commands/login';\nimport { runLogout } from './commands/logout';\nimport { runPublish } from './commands/publish';\nimport { runSources } from './commands/sources';\nimport { runStatus } from './commands/status';\nimport { runTest } from './commands/test';\nimport { runUpgrade } from './commands/upgrade';\nimport { runUse } from './commands/use';\nimport { runValidate } from './commands/validate';\nimport { runWhoami } from './commands/whoami';\nimport { CliContext, type WriteStream } from './context';\nimport { toCliError, usageError } from './errors';\nimport { EXIT_CODES } from './exit-codes';\nimport { type FlagSpecs, parseArgv } from './parse-argv';\n\nexport { CliContext } from './context';\nexport { EXIT_CODES, ERROR_CODES } from './exit-codes';\nexport type { ExitCode, ErrorCode } from './exit-codes';\n\nconst GLOBAL_SPECS: FlagSpecs = {\n json: { type: 'boolean' },\n help: { type: 'boolean' },\n version: { type: 'boolean' },\n};\n\nconst COMMAND_SPECS: Record<string, FlagSpecs> = {\n init: {\n slug: { type: 'string' },\n dir: { type: 'string' },\n force: { type: 'boolean' },\n yes: { type: 'boolean' },\n // Repeatable: each occurrence appends one docs entry (URL or relative\n // path) to the scaffolded ekanos.json.\n docs: { type: 'string', repeatable: true },\n },\n validate: {\n dir: { type: 'string' },\n },\n dev: {\n dir: { type: 'string' },\n port: { type: 'string' },\n host: { type: 'string' },\n force: { type: 'boolean' },\n start: { type: 'boolean' },\n },\n test: {\n dir: { type: 'string' },\n },\n login: {\n host: { type: 'string' },\n force: { type: 'boolean' },\n },\n logout: {\n host: { type: 'string' },\n all: { type: 'boolean' },\n },\n whoami: {\n host: { type: 'string' },\n },\n status: {\n host: { type: 'string' },\n dir: { type: 'string' },\n findings: { type: 'boolean' },\n watch: { type: 'boolean' },\n },\n sources: {\n host: { type: 'string' },\n dir: { type: 'string' },\n },\n use: {\n host: { type: 'string' },\n dir: { type: 'string' },\n },\n publish: {\n host: { type: 'string' },\n source: { type: 'string' },\n dir: { type: 'string' },\n yes: { type: 'boolean' },\n },\n upgrade: {\n dir: { type: 'string' },\n host: { type: 'string' },\n check: { type: 'boolean' },\n yes: { type: 'boolean' },\n // `--no-verify` is the negation of this — parse-argv's `--no-<bool>`\n // convention (same as `--no-json`/`--no-start`), not a flag of its own.\n verify: { type: 'boolean' },\n },\n};\n\n/** Commands that take a positional argument, and what it means. Every other command is positional-free. */\nconst POSITIONAL_COMMANDS: Record<string, string> = {\n use: 'source-slug',\n};\n\nconst COMMANDS = Object.keys(COMMAND_SPECS);\n\nconst USAGE = [\n 'Usage: ekanos <command> [options]',\n '',\n 'Commands:',\n ' init Scaffold a new integration project into ./<slug> (--slug <slug> --yes)',\n ' validate Validate ekanos.json + the integration definition (--json)',\n ' dev Scaffold .ekanos/harness and run it with your own Next',\n ' test Run the project test script via its package manager (--json)',\n ' login Authenticate against a Fusion host in a browser (--host <url>)',\n ' logout Revoke and delete the stored session (--host <url> | --all)',\n ' whoami Print the identity the stored session authenticates as, plus',\n ' a compact list of the sources you hold a seat on',\n \" status Show login state and this project's submissions on the host\",\n ' (--findings for full gate findings, --watch to block until',\n \" this project's current version reaches a gate verdict)\",\n ' sources List every source you hold a developer/source-admin seat on',\n ' use Set this project\\'s publish target (\"ekanos use <source-slug>\")',\n ' publish Validate, pack and submit the integration to a Fusion host',\n ' upgrade Move this toolchain to a coherent target version, with',\n ' verify-and-rollback (--check --yes --no-verify --host <url>)',\n '',\n 'Keeping the toolchain current:',\n ' validate, dev and publish all check for a newer @ekanos/cli in the',\n ' background (never blocking, silenced by EKANOS_NO_UPDATE_CHECK) and warn',\n ' on stderr when one exists. Run \"ekanos upgrade --check\" any time a',\n ' validate finding smells like version skew (an unrecognized-key error you',\n ' are confident is correct) — it is read-only and safe to run freely. A',\n ' bare \"ekanos upgrade\" MUTATES the project (installs the target versions,',\n ' verifies with validate + the test script, rolls back on any failure).',\n '',\n 'Host resolution (logout, whoami, status, sources, use, publish, upgrade):',\n ' --host, else EKANOS_HOST, else the \"host\" field in ekanos.json, else the',\n ' sole stored login. \"ekanos publish\" saves host and source to ekanos.json.',\n ' \"ekanos login\" never reads ekanos.json for a host (--host, else',\n ' EKANOS_HOST, else the sole stored login) — it is the verb that creates',\n ' credentials, so a committed file must never choose where they go.',\n '',\n 'Publish targeting (see \"ekanos sources\" / \"ekanos use\"):',\n ' publish refuses (FORBIDDEN) a source you hold no seat on. With multiple',\n ' seats and an implicit (ekanos.json) source, a human run asks to confirm',\n ' the target; a scripted/JSON run needs --source or --yes to proceed —',\n ' it never prompts and never guesses.',\n '',\n 'Global options:',\n ' --json Emit a single JSON envelope on stdout (auto-on when piped);',\n ' --no-json forces the human-readable form',\n ' --version Print the CLI version',\n ' --help Show this help',\n].join('\\n');\n\nexport interface RunOptions {\n stdout?: WriteStream;\n stderr?: WriteStream;\n env?: Record<string, string | undefined>;\n cwd?: string;\n /**\n * Test-only overrides for `publish`'s interactive-confirm gate — see\n * `PublishArgs` in `commands/publish.ts`. Never set these from real CLI\n * wiring; they exist so a test can exercise the human y/N confirm branch\n * without a real terminal.\n */\n stdinIsTTY?: boolean;\n confirm?: (question: string) => Promise<boolean>;\n /**\n * Test-only override for `status --watch`'s poll delay — see `StatusArgs`\n * in `commands/status.ts`. Never set this from real CLI wiring; it exists\n * so a test can exercise the poll loop without waiting 30s per iteration.\n */\n sleep?: (ms: number) => Promise<void>;\n}\n\n/**\n * The single entry point. Resolves the agent-native envelope once, dispatches\n * to a verb, and guarantees exactly one terminal emission (success or error).\n * Returns the process exit code — `bin.ts` is the only place that calls\n * `process.exit`, so this stays fully testable.\n */\nexport async function run(\n argv: readonly string[],\n options: RunOptions = {},\n): Promise<number> {\n const jsonFlag = scanJsonFlag(argv);\n const ctx = new CliContext({\n jsonFlag,\n stdout: options.stdout,\n stderr: options.stderr,\n env: options.env,\n });\n const cwd = options.cwd ?? process.cwd();\n const env = options.env ?? process.env;\n\n try {\n // `--version` is global and verb-independent, so it is answered before the\n // command is even resolved: `ekanos --version` and `ekanos validate\n // --version` both report the tool's version and exit 0.\n if (scanFlagPresence(argv, 'version')) {\n return emitVersion(ctx);\n }\n\n const { command, rest } = splitCommand(argv);\n\n // Top-level help / no command.\n if (!command) {\n if (scanFlagPresence(rest, 'help') || argv.length === 0) {\n return emitHelp(ctx);\n }\n // A leading token that is not a command (e.g. `--nonsense`).\n ctx.emitClaudeCodeHint({\n tool: 'ekanos',\n error: 'unknown-command',\n commands: COMMANDS,\n usage: USAGE,\n });\n throw usageError(\n `Unknown command or flag \"${argv[0]}\".`,\n `Run one of: ${COMMANDS.join(', ')}. See \"ekanos --help\".`,\n );\n }\n\n if (!COMMANDS.includes(command)) {\n ctx.emitClaudeCodeHint({\n tool: 'ekanos',\n error: 'unknown-command',\n given: command,\n commands: COMMANDS,\n usage: USAGE,\n });\n throw usageError(\n `Unknown command \"${command}\".`,\n `Run one of: ${COMMANDS.join(', ')}. See \"ekanos --help\".`,\n );\n }\n\n const specs: FlagSpecs = { ...GLOBAL_SPECS, ...COMMAND_SPECS[command] };\n const parsed = parseArgv(rest, specs);\n\n if (parsed.flags.help === true) {\n return emitCommandHelp(ctx, command);\n }\n\n const positionalName = POSITIONAL_COMMANDS[command];\n\n if (!positionalName && parsed.positionals.length > 0) {\n throw usageError(\n `\"${command}\" takes no positional arguments (got \"${parsed.positionals[0]}\").`,\n `Pass options as flags, e.g. \"--dir <path>\". See \"ekanos ${command} --help\".`,\n );\n }\n\n if (positionalName && parsed.positionals.length > 1) {\n throw usageError(\n `\"${command}\" takes at most one positional argument (a ` +\n `${positionalName}), got ${parsed.positionals.length}.`,\n `Pass exactly one, e.g. \"ekanos ${command} <${positionalName}>\". ` +\n `See \"ekanos ${command} --help\".`,\n );\n }\n\n const dir = (parsed.flags.dir as string | undefined) ?? cwd;\n\n switch (command) {\n case 'init':\n return runInit(ctx, {\n slug: parsed.flags.slug as string | undefined,\n dir: parsed.flags.dir as string | undefined,\n cwd,\n force: parsed.flags.force === true,\n yes: parsed.flags.yes === true,\n docs: parsed.flags.docs as string[] | undefined,\n });\n case 'validate':\n return await runValidate(ctx, { dir, env });\n case 'dev':\n return await runDev(ctx, {\n dir,\n port: parsed.flags.port as string | undefined,\n host: parsed.flags.host as string | undefined,\n force: parsed.flags.force === true,\n start: parsed.flags.start as boolean | undefined,\n env,\n });\n case 'test':\n return await runTest(ctx, { dir, passthrough: parsed.passthrough });\n case 'login':\n return await runLogin(ctx, {\n host: parsed.flags.host as string | undefined,\n force: parsed.flags.force === true,\n cwd,\n env,\n });\n case 'logout':\n return await runLogout(ctx, {\n host: parsed.flags.host as string | undefined,\n all: parsed.flags.all === true,\n cwd,\n env,\n });\n case 'whoami':\n return await runWhoami(ctx, {\n host: parsed.flags.host as string | undefined,\n cwd,\n env,\n });\n case 'status':\n return await runStatus(ctx, {\n host: parsed.flags.host as string | undefined,\n dir,\n env,\n findings: parsed.flags.findings === true,\n watch: parsed.flags.watch === true,\n sleep: options.sleep,\n });\n case 'sources':\n return await runSources(ctx, {\n host: parsed.flags.host as string | undefined,\n dir,\n env,\n });\n case 'use':\n return await runUse(ctx, {\n host: parsed.flags.host as string | undefined,\n dir,\n slug: parsed.positionals[0],\n env,\n });\n case 'publish':\n return await runPublish(ctx, {\n host: parsed.flags.host as string | undefined,\n source: parsed.flags.source as string | undefined,\n dir,\n yes: parsed.flags.yes === true,\n env,\n stdinIsTTY: options.stdinIsTTY,\n confirm: options.confirm,\n });\n case 'upgrade':\n return await runUpgrade(ctx, {\n dir,\n host: parsed.flags.host as string | undefined,\n env,\n check: parsed.flags.check === true,\n yes: parsed.flags.yes === true,\n noVerify: parsed.flags.verify === false,\n stdinIsTTY: options.stdinIsTTY,\n confirm: options.confirm,\n });\n default:\n // Unreachable — COMMANDS gate above — but keeps the switch total.\n throw usageError(\n `Unknown command \"${command}\".`,\n `Run one of: ${COMMANDS.join(', ')}.`,\n );\n }\n } catch (error) {\n return ctx.fail(toCliError(error));\n }\n}\n\n/**\n * Presence of `--json` (or `--no-json`) BEFORE the first `--` passthrough.\n *\n * Tri-state on purpose. `undefined` means \"the user expressed no preference\",\n * which is what lets the context fall back to inferring the mode from a\n * non-TTY stdout or CLAUDECODE. Collapsing `--no-json` to `false` here would\n * make it indistinguishable from absence, and the flag could then never turn\n * JSON mode OFF in exactly the cases it exists for.\n */\nfunction scanJsonFlag(argv: readonly string[]): boolean | undefined {\n for (const token of argv) {\n if (token === '--') break;\n if (token === '--json') return true;\n if (token === '--no-json') return false;\n }\n return undefined;\n}\n\nfunction scanFlagPresence(argv: readonly string[], name: string): boolean {\n for (const token of argv) {\n if (token === '--') break;\n if (token === `--${name}`) return true;\n }\n return false;\n}\n\n/**\n * Split argv into the command (first bare token before `--`) and the rest\n * (everything else, order preserved, including global flags and the `--`\n * passthrough). Global flags are all booleans, so any bare token is the\n * command — no value-consumption ambiguity.\n */\nfunction splitCommand(argv: readonly string[]): {\n command: string | null;\n rest: string[];\n} {\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]!;\n if (token === '--') break;\n if (!token.startsWith('-')) {\n return {\n command: token,\n rest: [...argv.slice(0, i), ...argv.slice(i + 1)],\n };\n }\n }\n return { command: null, rest: [...argv] };\n}\n\n/**\n * The CLI's own version, read from the package manifest at runtime rather than\n * baked in by the build — one source of truth, so a release bump cannot leave\n * `--version` reporting a stale number. The path resolves identically from\n * `src/index.ts` and from the emitted `dist/index.js`, both of which sit one\n * directory below the package root.\n */\nfunction readVersion(): string {\n const manifest = new URL('../package.json', import.meta.url);\n const parsed: unknown = JSON.parse(fs.readFileSync(manifest, 'utf8'));\n\n return typeof parsed === 'object' &&\n parsed !== null &&\n 'version' in parsed &&\n typeof parsed.version === 'string'\n ? parsed.version\n : '0.0.0';\n}\n\nfunction emitVersion(ctx: CliContext): number {\n const version = readVersion();\n\n return ctx.succeed({ name: 'ekanos', version }, version);\n}\n\nfunction emitHelp(ctx: CliContext): number {\n ctx.emitClaudeCodeHint({\n tool: 'ekanos',\n commands: COMMANDS,\n usage: USAGE,\n exitCodes: EXIT_CODES,\n });\n return ctx.succeed({ usage: USAGE, commands: COMMANDS }, USAGE);\n}\n\nfunction emitCommandHelp(ctx: CliContext, command: string): number {\n const specs = COMMAND_SPECS[command] ?? {};\n const flags = Object.keys(specs).map((name) => `--${name}`);\n const help = `Usage: ekanos ${command} [${flags.join('] [')}]`;\n ctx.emitClaudeCodeHint({ tool: 'ekanos', command, flags });\n return ctx.succeed({ command, flags }, help);\n}\n"]}
|