From 8a41d51de56ce6e44f11485347697affec730763 Mon Sep 17 00:00:00 2001 From: TK Date: Sat, 21 Dec 2024 15:20:14 +0200 Subject: [PATCH] v1.0 --- ComfyUI_Prompt_JSON.py | 120 +++++++ LICENSE | 674 +++++++++++++++++++++++++++++++++++++ __init__.py | 21 ++ images/node.png | Bin 0 -> 13408 bytes images/node_err1.png | Bin 0 -> 12265 bytes images/node_err2.png | Bin 0 -> 13264 bytes images/node_on_manager.png | Bin 0 -> 11151 bytes pyproject.toml | 13 + 8 files changed, 828 insertions(+) create mode 100644 ComfyUI_Prompt_JSON.py create mode 100644 LICENSE create mode 100644 __init__.py create mode 100644 images/node.png create mode 100644 images/node_err1.png create mode 100644 images/node_err2.png create mode 100644 images/node_on_manager.png create mode 100644 pyproject.toml diff --git a/ComfyUI_Prompt_JSON.py b/ComfyUI_Prompt_JSON.py new file mode 100644 index 0000000..b328241 --- /dev/null +++ b/ComfyUI_Prompt_JSON.py @@ -0,0 +1,120 @@ +import json +import os +import folder_paths +from collections import OrderedDict + +# Define a default boolean parameter for input +BOOLEAN = ("BOOLEAN", {"default": False}) + +class ComfyUI_Prompt_JSON: + def __init__(self): + # Define the folder and file paths for storing prompts + self.prompt_list_folder = os.path.join(folder_paths.base_path, "Prompt") + self.json_path = os.path.join(self.prompt_list_folder, "list.json") + # Ensure the necessary files and directories exist + self.ensure_json_file_exists() + # Load the existing data from the JSON file + self.data = self.load_json() + + def ensure_json_file_exists(self): + """Ensure the prompt directory and JSON file exist. If not, create them.""" + if not os.path.exists(self.prompt_list_folder): + os.makedirs(self.prompt_list_folder, exist_ok=True) + if not os.path.exists(self.json_path): + with open(self.json_path, 'w', encoding='utf-8') as file: + json.dump({}, file, ensure_ascii=False, indent=4) + + def load_json(self): + """Load data from the JSON file into an OrderedDict.""" + with open(self.json_path, 'r', encoding='utf-8') as file: + return json.load(file, object_pairs_hook=OrderedDict) or OrderedDict() + + def save_json(self): + """Save the current data to the JSON file.""" + with open(self.json_path, 'w', encoding='utf-8') as file: + json.dump(self.data, file, ensure_ascii=False, indent=4) + + @classmethod + def INPUT_TYPES(cls): + """Define the input types for the node interface.""" + instance = cls() + items = list(instance.data.keys()) + return { + "required": { + "Prompt Name": ("STRING", {"multiline": False}), + "Overwrite": BOOLEAN, + "Console log": BOOLEAN, + "Positive Prompt": ("STRING", {"multiline": True}), + "Negative Prompt": ("STRING", {"multiline": True}), + } + } + + # Define return types for the process function + RETURN_TYPES = ("STRING", "STRING") + RETURN_NAMES = ("positive", "negative") + FUNCTION = "process" + CATEGORY = "prompt" + + @classmethod + def get_prompt_list(cls): + """Retrieve a list of all prompt names in the data.""" + instance = cls() + return list(instance.data.keys()) + + def process(self, **kwargs): + """ + Process and update prompts. + - Adds or updates a prompt based on the provided input. + - Prints prompt information if 'Console log' is enabled. + """ + prompt_name = kwargs.get("Prompt Name", "").strip() + positive_prompt = kwargs.get("Positive Prompt", "").strip() + negative_prompt = kwargs.get("Negative Prompt", None) + overwrite = kwargs.get("Overwrite", True) + console_log = kwargs.get("Console log", True) + + # Ensure the prompt name is not empty + if not prompt_name: + raise ValueError("'Prompt Name' is required and cannot be empty.") + + # Check if the prompt already exists + if prompt_name in self.data: + # If overwrite is enabled, update the existing prompt + if overwrite: + if positive_prompt: + self.data[prompt_name]["positive"] = positive_prompt + if negative_prompt is not None: + self.data[prompt_name]["negative"] = negative_prompt + else: + # For new prompts, 'Positive Prompt' is required + if not positive_prompt: + raise ValueError("'Positive Prompt' is required when adding a new prompt.") + + # Create a new prompt entry + self.data[prompt_name] = OrderedDict([ + ("positive", positive_prompt), + ("negative", negative_prompt if negative_prompt is not None else "") + ]) + + # Optionally log the prompt details to the console + if console_log: + print(f'POSITIVE: {self.data[prompt_name]["positive"]}\n') + print(f'NEGATIVE: {self.data[prompt_name]["negative"]}') + + # Save changes to the JSON file + self.save_json() + return (self.data[prompt_name]["positive"], self.data[prompt_name]["negative"]) + + @classmethod + def IS_CHANGED(cls, *args, **kwargs): + """Check for changes in the node (stub implementation).""" + return float("NaN") + +# Node mappings for the interface +NODE_CLASS_MAPPINGS = { + "ComfyUI_Prompt_JSON": ComfyUI_Prompt_JSON +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "ComfyUI_Prompt_JSON": "Prompt JSON" +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ab421c0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 2024 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) 2024 + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e3874d3 --- /dev/null +++ b/__init__.py @@ -0,0 +1,21 @@ +""" +@author: TKLAB +@title: ComfyUI_Prompt_List_JSON +@description: ComfyUI JSON-based prompt management tool. +""" + +from .ComfyUI_Prompt_JSON import ComfyUI_Prompt_JSON + +NODE_CLASS_MAPPINGS = { + "ComfyUI_Prompt_JSON": ComfyUI_Prompt_JSON +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "ComfyUI_Prompt_JSON": "Prompt JSON" +} + +WEB_DIRECTORY = "./web" + +print("\033[1;40;35m ComfyUI_Prompt_List_JSON initialized \033[0;0m") + +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] diff --git a/images/node.png b/images/node.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1cbbdc396ba0c052486a2dad89863d1322588d GIT binary patch literal 13408 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 P5XdVTW$7}Q@rVBb*|>{Y literal 0 HcmV?d00001 diff --git a/images/node_err1.png b/images/node_err1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd46a5d80c79e977b514a568b76093649e7e4da2 GIT binary patch literal 12265 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 T=RBZ=ACeT4d0#5}`RjiJI(ame literal 0 HcmV?d00001 diff --git a/images/node_err2.png b/images/node_err2.png new file mode 100644 index 0000000000000000000000000000000000000000..93f61455e1c18c796d5233f4ec984f7dc44819f7 GIT binary patch literal 13264 zcmd6OWl)vT*YAUggn%MQmw-qd8fipQx*Mb$q&d_90VxRuX*d#c=s@WMjhnv>{xrPU#uOWsw|6-LyiMM5Wc*elsW`qb%KA-VBY|L z#$!{xhag%=Uh0LWcl!36havII`Q5+PH*FIb6YemQsIe?Pqqm)?;UwJJ**V^M`XBF7AVyv*!o!)(i9F{uCbTcT=%E)>dA&ubveK5=!Rx zte4DTg%Dy8Hx7vDLh^&)k%W??Z6eaxbat;Z=|c$lI8}%w!^x9T*mP3({Td;J*>_f1 zB(c?k^@eQaL(6G(G6k`aXot9)4p#&`!)hz-^?8`7dHkCha6u97JDjrXA>kq*9alrRcV;|xc-;$J_5J~3q z<2TOBV$+Rc{~z3c`6f|r7u|D|%{w0>`IAvd@B$B!Q$J$l6W z#S(7PnrCUj#LO%!-PNohx4h?FGG`KUbyrDVx<>y)NQhLC`|Zm?HueEoJc>;lXJ%Gb z10*JW@qx25QdUJ|ad9cF$r)Sg`-*F4qIqWaxKs|Ba?8yaR98nX7^)>=`OT|m&z?PDWPG%|!dp`x3?n^^%tE zw8P!^ZZ>CDHfeONc_E%0qss6)GaG>mho9Z_^*Y%?8&#`5CC1!suJ^hQu+i;+A(E4N zEcB0dL_PbF9)#JLN=hzXboSxk;G|A!h1dndBlVHl*^AP3JVN^V7Cm*&X9l&q zc=zE`30728Tl~(tsL!7z5}z=ml+y&$Gz@1GtcVJg9O1oj1$*8&SL(cW_tn+at(7Tx zhIgeBJ32ZBGFxd`HvAtNC@U$Pc<)%6TICfMN+y)+My^`rQ4fhA1lKy_~PQ*OrzGZh``JZv{j-)@^OA~WHB}-o3&CZRAkT)|^_mN==wSR$aH>5!+ zE+}2o3PT?v9z?j_@l${j=*|&1EOVSW+ujA$jMH#^;kdA zoH=6&XeG8Y?(HphF_-xO8)`5rzD6alyJIRlah;7?o89-`ngmEi9v(Y>JE9QiNs4EB z-qY7N(fS>mk9?KI&N!Y~$zdc9pDQCR&G+}uPZ*f6_i!LfX?!#uKB}=1k9xB83O7^C zS4>9Z`FG9v zDdxk7sIPAA-)Xcn_5m?plIQlct*ss5hzK>TwzE}EoSr+?ue4Lb#6(@aGE_J)Kp+{F z-w-~p^h#OTsVB<+M%eeB-X6NV4fn?NlXBWoN-#G!^r$8?YD9nIC6a7|Y`HowQKsk+ z>r(9Bf2k3|Bd=!aoJ)R&mBGa)SYcr*M>(tiMiuq`J)WSE{xlnM{QAq!pU4FhMh1qt zXZ{kc1R#(eke{R}XTL0srU>|gCH5m$|2~)}N4EIl6INCY*@5Y1Zz4rM6isZG?;d?U z5xd+q?%)UXZt&DJmBh94BbVpP)s>a54El1Izoz@6DJ?#_?__0|{ZEI(Ni-8absXQ# zS`7qaP#EuWaMjn5ZE}fz!u0QpzmY(wQ5-qd+uLjBE{r{P*LXK)^<(1Rfga|5w-Fl<_^w`==Zl*1U(` z7SQdP=`rDvw!@WRlQWUoR>Xhl!_%obKer|%XasU6%U)E5pkHki$iEf zc;OG`{!v4nDTYRtQq$Gd)lW?PS>xB2DFwFw4j!x9#ASO%)6S8}#z*Oc9urM=4i3FK zQ#Wuvzhk0Rx9!gTHU6z0Sm^0mt@ZI5*1bxD2@b3v*!}_TW`nn;d%w}i-J{so(E4iv;QrWv^JV#X|Q6a^ZF|QpTYABsSR&A!*w#w^78C~`&EAj2yZ<$8IJwX#H zNU;W^=2^u*lKJE!AjOncemr04Bi-L%1lfJ?hXV}e92B_7r6e!k^RVkaMYu?DW5CFG z!lEj9M9}DxwgB&g7nn!<*@^W(iCBR-jIMXbVl#y9QzC3R<(2Zl9aGw7f za6qE9%^>wnM7o5HO(c7W29cky>CY9JS*q-%5S0Xb$#OQ$%*R&~FH4Y;a&>{Nt>`d| zQ8KU--XXHX0ZY*9Es_ZiY(|DsQ>|mfgPQwP@9@deKYU1;uQqu}HoUMm`THh0xj16* ziJ+jz&Rgk~l@+B;F3B3Oza?eO&9g(W&nGkpkiw-Rs;dt_2i<%h9WC~RnUvVi*(TV5 zA%|+FP7%3CkFjLEcQ4|AgdN0cZt(*4W!dz8LSAmReo1~7jns?$7oa+x?9Po9$r7Le zw0ZoP*zaWia=84j$^F7toMiqb#Xn-m9LLsT?W&A#-7cFe*E=jKCd#Hv>U(4m1L_o3 zhBA`Re0nQo#NHThWo<1?Rz_O3D=+tpC8B>3M69N!99Zj~9$Q;m_sz+QrciiUrs(w5 zV_sSp_ywr6#$R3W#c@JYDL|>5;Ns@gt@He{u9Pbi75;v@#R~y)FI|C~_qn@_0nzsJ_ioLOq z&yTQ#g#7jOj*b)J01_zcPWyj=<7gu4)c@)K1{nV<0QFzs%m2@RoYSD`W-HM>CiBVR ztebb9SK{L@FF(R*C0$)!_4a{_`(5PL*XQc#i296n7ibucPS?TM*^MgwJPiH(s6LI2 zjfqgt-3_!CaM~7rBj-NeIL6u~9DO?w>!pm}*}mn@R*IYT(5=9|c*FSl)@w_F#q4i| zpAtTOvb3-eIXL|4xkM7%WxwuO6Nq(5CA_(jDY(W&h`rf58dH+?j)3CTSHFwpjl2@! za9brM4;||@W6`EM=LKU)$?V+RCyadCDX0mMd?d5t3`1mcrlt=mxE#XeNgrxAd9JKH zni8CXz5MPxTYtm|i!JuNI+RyXaD(0;{@R=m8d)^d=B?)3^}>3+ntlclW%QiSC}%Q? zT}n-DZ~ga8BSoQj#@=2wOH1v#Qls?rAA<(v&zYI)QnX77vny>c^~s|Xkw|3nVODc? zc8c~W_RpU`9r)7*tPGAeM7`Pmxn>oZ8R z)y0M{UbN5lkAg>{b;P9UHA_nS8G1&L+)p$@^{CVE(G8|{iv(^khzYqBwuRA$gYgBP( zC|h$rW}okRHrME>rESG$*4}bXAatLc+qGJwX1}4zy1Td6wPE&lRMPR*$k6n->3TQX zd4UOPtLMt8;p2<2OB*j^{B}6@M?fL5g#2nP83cezhG5r<>&mhP!PcDP=Y<0OK6fGi z&Pc}S^=H|HtF{W9f5uBxc8w)MHokoU`&L!yYTOEM^15!nyi4E)zW_)3czfpICoL__ z@iL?Bz4ZW1-8ZU%WiwM6!FTV|rf~}hL`C6%hi7}*qp&DyqN>ZZ9m`sUYGQmeAu0ac zcOvF9WP)6yW=&)_n01b+DFP$zwi-$oAt8O_xwtM4AU+rs0l~dPpJVUBB3$Uu%ia6U ziIwh~wi*ReMaB0;+dTo}{%Zp%(p!JScIv_is3bM(y{~v1{$zi9+mb0-dd=?|sj$Dl ze{gV6^vT}V=7xl}wsv=4VOH$cR=Uzm?XLLgQ01edsK_X+HdPbkDXX8Ha*CL}(`(h? zuHvoSlU=YCb&hKsP+UTSAt$2Lri!b=1sX1rjRo)hvmh@e*gWri&;R_Gj%jw5129>% zUfs@Y)Ae5$z;pK06*QJU&ghXub*}7b{8ax${E4l906dcpIWMm%ZwK!0yJqM0Ez4Ww z<%NcZ7Cw6>+GwydTTxS9u4qCMV|>=Z@Ay-GiPmF|Mp3 zPWF!hf(c1TNXQBHxADG(PIVNwhn}*tA06Sot{^tBDAUwY)4KnEjQF_OB!S4KX?W4XKif$}}%kdBs` zUZZzVu00v{rL?1v%45P>AD;#;kzTfjE zI@~-muw;A$(h-D>k2^F3v%&C#RO!B%iz+G-HlI!~@Y;E>v|3PL3myw9Uta^W#nF_i zu^$OY9}(o{Vs_aAx=@7%lt(iYED0YOtAK#7Il-6vjJPK6-dzgIW+U!;2TVV3_o$AD z5ZIm9O6y$O>*l;2i2rAzT(=mkZ4%2!mx?5B2KKq7plPbo!oSumW2$ z@LgDxa?r&k=Qjdl%fwT-*#p~OyKm*!`EAfIGFH%C(0otuX%q?$i`^XS65_b}lv2P# zl&2z^N${B4@8XHhge{M^2z6AaeuE#G8d7(-yY1H?)rowmMiQHebiz;?kNwrRFYzcv zao39{P`NJKVn_OHJYHVMlZlNPubtFop$zPLJ)XRqZSCJ>GkxJi9wh8W6{ZK{dCrwH zUsw$}l4Nq&^*Lc}U4SOmX|X0w%}mKDD8zdRd5khJ8MhV$RAYyJ1B>+!C1>T7C?zV? z+Pa;tb5Y0s+Y_h${JfKgeD^_$iAzkxf`Fc*u0G-KM-p`;JCq6i+FnXaPPhe$Q15P? z;dU6x`Wm2nRYWq~BBMeje@A_OoxNPz)FeUsl!YZCGU5*8!B;b_y&P~&2R(iEOg}jd zD^T9r{E;OihI; zEL6wByY@6t5f3jyLOR+=+o9KEsMv%A;s)Z_t|qr3Du_NOJE8@odcmDBRtOs#kA5@1 zz=O~Ttr2V8fv^Si1orYJR@>yHT(uHT=Z_x^%E%R()3<#q+$sGWOc@!>G2->ku@hCy z57U1Td01FjL`0;1zYWDDokSBF0Wv$M17$&-x&A@yaqA=-Tl6%FiLZx0U-K@1h^wN^|Q6VL?A7mkmk zZ$KPLtQcac)vj2Gw%wvyM~e~n02k+3fJj^0?>7*waFdqtlV?lb(3lCtp*k)VxBiZ^QVxy{wBOvw&?rsoz?qz`+4 z(5j^}Q?)jWgNr*;>nQ9yjz_0@a90xlEqwX`5KkiRRngRG%i-NIe~suW>=SjNla|q~ zNol58Dqj{3gZ;Y9Kl^j?@jO@-dhKj2iyA5MxyFJ(lsv@!2-oD%(45g>)UnlL;njZA ztzd5;`=2L_x~1frQuz1&*q^a?pRhhlSv;27x`XZv6*jS0kDH{tiY1zy_QcJ&Ixrf} ziU zvzr8yE|F0no8N^VcEvI{J7*_`fcae9xDg(a!jt!k^LlN7-}dcD=A5vlmmx6XN2M1$>zx5S(kqV#J;spx6V=4l4I<7ZJ*!zQ*vStlkLvm4Xt0p0ZZOP>X>g zNkHZ3NMZj+gE^+VujfV^07fiZ^8O;e#vUd%JH=!j8@ZvODO$*R=+_?_T7JDv=hJdJ zDj|0WGB@`eqE3VeuQxp`LB5C+=p7Tfz_{ zP_1PNXb3YtrKZ+;PrX`HbUfKxh@!IiWfB za_8iJqO6RJ7!>lkc(NCfv6DzL$IdQgeRlVjakJm2>C6lD*&-dC(z!P-na}+uhmBi& zNJvOLMn^0;9}5aL+`UibWVY1MfZSbZ_;9voj*6j5QOuK|eeS<1!o_;oC2`DHSA`Vw zPgxeKiSZ1P{Ec2>_S&AE&r?df^bH7*U;w#sQCrv4^!E?;nd|8aB{emdp`DB|5(F~c z?+Al$<}>s)*zplDMp&pk`u+Xw1qS`?zKOD;35U~*GdIV%zXX0nkEk@Z%iihVS+&Jw z0cv%3p`&z?~%QyGx3Y`QoWd%<*w!<1~;}J3Bk? zMaah@Mf_Jc<`OD8WrW|XBSS)Np~f@8f@=sY268a;TNzlB>wBz$jfy(wQr?Vzp4EP<_yUY z=CScpy25B?adB~L%h1_G{Nye{4~2cr6k@$Qnw2zQUPOvL^gn`v9H3!Zjc@fI2e<$A zUY`Hz?+bHAj{PZIFuq0%br1g?Kk9?Z;WII^u?CATxDKyn9A7GW2Vl-qg?*V^NKZG9 z(v+MX!FF-e3zQZ1^bSr{?MgVhU9$#+IZ7!7!NI2aoCc=Y3c%rT=&$$c8Tde6UBjxt z^Y52bwM2ZkS2uRUWpd=@<^2cFSAkmMhx3qb)ctt?uvhRkW=>he5dV)3(0?~WS4E<( z=7+2l({4aA@7}qnnJ%|>m&XC9PYO$iF))m*|G4QdYCVvweZ4P(jq{iBoRWfU^X%|< zX~qm7+)r(rS&lC+Cwk1UN7+zsW>{XxBX;H*E1ZscW!Umd3dl$w9Rpyav?VbzR(o%I zx(09}H}~?pf%lY`vcJF7Z??~G;AC;GsID%qu1@fS1BN|W?+v)XM_w-e%*Dmony8-Q z23+!q)2o-VVoy+nBVe%UD8-?ko)YbOcd@Tm0?rFq(4CB|FJA=5##S~v56piElM)lF z)YQdnW?02s=B22@@(;M!Jh|gpMw20T*|oOwZE7Ci(EnpMe~4k!y!?Umt#;V<(F3xvZ*8Zq*G-Lq`+mL!vDo zHS9%2;U^qe(5O)LT?j~PmI@?rxJV=(F8pe_{o9#aN`IlBfPjFTuv$NBemcET%lYf}*Cn}23J2^Vo*KM@mg7OOs|8dst1>t9Gr#l0G zUfv;ilK2x8bq*1gjOP#b_B#)l3GN(vSyW9;z)bK6?lt=#6z;_quLG#@9%y{hmw(z13@n=RCaWW8t%{DZoy{KIC-$~y?dAz z7Awn|1fx4a<nP?P46y6r}-qlMKE<)jyASbegKZ`td1h45Q&@QlVSiTI-B|c=R3*ztM9; za)^4ahooOo$$75+0ie>um$f;;8IuVo0axzF{Tm(CmE5d=weRj^WV@m2m6`Gw85u!o zxY`dzf+3`8v36gF*$LlC{}FS167a*Ss?69G7f^0*cf|5vQ?vWGp@$EbKncHf<{NhB z%%sWvh5PHQ7^TO;J_&0hVMH(!LwDhkf_Q2@4xg6YwG}Rxi+aW=l2bT5JiN(X;2L%5zRSQ5hzM`>~3NtVC zBsz!Q_$w^|D*Devhji%1#>PhjQp#Tj+ppbRG9NGRUV?*r;xreIgBySu_Fs>C(NP?H ze!Ml+;s%totQS|nbNqZPK!nzE;~DX-bCP;@XRa|o&!lw;fTK(?cLMx<@vEUM;PqfZ zX#+7)I91!${+MO--?%mixzz1or{-tj_tNU0P8= z78YdEx`NgA&I70cn1f%xbIgCli2E##=H63QAYq3fTicDCu=}}rUmBFtxZs=bPj=%~ zCG&HR~b23o!FA>Y7RYwcBl%_jiw}4*i{ak1VZW%D0UU9EHPlBL_QU7`Y zl$5q-3ziHyoO=(as#e)mDcf^PMI0zsTj^y(p^h5spHy4_fCaX=ifiE#p zy0HHIjg7oZ4~Wh1<1@c2O`Wy6-TA2#8WE2ll<^!)K(D$T_=Q!Q>B$qZll@u`O5h7D z{vrK4x&)`XOc(0(n2dX2;I&20=X7!0dPP0F;4+`C$5*7K?J9dI$h~nHMpm`@=~I%h z(B$@&z3-duJ}@u=#~D*+`zp(kJJ|rGa^%Ry3VE-0cl2nOn=K{6^lm{%;seFCWgucA za>5!t{xte*%b?^r$`-x?|G4~XfGl8Z@uIFaG^p^UEpEr}c_m9fVzkxN3a4I6N#z0# z&gE$9w0Cx3?dImT_$4MWF|tx!S9k1M;9zaQ=V-I$&tZyA*+TmBfb`%NDrnRN@2|HA z0A11ts}7URC1ufS`@L3j5_$8)Ab|9Yrff1R@}ZQ^k6MgPi>pRV1@%HHrxhy zuJD@Cxo;N-YeOWfTGoOjBL=rLs;xJV{2Jw^-SNns|YOPs@9Lx`^Nfp-`T)VAVs zB<#t}&6`|jW9wk(N99bPT?7o>0lo6q>)~i_?#lD)dCM`>P)Lsk({q)LpI@q?4y2%8 z2lY_7!_=Y%YUrrOW46Zn+F~t2*}MyC3vB<6^=r4~?z@=BjGlEGMN_-GBOAO-@jVvY zU%q@{XCELPM4r$IGSbl%IL_35e~0(g{jApwwhNFUih5|bQT(wmMujQ9;7b-AGxPaj ziZ!q_?ChrJZ-$Yu>HS!7?cr|_36PiPf{0xrU%h(O?J9=cT_SyLZLN^_d~(M3>~#O^ zVsA<2X4~`;1<=e9Cmb$wdF-2;RFqP7k=f`%Ouq&9(V@GS!<@RY@y^ONF61Ys0=z2B zfI*h&Z#_N1aczHh4-c;$fS-i;85ov23V1--ddT#iA#H!}NJUPLjg{3Gv(?a?K6`mL zmbz}@q$B~2 zsF?R_#Nr&E!(?1r8|ev+SZ{ZKv&T6H*L`Ee*zp(*;?RPEZ2Q#S%iF?2Umr7n8CF?U z#VjO<73g8Ydi!>0>&dnX=I`%;886{$jKPZ+SysV7oCESS-JmcVJA0AB~stXwK@%@2+GJ&OG!l`uR9PBHvtK<9yG#^3YSw+F=@3`F!J(yHa9 zr8_|{!vranWvr|$H1TG-v7r#!TM!I}1fUPJY^-cQB%v1c{tH2;#=6+h7t1ez?bmF3 z;_&%qQcs?H0g)X%HgVTyBg}wsld>Dp5n_W9ovdi3Xh^Ad05$~Fx9MqpTQV}RT)tP+ zV*Z7!X#=YVXJ~W<7{`%b2CA+uCXvKNzLTH(=cp#)xE~h+Yo)B{H^johROo+oA;`*% zGN>yxqe$Uxk63rp)ct!YEHEZijRa@f$%#Yn_jXg^!#C#U{Kz51(JH>+pQ9NshYu&F zcKT!MkHfxW1&&sa7AAG3^E*z1y^Whu=J@zARptVvj@*6(RIzMXufCQhFCn4HzP>&b z3T16!6U{w$8^x%^fCwC=*b7Xf$7xL2zmMC;?s#TifKl|DIFsr zuhl(ot_m%LOOOO16@|*hJt5Dn?v=gx_#)52u40FZx~p#t^uXJ|7xK6fNS(L}1a;8N z#3vwd6T)>HDG!(1e;~}U^Qb{nO)cxKq(Occ*WW9DElN^S(wl*AC66W-56%E$T~p4$ zCb;)L3di^C8v!)^?CEIBJz$G{RZ(WTmL(R|FOztLqAt=Rn0@_`0Ig!nWGo*LP_+ zL4g)fv+JVyV<$hl5L>wV>oG*4tQczs;?WP517`=LxniFiKtjzJ@hHGV|jLf?a zSuZS}BBH})aZ2`uiEWb-7lZ2S~J&l0XL`;dh(AFoG6yMo+@>+56fw#_08pS$QY z|D3(JrcS#*LFciVTX(W+iA&J>|R|1 z5cqtJn*pFKKf?(4W(s6z3BAuxr)Q?p1=q$G+G7+=m0es6XN$I*u1HD@pY15<6{U z&Cc08S-}?C@{+@?Mr%uMpnf+n_`q3N8E*bdL^V2PS^!D?ic12r$+-V{v2l&r2&Se_ zr=%b!0C+S>U9AC2FI2GaSdxLB%dcVa4qdvaPI_ywGa$NM_vxD|j7rwtn-R4$Gn`k2dML&g!;<=rfaxRY&zhjoi{ zO;UG)(KS&K>)LTT^+(pzM{8QB43a%JV0NhS(geHEgSu}*=hp<;4n;jL*7T2=)89_2-$Ps z5ey;4uM2M~iQWOB@r;$VhXTg%4nK$nffVAWV-Otyj%Itlk7s?;7wO9hY$zp#2CJ=2 z0_n}d!eVP{YFtGg{~{?Nf$fZle&4kcNXnc3Tbc#tq@Y&?Atzr^Rf8TGiHL~08(2T- z?Z%^l>sB?*ag5b=*!3n7NUJfm{DK#Zg(>q=ECu2d(&-y@f!ci|+1c4)v6+f#i)PN& zIi;oiW~akkIWj+_6P#b^?7TQ8`L)48!7Tuey_{~ zfjP8Y*=Gb2UiV(H@X1bJZ@0rtW2dT#iL8SC_S{ZdSL(*2u;o?r7dRXd;y|Ly?vKz|d(vg5Ju< zG~`!N@fx2OABQ838iA&qBNL;lrA@udJKiQC4udTW4@(#;*TyJ$uWodjRcM#!+U1um zETB!7|7IPTFhD?%RaR6?7jdtQwJB9 zhl;%f-(E*SPR?6|l*dkXEUkOIb^**496e^GH6^vtE=6C6^V&*xU`M*tm|1fx&IJ)QDhrZob9bz+JI_r{x^c zkWgmQ_D;#*E&;Xo?qGBkDn`EAmdAcvWKn;kU$Bl@1<7I5{1@~B)PA7bo1mi<@yjhQ z|2wsG9=o$ZgncU(DVD?2>F23Hj2uF?+UU8uZf5!WQqMPuT8|%USPz-B1l)vxAD2{S zI8$oW1nQU5eEn7L*q;;{@kk{sP%+FF&jCQ`x~h*Sqd0l>@}+3=v4XPtNNfdn?C%d|hz0DQen>L?jjpKp^yv{_k>gy2##7??CjX@}M}tzMR`_Or!>kGtmMQ$D zQ2(;MYf1L4VfS@HDgzGzHvX$msrq4nX82umFfH7Zjmgw)F`EL*4_YB69B0+H zjTAp`D!FfUYyfd`zRANMs8(w*L;A4tSq@`Q_i}Mp8)QO4b#t@f1P4feP);Jz`XBfaW}s>fR_!Sp(2i~o0D5U{Oz@`n_2*SuaFE(9KGw~tAVqpv7K;t5 zzIym-)d6|;-%*+BE4)4arEFmjD1#$bgSP7o{?SaB)4Y7ER+>;kyKIKAV^&s{?a3pr zfPf$mlcLPICYXL>c8zdo2WT~1UvS!fH&CR*AzY0BcC@CI_BgOsK=)CtCo1kS=xF_q zwtgfQfaC>NC;q#I^Z)BTj+cg+IHBzG_~61sY`!R6=Q2wkxZW|A7ZXApkGc```K<9R zq2#sge=baDG=s|#S^A^kzQloMI4U2TPBU1Q)Ev=k92${DM`s#A5`iCpzi>+oX>y+N^tWn*|2|$#W9C|y9Jq0EDxLgR z6&nZ71A09^7YXi>;Dq7{Wyo}?sDnEj!r;<~$(rcXK%~m)HN6U!#8cw^Q@>ORi5&F0 zyAVEP!}|;q0fzcYGV5>Gl!bpL4Ws>qkV?;Ss3e`(CfI?R_9E~9b$#VOdyrZfj=Txs zk?Bp1@7x17L6Yu;nl#Y3GoBBFj!c6l7&hIZvo-C;b490Ck(VX bU&QA*!uivKcvWyy2a=aomMWEe{q}zV`ttyl literal 0 HcmV?d00001 diff --git a/images/node_on_manager.png b/images/node_on_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..eb472492f2a5689c21de9e157ff886ed1b573dc9 GIT binary patch literal 11151 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..40a9e11 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,13 @@ +[project] +name = "comfyui_prompt_list_json" +description = "ComfyUI JSON-based prompt management tool." +version = "1.0.0" +license = { file = "LICENSE" } + +[project.urls] +Repository = "https://github.com/TKRLAB/ComfyUI_Prompt_List_JSON" + +[tool.comfy] +PublisherId = "TKLAB" +DisplayName = "ComfyUI_Prompt_List_JSON" +Icon = ""