favilla 0.0.0-stage → 1.2.17
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/LICENSE +21 -0
- package/README.md +213 -2
- package/bin/favilla.mjs +7 -0
- package/dist/assets/design/LICENSE +24 -0
- package/dist/assets/design/app.json +584 -0
- package/dist/assets/design/directions.json +337 -0
- package/dist/assets/design/palettes.json +596 -0
- package/dist/assets/design/type.json +618 -0
- package/dist/assets/desktop/windows.ps1 +244 -0
- package/dist/assets/music/render.js +446 -0
- package/dist/assets/music/sounds.json +1 -0
- package/dist/assets/paint/engine.js +2385 -0
- package/dist/assets/preview/point.js +187 -0
- package/dist/assets/prompts/agent-explore.md +5 -0
- package/dist/assets/prompts/agent-general.md +7 -0
- package/dist/assets/prompts/answer-plain.md +29 -0
- package/dist/assets/prompts/answer-structured.md +59 -0
- package/dist/assets/prompts/app-styles.md +5 -0
- package/dist/assets/prompts/autonomous.md +2 -0
- package/dist/assets/prompts/base.md +38 -0
- package/dist/assets/prompts/brief-looks.md +9 -0
- package/dist/assets/prompts/brief-made.md +8 -0
- package/dist/assets/prompts/brief-review.md +29 -0
- package/dist/assets/prompts/brief.md +32 -0
- package/dist/assets/prompts/compact.md +13 -0
- package/dist/assets/prompts/design-look-blind.md +1 -0
- package/dist/assets/prompts/design-look.md +1 -0
- package/dist/assets/prompts/design-measure.md +1 -0
- package/dist/assets/prompts/design.md +32 -0
- package/dist/assets/prompts/directions.md +9 -0
- package/dist/assets/prompts/documents.md +6 -0
- package/dist/assets/prompts/engineering.md +10 -0
- package/dist/assets/prompts/family-open.md +4 -0
- package/dist/assets/prompts/plan.md +8 -0
- package/dist/assets/prompts/shadow-tests-js.md +12 -0
- package/dist/assets/prompts/shadow-tests-py.md +12 -0
- package/dist/assets/prompts/shadow-tests.md +12 -0
- package/dist/assets/prompts/style-deepseek.md +7 -0
- package/dist/assets/prompts/style-glm.md +4 -0
- package/dist/assets/prompts/style-gpt.md +4 -0
- package/dist/assets/prompts/tools-claude.md +9 -0
- package/dist/assets/prompts/tools-codex.md +11 -0
- package/dist/assets/prompts/tools-favilla.md +9 -0
- package/dist/assets/prompts/voices/favilla.md +42 -0
- package/dist/assets/prompts/writing-docs.md +17 -0
- package/dist/assets/skills/motion/SKILL.md +116 -0
- package/dist/assets/skills/music/SKILL.md +130 -0
- package/dist/assets/skills/paint/SKILL.md +212 -0
- package/dist/favilla.mjs +312004 -0
- package/dist/web/assets/Settings-BQtvLY2w.js +9 -0
- package/dist/web/assets/abnfDiagram-YUKMZFIV-DrJJw1P9.js +1 -0
- package/dist/web/assets/arc-Y1ARJVZ4.js +1 -0
- package/dist/web/assets/architecture-WOLXFQ4H-B6f5PE5v.js +1 -0
- package/dist/web/assets/architectureDiagram-47P4ROYG-DvUSStVc.js +36 -0
- package/dist/web/assets/array-BifhSqXX.js +1 -0
- package/dist/web/assets/blockDiagram-E7TT5TSB-SgPSaRHT.js +140 -0
- package/dist/web/assets/board-BTd_WPzR.png +0 -0
- package/dist/web/assets/c4Diagram-CRA5TL53-B_nDX4sS.js +38 -0
- package/dist/web/assets/channel-Chz0CiLa.js +1 -0
- package/dist/web/assets/chunk-2BW5OAIV-CZvfDHzx.js +10 -0
- package/dist/web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/assets/chunk-3YJQHVM4-3nEvEbyp.js +2 -0
- package/dist/web/assets/chunk-4EA7E6EY-NsBjePnm.js +1 -0
- package/dist/web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/assets/chunk-7TKQ45FW-CnWiB-Cj.js +1 -0
- package/dist/web/assets/chunk-AW2ZBBNX-BAor5wBK.js +88 -0
- package/dist/web/assets/chunk-DBDB3WZW-8D-lLkOt.js +1 -0
- package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/web/assets/chunk-E2ZNV5FY-D8L__avl.js +72 -0
- package/dist/web/assets/chunk-EU5HNXII-Bbmqjgwi.js +213 -0
- package/dist/web/assets/chunk-FVRAUYC3-D7kgWhyj.js +2 -0
- package/dist/web/assets/chunk-HJ2JQQFS-DgVQIefQ.js +1 -0
- package/dist/web/assets/chunk-HTAEGDNF-CEM8blxY.js +1 -0
- package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/assets/chunk-KQW6MTUR-CwTR03Zv.js +1 -0
- package/dist/web/assets/chunk-NGNAAXSQ-Bw6tHVuc.js +136 -0
- package/dist/web/assets/chunk-NTY3LDVX-BCN79keJ.js +1 -0
- package/dist/web/assets/chunk-VPRB5NB3-DE6ywIBH.js +129 -0
- package/dist/web/assets/chunk-XC4XBNZT-C-g-FjRO.js +62 -0
- package/dist/web/assets/chunk-XXDRQBXY-CnbRkih_.js +1 -0
- package/dist/web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/assets/classDiagram-v2-K4WV4PDN-C0Cfs-Cq.js +217 -0
- package/dist/web/assets/cose-bilkent-JH36ORCC-K3dQfwLT.js +1 -0
- package/dist/web/assets/cynefin-EF2NZ3EQ-T7AqHc4N.js +1 -0
- package/dist/web/assets/cynefinDiagram-3GCD6N5R-YXsgXRdL.js +62 -0
- package/dist/web/assets/cytoscape.esm-Bn1wUjr1.js +321 -0
- package/dist/web/assets/dagre-W4DXFKR2-DWie709t.js +4 -0
- package/dist/web/assets/de-CWzByTTc.js +1 -0
- package/dist/web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/assets/diagram-2UJZ2QOL-BXeedlB_.js +200 -0
- package/dist/web/assets/diagram-OVF4WLC6-qHY97DxC.js +24 -0
- package/dist/web/assets/diagram-PFPMY2P6-heEPog41.js +30 -0
- package/dist/web/assets/diagram-UMYRVEAY-Bnn29IXo.js +24 -0
- package/dist/web/assets/diagram-YEKJPTXX-DXDLI8vd.js +41 -0
- package/dist/web/assets/diagram-ZIFT7M5P-ChRqkJ06.js +3 -0
- package/dist/web/assets/dist-CumnGVmJ.js +1 -0
- package/dist/web/assets/ebnfDiagram-VR2GEFS7-CbwTtNaR.js +1 -0
- package/dist/web/assets/elk-IJKZMXRS-BcwQqggq.js +27 -0
- package/dist/web/assets/erDiagram-O2IAPWRE-BZWfuymp.js +99 -0
- package/dist/web/assets/es-C1Nnd4WK.js +1 -0
- package/dist/web/assets/eventmodeling-K75KTNOO-DmKGHuTO.js +1 -0
- package/dist/web/assets/flowDiagram-OXPTDLAJ-DS6E3sAx.js +1 -0
- package/dist/web/assets/fr-DDf0krct.js +1 -0
- package/dist/web/assets/ganttDiagram-R7TSEDQI-C6YjmGx2.js +292 -0
- package/dist/web/assets/gitGraph-VSP46ZUC-CWDqULxT.js +1 -0
- package/dist/web/assets/gitGraphDiagram-XJZIOB7I-CQ4dT1pA.js +106 -0
- package/dist/web/assets/graphite-Cqtfi16Z.png +0 -0
- package/dist/web/assets/graphite-board-J7Jiesmo.png +0 -0
- package/dist/web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 +0 -0
- package/dist/web/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-400-italic-Bf1n82Tb.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-400-italic-D9J6q4_O.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-400-italic-BELOEI8R.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-400-italic-CfSXsIbO.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-400-italic-BEZwmy7D.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-400-italic-CTYLy0lX.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-400-italic-CZTNEAuW.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-400-italic-CsGl1sm0.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-400-italic-Du9zzoL2.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-400-italic-V_9i1P_m.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-400-italic-78jqtfZH.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-400-italic-BbRnwouv.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- package/dist/web/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- package/dist/web/assets/index-CG6Oo0ii.js +87 -0
- package/dist/web/assets/index-DmSaMuo4.css +1 -0
- package/dist/web/assets/info-OHQRW6UA-B8xQKWbJ.js +1 -0
- package/dist/web/assets/infoDiagram-5W2HQ5XZ-CrmPcg4u.js +2 -0
- package/dist/web/assets/init-C-OQMol4.js +1 -0
- package/dist/web/assets/ishikawaDiagram-K3B6WC7H-D_cryvUp.js +70 -0
- package/dist/web/assets/ja-Dn7BGnzp.js +1 -0
- package/dist/web/assets/journeyDiagram-COXZFDF6-D_g2OZk5.js +139 -0
- package/dist/web/assets/kanban-definition-P3RFRI5V-slArz_fE.js +89 -0
- package/dist/web/assets/katex-DJhrJSbw.js +257 -0
- package/dist/web/assets/kiln-board-BkQiBelw.png +0 -0
- package/dist/web/assets/kiln-night-board-qRfEZdbh.png +0 -0
- package/dist/web/assets/kiln-night-irZPi85h.png +0 -0
- package/dist/web/assets/kiln-paper-DqGQJ0fA.png +0 -0
- package/dist/web/assets/ko-jviDJlGF.js +1 -0
- package/dist/web/assets/line-p1USWFRd.js +1 -0
- package/dist/web/assets/linear-gLkGxN9m.js +1 -0
- package/dist/web/assets/mermaid-parser.core-D9WklGnt.js +7 -0
- package/dist/web/assets/mermaid.core-CVFwvwq0.js +44 -0
- package/dist/web/assets/mindmap-definition-LZFPQGKD-iqV7hRTk.js +96 -0
- package/dist/web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/assets/packet-JDAUHWVQ-Dgre0rx9.js +1 -0
- package/dist/web/assets/path-fybaL0A-.js +1 -0
- package/dist/web/assets/pegDiagram-BGZESJAR-C5cr8F-q.js +1 -0
- package/dist/web/assets/pie-XZMESJXO-CdYWmJK8.js +1 -0
- package/dist/web/assets/pieDiagram-CAPJLFHJ-ZihkVFV7.js +39 -0
- package/dist/web/assets/plain-board-BBiiHVVS.png +0 -0
- package/dist/web/assets/porcelain-b-oAG5nr.png +0 -0
- package/dist/web/assets/porcelain-board-Ct_T1k1X.png +0 -0
- package/dist/web/assets/pt-BR-B97wPDmD.js +1 -0
- package/dist/web/assets/quadrantDiagram-GDMTTRAM-BPenvwqU.js +7 -0
- package/dist/web/assets/radar-ABXABTNO-DNYDdN-q.js +1 -0
- package/dist/web/assets/railroad-I3PHUGI6-DMbMxPxq.js +1 -0
- package/dist/web/assets/railroad-abnf-LNEFI6M7-BJNcyRdm.js +1 -0
- package/dist/web/assets/railroad-ebnf-DWYD2UWJ-D4gAVW_H.js +1 -0
- package/dist/web/assets/railroad-peg-JR7BVNR7-CYE2hs_r.js +1 -0
- package/dist/web/assets/railroadDiagram-SM67HX2B-D0G35893.js +1 -0
- package/dist/web/assets/requirementDiagram-X7JNWC4A-DpKhltO7.js +84 -0
- package/dist/web/assets/rolldown-runtime-COiEfhsA.js +1 -0
- package/dist/web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/assets/ru-acinLx75.js +1 -0
- package/dist/web/assets/sankeyDiagram-UM26HJRW-D22siN9n.js +40 -0
- package/dist/web/assets/sequenceDiagram-ZO4K6R2Y-DLeJtf6k.js +169 -0
- package/dist/web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/web/assets/src-BWF7jMDv.js +1 -0
- package/dist/web/assets/stateDiagram-v2-TBUQTH76-O67PPfKw.js +291 -0
- package/dist/web/assets/swimlanes-N4OXWK64-7ibtwNjg.js +1 -0
- package/dist/web/assets/swimlanesDiagram-K3J5GTZL-4LDeytP0.js +8 -0
- package/dist/web/assets/timeline-definition-YOQAKGHF-DAwFj5sK.js +120 -0
- package/dist/web/assets/treeView-D4JQ5SDB-DX81ygOJ.js +1 -0
- package/dist/web/assets/treemap-SAJKECNS-CPrcTbfu.js +1 -0
- package/dist/web/assets/usecaseDiagram-VIAY4XPW-By1FKcQG.js +328 -0
- package/dist/web/assets/vellum-Dy0uS4B3.png +0 -0
- package/dist/web/assets/vennDiagram-BLWOH2XV-CJcEvP9-.js +34 -0
- package/dist/web/assets/wardley-7MLQ67FV-C4CboNLh.js +1 -0
- package/dist/web/assets/wardleyDiagram-YMQ3BMBF-BhFQc_KH.js +78 -0
- package/dist/web/assets/xychartDiagram-TAQBALBS-BWGadiHi.js +7 -0
- package/dist/web/assets/zh-TW-BXXhkC_c.js +1 -0
- package/dist/web/icon-small.png +0 -0
- package/dist/web/icon.png +0 -0
- package/dist/web/index.html +19 -0
- package/dist/web/manifest.webmanifest +11 -0
- package/dist/web/sw.js +29 -0
- package/package.json +39 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fuddle_yichi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,214 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center"><img src="packages/web/public/icon.png" width="96" alt=""></p>
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<h1 align="center">Favilla</h1>
|
|
4
|
+
|
|
5
|
+
<p align="center">An open-source, general-purpose AI agent for the terminal and the desktop.</p>
|
|
6
|
+
|
|
7
|
+
<p align="center"><a href="https://favilla.melodybounce.com/">Website</a> · <a href="https://github.com/benelatuit/favilla/releases">Downloads</a> · <a href="README.zh-CN.md">中文说明</a></p>
|
|
8
|
+
|
|
9
|
+
Favilla handles coding, documents, web research, email and computer tasks, and keeps a record of each step. It works with OpenAI, Anthropic, Gemini, DeepSeek, Kimi, GLM, Qwen, OpenRouter, xAI, any OpenAI-compatible server, or a model running on your own machine. One engine drives three front ends: a terminal UI, a desktop app and a page in your browser.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
On macOS and Linux, with Node.js 22 or later:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g favilla
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
It installs the `favilla` and `fav` commands. Run it again to update.
|
|
20
|
+
|
|
21
|
+
On Windows 10 or 11, in PowerShell:
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
irm https://favilla.melodybounce.com/install.ps1 | iex
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
It installs the desktop app with the `favilla` and `fav` commands for your user, with no administrator rights, and checks the download against its SHA-256 first. Run it again to update. The installer and a portable exe are also on the [releases page](https://github.com/benelatuit/favilla/releases). For the commands without the desktop app, `npm install -g favilla` works on Windows too.
|
|
28
|
+
|
|
29
|
+
Then, in a project folder:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
fav # the terminal UI
|
|
33
|
+
fav -p "fix the failing test" # one run without the UI, for scripts and CI
|
|
34
|
+
git diff | fav -p "review this" # with piped input
|
|
35
|
+
fav web # the same UI in your browser
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Add a model in the app under Settings > Providers, or set a provider's key variable (see [Models](#models)).
|
|
39
|
+
|
|
40
|
+
## From source
|
|
41
|
+
|
|
42
|
+
On Linux and macOS, or to work on Favilla itself, you need Node 22 or newer and pnpm 9.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
git clone https://github.com/benelatuit/favilla && cd favilla
|
|
46
|
+
pnpm install
|
|
47
|
+
export ANTHROPIC_API_KEY=... # or any provider's key, see "Models" below
|
|
48
|
+
pnpm fav # terminal UI in the current folder
|
|
49
|
+
pnpm fav -p "fix the failing test" # one run without the UI
|
|
50
|
+
pnpm fav web # the same UI in your browser
|
|
51
|
+
pnpm --filter @favilla/desktop start # the desktop app from source
|
|
52
|
+
pnpm --filter @favilla/desktop dist # Windows installer and portable exe in packages/desktop/release
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Features
|
|
56
|
+
|
|
57
|
+
### Working on code
|
|
58
|
+
|
|
59
|
+
- **Batched tool calls.** `read` takes several files and line ranges at once, along with folders, images, notebooks and PDFs. `search` covers contents and file names, and also takes a plain question ("where are failed uploads retried") to find code by what it does. `edit` makes several exact replacements in one call and names any that did not match. `shell` runs commands, and hands servers and interactive programs to `job`.
|
|
60
|
+
- **Edit matching.** Matching is exact first, then tolerates whitespace, indentation, escaping and drift, and refuses ambiguous matches with line numbers. Every edit is followed by a syntax check (TypeScript, JavaScript, Python, JSON, YAML), so a broken bracket is reported next to the edit that caused it. Files keep their encoding: GBK stays GBK.
|
|
61
|
+
- **The same tools for every model.** A session can switch models without compacting. If you prefer the tool sets models were trained on, `"tools": "auto"` gives GPT models `shell_command` with `apply_patch` and Anthropic models `Read / Edit / Bash / Grep`.
|
|
62
|
+
- **Reasoning replay.** Anthropic thinking blocks keep their signatures, OpenAI reasoning items their encrypted content, Gemini parts their thought signatures, and compatible APIs get `reasoning_content` or `<think>` back the way each family expects.
|
|
63
|
+
- **Sub-agents.** A sub-agent that changes files can change only the files assigned to it, and sub-agents whose files could overlap run one after another. Each report ends with Favilla’s own record: files changed, lines added and removed, commands and exit codes.
|
|
64
|
+
- **Branches and undo.** Any sent message can be edited and sent again as a new branch, and any answer can start one. Every file the agent changes is snapshotted per turn, so `/undo` or the app can restore a turn.
|
|
65
|
+
|
|
66
|
+
### Long sessions
|
|
67
|
+
|
|
68
|
+
- **Stable prompt prefix.** The system prompt and tools are built once per session and are not changed afterwards. The prefix stays byte for byte the same, which keeps prompt caching effective with every provider, llama.cpp's KV cache included.
|
|
69
|
+
- **Context sized to the model's window.** Budgets and the compaction point come from the model's actual window, read from the provider or from [models.dev](https://models.dev), and each model's window can be set by hand.
|
|
70
|
+
- **Trimming old output.** From half the window on, tool output that later calls superseded is cut to a stub. The full text stays on disk and `recall` brings it back or searches the whole history.
|
|
71
|
+
- **Compaction.** Your messages are kept verbatim across summaries, along with the last tool rounds. The summary is checked against Favilla's record of which lines of which files were read, so it matches what was actually read. It is written in the background while the agent keeps working.
|
|
72
|
+
- **Effort levels per model.** The effort picker offers what the model takes, `max` included. A level a server refuses is read from the error, remembered, and the request is sent again at the nearest level it accepts.
|
|
73
|
+
- **Crash recovery.** A tool call left without a result when Favilla closed is answered when the session reopens. Ctrl+C and closing the app end the turn cleanly and stop its background jobs.
|
|
74
|
+
|
|
75
|
+
### Checks
|
|
76
|
+
|
|
77
|
+
- **Page checks.** After a turn changes a page that runs without a build step, Favilla opens it at desktop and phone width in a headless browser and reports console errors, horizontal scrolling, text below WCAG AA contrast, controls too small to tap and images that failed to load.
|
|
78
|
+
- **Browser tool.** Each page comes back as a list of interactive elements with refs (`[e7] button "Save"`) to click, fill and upload by. It follows new tabs, answers dialogs, keeps downloads, and renders at any width (390 px is a phone).
|
|
79
|
+
- **Web search.** GPT models on the OpenAI API use OpenAI's own search. Every other model gets a built-in search over DuckDuckGo and Bing, with Brave and SearXNG when you add them. Pages are read as text, in their own charset; GitHub, Stack Overflow and package registries are read through their APIs.
|
|
80
|
+
- **Images.** Reading an image gives its size, and reading a region shows that part enlarged, so small text can be read. `draw` renders SVG to PNG with a check sheet; `paint` keeps a canvas between calls and paints with real media.
|
|
81
|
+
- **Answer checks.** Code changed after the last run gets one reminder to run the checks. A message with several asks gets a short check of what the answer left out. After two failed attempts in a row, the effort goes up a level for the rest of the turn.
|
|
82
|
+
- **Tests from another model.** With `shadowTests.model` set to a model from another family, a fix gets tests written by that model from the request alone, in a copy of the project. A test that fails on the change sends the work back once.
|
|
83
|
+
|
|
84
|
+
### Other features
|
|
85
|
+
|
|
86
|
+
- **MCP servers.** Servers under `mcpServers` (a local command, or a URL speaking streamable HTTP or SSE) start once, and their tools reach every session. `favilla mcp` lists them.
|
|
87
|
+
- **Skills.** Skill folders (a `SKILL.md` with a name and description) in `.favilla/skills`, `~/.favilla/skills`, `~/.agents/skills` or `~/.claude/skills` are listed one line each; the model reads one when the task matches.
|
|
88
|
+
- **Mail.** Settings > Mail takes Gmail and other mailboxes with an app password. The agent searches, reads, sorts and drafts; every email it would send is shown to you first.
|
|
89
|
+
- **SillyTavern presets.** A chat-completion preset's prompts go into each request in their own layers, roles and depths, with macros and prefill. Only prompts and prefill are read. Model, temperature and proxy settings in the preset are ignored.
|
|
90
|
+
- **Computer control, off by default.** On Windows the agent can take screenshots, click, type and press keys. Moving the mouse to the top-left corner stops it.
|
|
91
|
+
- **Remote control from your phone.** Pair a phone by QR code and follow sessions, send messages and answer approvals from it, through a relay you run yourself. See [Remote control](#remote-control).
|
|
92
|
+
- **Disk and memory use.** Images, long outputs and file snapshots live once in a compressed blob store; an idle session is repacked and compressed (one long session went from 36 MB to 0.3 MB). The agent's browser closes a few minutes after its last use.
|
|
93
|
+
|
|
94
|
+
## Safety
|
|
95
|
+
|
|
96
|
+
Commands that can cause loss need confirmation: recursive deletes of a root, your home, the workspace or folders outside it; discarding uncommitted git work; force pushes and history rewrites; disk, boot and power commands; killing processes by name; publishing packages; dropping databases. They wait for your confirmation and are refused in unattended runs. Other commands run without asking. A command that would use up the computer's memory is stopped, and the agent is told to run a narrower one.
|
|
97
|
+
|
|
98
|
+
A project's `.favilla/config.json` can set models, instructions, skills and the tool style, but not providers, keys, MCP servers, the shell or approvals, so a repository you open cannot change your keys, run programs or turn approvals off.
|
|
99
|
+
|
|
100
|
+
## Models
|
|
101
|
+
|
|
102
|
+
- **API keys.** Set the usual variable (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY` or a comma-separated `GEMINI_API_KEYS` that rotate on rate limits, `DEEPSEEK_API_KEY`, `MOONSHOT_API_KEY`, `ZHIPU_API_KEY`, `DASHSCOPE_API_KEY`, `OPENROUTER_API_KEY`, `XAI_API_KEY`), or paste the key in Settings > Providers.
|
|
103
|
+
- **A local model.** Any OpenAI-compatible server. The `local` provider points at llama.cpp's default port; change `providers.local.baseUrl` for another.
|
|
104
|
+
- **A server of your own.** Settings > Providers > Add a provider takes any server with an OpenAI-compatible, OpenAI Responses, Anthropic or Gemini API: a name, the address and a key.
|
|
105
|
+
- **Models a server does not list.** Under any provider in Settings > Providers, Add a model takes its id. Its window and whether it reads pictures are set under Models.
|
|
106
|
+
|
|
107
|
+
`favilla models` lists what each provider serves.
|
|
108
|
+
|
|
109
|
+
## Configuration
|
|
110
|
+
|
|
111
|
+
Settings in the app write `~/.favilla/config.json`; you can also edit it by hand (comments are allowed). A project's `.favilla/config.json` overrides the parts listed under [Safety](#safety).
|
|
112
|
+
|
|
113
|
+
```jsonc
|
|
114
|
+
{
|
|
115
|
+
"model": "anthropic/claude-sonnet-5-5",
|
|
116
|
+
"effort": "medium", // off, minimal, low, medium, high, xhigh, max: what the model supports
|
|
117
|
+
"proxy": "http://127.0.0.1:7890", // for remote providers; local ones always connect directly
|
|
118
|
+
"providers": {
|
|
119
|
+
"local": { "baseUrl": "http://127.0.0.1:8090/v1" },
|
|
120
|
+
"gemini": { "keyFile": "/path/to/gemini.env" },
|
|
121
|
+
"openai": { "models": { "gpt-6-luna": { "contextWindow": 400000 } } } // a model's window, set by hand
|
|
122
|
+
},
|
|
123
|
+
"guard": { "mode": "confirm" }, // or "off"
|
|
124
|
+
"webSearch": true, // false, or "builtin" / "provider" to choose the search
|
|
125
|
+
"skills": true, // false, or a list of extra skill folders
|
|
126
|
+
"shell": "bash", // bash (Git Bash on Windows), pwsh, powershell, cmd, or a path
|
|
127
|
+
"tools": "favilla", // Favilla's own tools, or "auto" for the ones each model family was trained on
|
|
128
|
+
"computer": false, // true lets the agent use this computer's screen, mouse and keyboard (Windows)
|
|
129
|
+
"context": { "compactAt": 0.82 }, // compact once the context is this full
|
|
130
|
+
"mcpServers": {
|
|
131
|
+
"docs": { "url": "https://example.com/mcp", "headers": { "Authorization": "Bearer …" } },
|
|
132
|
+
"browser": { "command": "npx", "args": ["@playwright/mcp@latest"] }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Standing instructions go in `~/.favilla/AGENTS.md` for every project, and in a project's own `AGENTS.md` or `CLAUDE.md`. Settings > Rules edits them in place.
|
|
138
|
+
|
|
139
|
+
## Terminal UI
|
|
140
|
+
|
|
141
|
+
`fav` (or `favilla`) in a folder opens the terminal UI. Replies are printed block by block as each block completes, so long answers do not redraw the screen. Diffs, commands, checks and search results each have their own layout, and every sub-agent at work keeps a live line with its current step.
|
|
142
|
+
|
|
143
|
+
| Keys | |
|
|
144
|
+
|---|---|
|
|
145
|
+
| Enter / Shift+Enter, Alt+Enter, Ctrl+J | send / new line |
|
|
146
|
+
| Esc / Esc Esc | stop the agent / go back to an earlier message to edit it or branch from it |
|
|
147
|
+
| Shift+Tab | plan mode on or off |
|
|
148
|
+
| Alt+V (Ctrl+V outside Windows) | paste a picture from the clipboard |
|
|
149
|
+
| ↑ / Ctrl+R | history / search it |
|
|
150
|
+
| Ctrl+G / Ctrl+T | edit the message in `$EDITOR` / read the whole transcript with search |
|
|
151
|
+
| `@path`, `!command` | attach a file / run a command and hand its output to the agent |
|
|
152
|
+
|
|
153
|
+
Commands: `/model`, `/effort`, `/plan`, `/rewind`, `/fork`, `/diff`, `/undo`, `/agents`, `/transcript`, `/context`, `/compact`, `/rules`, `/persona`, `/preset`, `/copy`, `/export`, `/review`, `/init`, `/new`, `/resume`, `/status`, `/settings`, `/cost`, `/help`, `/exit`. Markdown files in `~/.favilla/commands` or `.favilla/commands` become commands of your own, with `$ARGUMENTS` for what follows the name.
|
|
154
|
+
|
|
155
|
+
**Personas.** `/persona import FILE` takes a character card, and the agent speaks as that character in the folder, or everywhere with `--global`. `/persona none` goes back to the plain agent.
|
|
156
|
+
|
|
157
|
+
## Desktop app
|
|
158
|
+
|
|
159
|
+
The engine runs in its own process and serves the window over a loopback port guarded by a random token, so long steps do not block the window. Sessions are listed per folder by day. The agent's steps open into terminal output, diffs, previews and screenshots. The side panel shows each turn's file changes, with undo, and the context window drawn to scale. Each answer ends with a summary line: time, requests, files changed and whether the last check passed. While the window is in the background, a session that finishes or waits for you raises a notification.
|
|
160
|
+
|
|
161
|
+
| Keys | |
|
|
162
|
+
|---|---|
|
|
163
|
+
| Ctrl+K | command palette |
|
|
164
|
+
| Ctrl+N / Ctrl+O | new session / open a folder |
|
|
165
|
+
| Ctrl+B / Ctrl+Alt+B | sidebar / side panel |
|
|
166
|
+
| Esc | stop the agent |
|
|
167
|
+
| Ctrl+, | settings |
|
|
168
|
+
| Ctrl+= / Ctrl+- / Ctrl+0 | zoom |
|
|
169
|
+
|
|
170
|
+
Six themes: Drafting and Night shift (light and dark, following the system by default), Daylight, Porcelain, Plain, and Kiln with a night version of its own. `packages/web/STYLE.md` describes the look. Settings > Usage counts tokens and requests on this computer by day, model and folder, with costs estimated from each model's prices; only numbers are stored, not conversation content.
|
|
171
|
+
|
|
172
|
+
The app and the terminal UI speak English, Simplified and Traditional Chinese, Japanese, Korean, Spanish, Brazilian Portuguese, French, German and Russian, following the system's language until you pick one in Settings.
|
|
173
|
+
|
|
174
|
+
## Remote control
|
|
175
|
+
|
|
176
|
+
Settings > Remote control pairs a phone with the computer by QR code. The phone opens the same interface, follows sessions, sends messages and answers approvals. Traffic between phone and computer is end-to-end encrypted (`packages/core/src/remote/e2e.ts`). The relay only forwards encrypted messages and serves the page the phone opens.
|
|
177
|
+
|
|
178
|
+
No relay is built in. You run your own on Cloudflare Workers, and the free plan is enough:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
pnpm install
|
|
182
|
+
pnpm --filter @favilla/web build # the page the relay serves to phones
|
|
183
|
+
cd packages/relay
|
|
184
|
+
npx wrangler login
|
|
185
|
+
npx wrangler deploy # prints https://favilla-relay.<your-subdomain>.workers.dev
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Put that address in Settings > Remote control > Relay, turn remote control on and pair. For a domain of your own, see the comment in `packages/relay/wrangler.jsonc`.
|
|
189
|
+
|
|
190
|
+
## Platforms
|
|
191
|
+
|
|
192
|
+
| | Status |
|
|
193
|
+
|---|---|
|
|
194
|
+
| Windows | The main platform. The install command, the installer and the portable exe; or build them with `pnpm --filter @favilla/desktop dist`. Computer control is Windows only. |
|
|
195
|
+
| Linux | Type checks and tests pass, in CI and in a container. The terminal UI and the browser page have had little use there; no desktop package is built. |
|
|
196
|
+
| macOS | Type checks and tests run in CI. Not tried on a real Mac; no desktop package is built. |
|
|
197
|
+
|
|
198
|
+
Reports and fixes for Linux and macOS are welcome.
|
|
199
|
+
|
|
200
|
+
## Contributing
|
|
201
|
+
|
|
202
|
+
`AGENTS.md` describes the layout and the checks to run before a change is done: `pnpm typecheck` and `pnpm test`.
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
packages/core engine: providers, tools, agent loop, context, sessions, server
|
|
206
|
+
packages/cli the favilla and fav commands and the terminal UI
|
|
207
|
+
packages/web the UI (React), themes in src/themes
|
|
208
|
+
packages/desktop Electron shell and packaging
|
|
209
|
+
packages/relay the remote-control relay, a Cloudflare Worker
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## License
|
|
213
|
+
|
|
214
|
+
MIT, by fuddle_yichi.
|
package/bin/favilla.mjs
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Node keeps the compiled bundle on disk between starts: --version went from 290 to 212 ms (2026-11-02). The cache
|
|
3
|
+
// must be on before the bundle loads, so the bundle is imported after it.
|
|
4
|
+
import module from 'node:module';
|
|
5
|
+
|
|
6
|
+
module.enableCompileCache?.();
|
|
7
|
+
await import('../dist/favilla.mjs');
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
directions.json, palettes.json, type.json and app.json are taken from tasteskill (library/), cut to the fields Favilla uses.
|
|
2
|
+
https://github.com/Leonxlnx/taste-skill
|
|
3
|
+
|
|
4
|
+
MIT License
|
|
5
|
+
|
|
6
|
+
Copyright (c) 2026 Leonxlnx
|
|
7
|
+
|
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
in the Software without restriction, including without limitation the rights
|
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
furnished to do so, subject to the following conditions:
|
|
14
|
+
|
|
15
|
+
The above copyright notice and this permission notice shall be included in all
|
|
16
|
+
copies or substantial portions of the Software.
|
|
17
|
+
|
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
+
SOFTWARE.
|