scriptmonkey


Namescriptmonkey JSON
Version 1.4.4 PyPI version JSON
download
home_pagehttps://github.com/lukerbs/ScriptMonkey
SummaryA Python package that generates complex software projects and fixes errors in your code using OpenAI's GPT API.
upload_time2024-10-22 16:27:01
maintainerNone
docs_urlNone
authorLuke Kerbs
requires_python>=3.6
licenseMIT
keywords openai gpt ai project generation multi-file project complex project generator code error fixing code automation gpt api error correction code assistant ai coding tools script monkey automation development tools python tools code analysis machine learning project bootstrap custom code generation python package cursor devin copilot automatic code correction
VCS
bugtrack_url
requirements annotated-types anyio certifi charset-normalizer distro docutils h11 httpcore httpx idna importlib_metadata jaraco.classes jaraco.context jaraco.functools keyring markdown-it-py mdurl more-itertools nh3 openai pkginfo pydantic pydantic_core Pygments pyperclip python-dotenv readme_renderer requests requests-toolbelt rfc3986 rich setuptools sniffio tqdm twine typing_extensions urllib3 zipp
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
# ScriptMonkey 🐒

ScriptMonkey is an AI-powered CLI tool and Python library that reimagines how projects are built. It doesn’t just generate simple scripts or templates like traditional LLMs—it creates entire, multi-file, multi-directory projects with fully custom code. Complex software projects can be generated in seconds based on your natural language descriptions, providing everything you need, from models and routes to templates and configuration files. With ScriptMonkey, you can instantly bootstrap new ideas or start complex projects without the tedious setup. The tool is perfect for developers looking to quickly prototype, experiment, or build production-ready applications without having to write boilerplate code manually.

Importantly, ScriptMonkey is versatile and can be used to build any type of software project in any programming language. Whether you’re working with Python, JavaScript, Java, C++, or any other language, ScriptMonkey can generate project structures and provide tailored code. Additionally, its context-aware Q&A feature allows you to ask technical questions about projects in any language, with or without providing files for context. You can even use your default editor for longer, multi-line prompts, ensuring that ScriptMonkey can adapt to your specific needs.

## Features
- **Custom Project Generation**: Create entire Python projects, not just boilerplate code. ScriptMonkey generates the specific files and directories you need based on your description.
- **Lightning-Fast Setup**: Complex Python projects can be generated in seconds, saving you time and effort.
- **Automatic Error Detection**: Captures errors during runtime.
- **AI-Powered Fixes**: Uses OpenAI's GPT API to understand and resolve errors.
- **Code Auto-Correction**: Automatically updates your Python files with the fixes.
- **Cross-IDE Compatibility**: Works with any IDE or code editor.
- **Context-Aware Q&A**: Ask questions directly to ChatGPT with or without providing files for context. Get detailed answers with code examples, explanations, and best practices tailored to your needs.

## 🚀 Watch the Demo

[![ScriptMonkey Demo](https://img.youtube.com/vi/2zoCDlf0Zf8/maxresdefault.jpg)](https://youtu.be/2zoCDlf0Zf8)

Click the image above or watch the video directly on [YouTube](https://youtu.be/2zoCDlf0Zf8).

## Installation

To install ScriptMonkey, simply run:

```bash
pip install scriptmonkey
```

## Usage

### Project Generation with `scriptmonkey` CLI Tool

ScriptMonkey can generate a complete, custom-coded project structure based on a description you provide. This feature helps you quickly set up new projects with the necessary files and folders.

#### How to Use

1. Run the following command in your terminal:

   ```bash
   scriptmonkey
   ```

2. A text editor will open (e.g., `nano`, `vim`, or `notepad` depending on your environment). Follow the on-screen instructions to provide a detailed description of your project.

3. Save and close the editor. ScriptMonkey will then:
   - Generate a complete project structure based on your description.
   - Create directories, code files, and templates.
   - Automatically generate a `README.md` with installation instructions and usage details.

#### Example Project Description Prompt

```
I need a Flask-based web application for managing a book library. The application should include:
- User authentication (login, registration, password reset).
- Models for Users, Books, and Authors using SQLAlchemy.
- A REST API with routes for adding, updating, and deleting books and authors.
- An admin dashboard for managing users and viewing statistics.
- HTML templates for user login, book list, and book detail views.
- The database should use PostgreSQL.
- Include environment-specific configurations for development and production.
```

ScriptMonkey will use this description to create a project structure and code files for you in a directory named `generated_project`.

### Context-Aware Q&A with `scriptmonkey --ask` CLI Tool

ScriptMonkey can help answer your technical questions, whether or not you provide code files for context. This feature allows you to leverage the power of ChatGPT to ask questions about files, clarify concepts, get code reviews, or understand best practices in various programming languages.

#### How to Use

- **Pass a question directly**:

  For quick, short prompts, you can directly pass your question using the `--ask` parameter:

  ```bash
  scriptmonkey --ask "What are the best practices for database indexing?"
  ```

- **Use your default editor for longer prompts**:

  If you need to provide a more detailed or multi-line prompt, simply use `--ask` without specifying a question. This will open up your default text editor (e.g., `vim`, `nano`, `notepad`) where you can write out your question or prompt:

  ```bash
  scriptmonkey --ask
  ```

  After you write your question in the editor and save and close it, ScriptMonkey will use the content as the question. This is especially useful for longer or more complex queries that require more explanation.

- **Ask a question about specific local files**:

  ```bash
  scriptmonkey --ask "Can you help me optimize this function?" --files ./path/to/file1.py ./path/to/file2.js
  ```

  The `--files` flag allows you to provide specific files as context for your question. ScriptMonkey will include the contents of these files in its analysis, allowing it to reference the actual code or data you are working with. This is particularly useful for getting detailed feedback on specific code snippets, debugging issues, or seeking advice on how to improve certain parts of your project.
  
  When you use `--files`, ScriptMonkey will read the contents of each provided file, include them in the prompt, and tailor its response based on the combined context of your question and the file contents. This feature ensures that you get precise, context-aware answers, helping you solve code challenges or understand complex concepts more effectively.

- **Ask a question with a directory tree**:

  ```bash
  scriptmonkey --ask "How do I organize this project better?" --tree
  ```

  The `--tree` flag will include a tree representation of the current working directory in the context for your question. This is particularly useful when you want to get feedback on the structure of your codebase or when your question relates to the project organization. It can be used in tandem with the `--files` flag to provide additional context about how those files fit within the larger context of the project.

  ScriptMonkey will analyze your question and any provided files or the directory tree to give a detailed, markdown-formatted response with explanations and code suggestions, if applicable. This feature is great for in-depth guidance on code optimization, architecture, or general programming questions.

### Copy Key Files and Project Details with `--copy`

ScriptMonkey's new `--copy` feature is designed to streamline the process of copying critical code files and project structure details into your clipboard, making it easier to ask questions to LLMs like ChatGPT or Claude. This feature formats the copied content in a neat way that includes file contents and the directory tree, making it simple to paste into a conversation for contextual help.

#### How to Use

- **Copy file contents directly**:

  You can use the --copy flag to quickly copy the contents of specified files into your clipboard, neatly formatted for easy sharing with an LLM. When combined with the --files flag, ScriptMonkey will copy the contents of the selected files along with a complete directory tree of your project. This provides additional context, helping LLMs better understand your project’s structure:

  ```bash
  scriptmonkey --copy --files path/to/file1.py path/to/file2.js
  ```

  Your files and project directory tree are automatically copied to your clipboard in the format:

  ```
  - - - - - - - - - -
  Here are some details about the project.

  # path/to/file1.py
  <content from file1.py>

  - - - - - - - - - -

  # path/to/file2.js
  <content from file2.js>

  - - - - - - - - - -

  # PROJECT TREE
  <directory structure>
  ```




### Error Handling with `scriptmonkey.run()`

ScriptMonkey doesn't just build projects; it also makes debugging a breeze.

1. Import `scriptmonkey` in your Python script.
2. Call `scriptmonkey.run()` to activate the error handler.
3. Run your code, and let ScriptMonkey handle any errors that occur.

#### Example

```python
import scriptmonkey

# Enable ScriptMonkey's error handler
scriptmonkey.run()

# Intentional error for testing
def add(a, b):
    return a + b  # This will fail if b is a string

print(add(2, "3"))  # ScriptMonkey will automatically fix this error and update the file.
```

Once an error occurs, ScriptMonkey will:
1. Detect the error.
2. Send the error and code to OpenAI for analysis.
3. Provide a solution and automatically update the file with the corrected code.

### Setting or Updating Your OpenAI API Key

If you haven't set your OpenAI API key yet or need to update it, you can do so with the following command:

```bash
python3 -m scriptmonkey --set-api-key your-api-key
```

This will store the API key in a config locally and use it for all future interactions with OpenAI.

## Requirements
- Python 3.6 or later
- An OpenAI API key (follow the steps below if you don't have one)

## Obtaining an OpenAI API Key

1. Go to the OpenAI website: [OpenAI Platform](https://platform.openai.com/)
2. Sign up or log in to your account.
3. Navigate to the **API keys** section in your account dashboard.
4. Create a new API key and copy it.

## Configuring the API Key for ScriptMonkey

- **Option 1: Environment Variable**  
  You can set up your API key as an environment variable:

  ```bash
  export OPENAI_API_KEY='your-api-key'
  ```

- **Option 2: Entering the API Key When Prompted**  
  If ScriptMonkey does not find an API key in your environment variables, it will prompt you to enter your key. Once entered, it will save the key to a configuration file for future use.

- **Option 3: Using the `--set-api-key` Command**  
  Use the `--set-api-key` command as shown above to set or update your API key easily.

Let ScriptMonkey take care of your Python errors and project setup so you can focus on building!

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/lukerbs/ScriptMonkey",
    "name": "scriptmonkey",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "openai, GPT, AI, project generation, multi-file project, complex project generator, code error fixing, code automation, GPT API, error correction, code assistant, AI coding tools, script monkey, automation, development tools, python tools, code analysis, machine learning, project bootstrap, custom code generation, python package, cursor, devin, copilot, automatic code correction",
    "author": "Luke Kerbs",
    "author_email": "LDK.kerbs@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/e3/76/3704e0f422affad04488e721c3ef8c4656896987ea002866cc74fb2eb835/scriptmonkey-1.4.4.tar.gz",
    "platform": null,
    "description": "\n# ScriptMonkey \ud83d\udc12\n\nScriptMonkey is an AI-powered CLI tool and Python library that reimagines how projects are built. It doesn\u2019t just generate simple scripts or templates like traditional LLMs\u2014it creates entire, multi-file, multi-directory projects with fully custom code. Complex software projects can be generated in seconds based on your natural language descriptions, providing everything you need, from models and routes to templates and configuration files. With ScriptMonkey, you can instantly bootstrap new ideas or start complex projects without the tedious setup. The tool is perfect for developers looking to quickly prototype, experiment, or build production-ready applications without having to write boilerplate code manually.\n\nImportantly, ScriptMonkey is versatile and can be used to build any type of software project in any programming language. Whether you\u2019re working with Python, JavaScript, Java, C++, or any other language, ScriptMonkey can generate project structures and provide tailored code. Additionally, its context-aware Q&A feature allows you to ask technical questions about projects in any language, with or without providing files for context. You can even use your default editor for longer, multi-line prompts, ensuring that ScriptMonkey can adapt to your specific needs.\n\n## Features\n- **Custom Project Generation**: Create entire Python projects, not just boilerplate code. ScriptMonkey generates the specific files and directories you need based on your description.\n- **Lightning-Fast Setup**: Complex Python projects can be generated in seconds, saving you time and effort.\n- **Automatic Error Detection**: Captures errors during runtime.\n- **AI-Powered Fixes**: Uses OpenAI's GPT API to understand and resolve errors.\n- **Code Auto-Correction**: Automatically updates your Python files with the fixes.\n- **Cross-IDE Compatibility**: Works with any IDE or code editor.\n- **Context-Aware Q&A**: Ask questions directly to ChatGPT with or without providing files for context. Get detailed answers with code examples, explanations, and best practices tailored to your needs.\n\n## \ud83d\ude80 Watch the Demo\n\n[![ScriptMonkey Demo](https://img.youtube.com/vi/2zoCDlf0Zf8/maxresdefault.jpg)](https://youtu.be/2zoCDlf0Zf8)\n\nClick the image above or watch the video directly on [YouTube](https://youtu.be/2zoCDlf0Zf8).\n\n## Installation\n\nTo install ScriptMonkey, simply run:\n\n```bash\npip install scriptmonkey\n```\n\n## Usage\n\n### Project Generation with `scriptmonkey` CLI Tool\n\nScriptMonkey can generate a complete, custom-coded project structure based on a description you provide. This feature helps you quickly set up new projects with the necessary files and folders.\n\n#### How to Use\n\n1. Run the following command in your terminal:\n\n   ```bash\n   scriptmonkey\n   ```\n\n2. A text editor will open (e.g., `nano`, `vim`, or `notepad` depending on your environment). Follow the on-screen instructions to provide a detailed description of your project.\n\n3. Save and close the editor. ScriptMonkey will then:\n   - Generate a complete project structure based on your description.\n   - Create directories, code files, and templates.\n   - Automatically generate a `README.md` with installation instructions and usage details.\n\n#### Example Project Description Prompt\n\n```\nI need a Flask-based web application for managing a book library. The application should include:\n- User authentication (login, registration, password reset).\n- Models for Users, Books, and Authors using SQLAlchemy.\n- A REST API with routes for adding, updating, and deleting books and authors.\n- An admin dashboard for managing users and viewing statistics.\n- HTML templates for user login, book list, and book detail views.\n- The database should use PostgreSQL.\n- Include environment-specific configurations for development and production.\n```\n\nScriptMonkey will use this description to create a project structure and code files for you in a directory named `generated_project`.\n\n### Context-Aware Q&A with `scriptmonkey --ask` CLI Tool\n\nScriptMonkey can help answer your technical questions, whether or not you provide code files for context. This feature allows you to leverage the power of ChatGPT to ask questions about files, clarify concepts, get code reviews, or understand best practices in various programming languages.\n\n#### How to Use\n\n- **Pass a question directly**:\n\n  For quick, short prompts, you can directly pass your question using the `--ask` parameter:\n\n  ```bash\n  scriptmonkey --ask \"What are the best practices for database indexing?\"\n  ```\n\n- **Use your default editor for longer prompts**:\n\n  If you need to provide a more detailed or multi-line prompt, simply use `--ask` without specifying a question. This will open up your default text editor (e.g., `vim`, `nano`, `notepad`) where you can write out your question or prompt:\n\n  ```bash\n  scriptmonkey --ask\n  ```\n\n  After you write your question in the editor and save and close it, ScriptMonkey will use the content as the question. This is especially useful for longer or more complex queries that require more explanation.\n\n- **Ask a question about specific local files**:\n\n  ```bash\n  scriptmonkey --ask \"Can you help me optimize this function?\" --files ./path/to/file1.py ./path/to/file2.js\n  ```\n\n  The `--files` flag allows you to provide specific files as context for your question. ScriptMonkey will include the contents of these files in its analysis, allowing it to reference the actual code or data you are working with. This is particularly useful for getting detailed feedback on specific code snippets, debugging issues, or seeking advice on how to improve certain parts of your project.\n  \n  When you use `--files`, ScriptMonkey will read the contents of each provided file, include them in the prompt, and tailor its response based on the combined context of your question and the file contents. This feature ensures that you get precise, context-aware answers, helping you solve code challenges or understand complex concepts more effectively.\n\n- **Ask a question with a directory tree**:\n\n  ```bash\n  scriptmonkey --ask \"How do I organize this project better?\" --tree\n  ```\n\n  The `--tree` flag will include a tree representation of the current working directory in the context for your question. This is particularly useful when you want to get feedback on the structure of your codebase or when your question relates to the project organization. It can be used in tandem with the `--files` flag to provide additional context about how those files fit within the larger context of the project.\n\n  ScriptMonkey will analyze your question and any provided files or the directory tree to give a detailed, markdown-formatted response with explanations and code suggestions, if applicable. This feature is great for in-depth guidance on code optimization, architecture, or general programming questions.\n\n### Copy Key Files and Project Details with `--copy`\n\nScriptMonkey's new `--copy` feature is designed to streamline the process of copying critical code files and project structure details into your clipboard, making it easier to ask questions to LLMs like ChatGPT or Claude. This feature formats the copied content in a neat way that includes file contents and the directory tree, making it simple to paste into a conversation for contextual help.\n\n#### How to Use\n\n- **Copy file contents directly**:\n\n  You can use the --copy flag to quickly copy the contents of specified files into your clipboard, neatly formatted for easy sharing with an LLM. When combined with the --files flag, ScriptMonkey will copy the contents of the selected files along with a complete directory tree of your project. This provides additional context, helping LLMs better understand your project\u2019s structure:\n\n  ```bash\n  scriptmonkey --copy --files path/to/file1.py path/to/file2.js\n  ```\n\n  Your files and project directory tree are automatically copied to your clipboard in the format:\n\n  ```\n  - - - - - - - - - -\n  Here are some details about the project.\n\n  # path/to/file1.py\n  <content from file1.py>\n\n  - - - - - - - - - -\n\n  # path/to/file2.js\n  <content from file2.js>\n\n  - - - - - - - - - -\n\n  # PROJECT TREE\n  <directory structure>\n  ```\n\n\n\n\n### Error Handling with `scriptmonkey.run()`\n\nScriptMonkey doesn't just build projects; it also makes debugging a breeze.\n\n1. Import `scriptmonkey` in your Python script.\n2. Call `scriptmonkey.run()` to activate the error handler.\n3. Run your code, and let ScriptMonkey handle any errors that occur.\n\n#### Example\n\n```python\nimport scriptmonkey\n\n# Enable ScriptMonkey's error handler\nscriptmonkey.run()\n\n# Intentional error for testing\ndef add(a, b):\n    return a + b  # This will fail if b is a string\n\nprint(add(2, \"3\"))  # ScriptMonkey will automatically fix this error and update the file.\n```\n\nOnce an error occurs, ScriptMonkey will:\n1. Detect the error.\n2. Send the error and code to OpenAI for analysis.\n3. Provide a solution and automatically update the file with the corrected code.\n\n### Setting or Updating Your OpenAI API Key\n\nIf you haven't set your OpenAI API key yet or need to update it, you can do so with the following command:\n\n```bash\npython3 -m scriptmonkey --set-api-key your-api-key\n```\n\nThis will store the API key in a config locally and use it for all future interactions with OpenAI.\n\n## Requirements\n- Python 3.6 or later\n- An OpenAI API key (follow the steps below if you don't have one)\n\n## Obtaining an OpenAI API Key\n\n1. Go to the OpenAI website: [OpenAI Platform](https://platform.openai.com/)\n2. Sign up or log in to your account.\n3. Navigate to the **API keys** section in your account dashboard.\n4. Create a new API key and copy it.\n\n## Configuring the API Key for ScriptMonkey\n\n- **Option 1: Environment Variable**  \n  You can set up your API key as an environment variable:\n\n  ```bash\n  export OPENAI_API_KEY='your-api-key'\n  ```\n\n- **Option 2: Entering the API Key When Prompted**  \n  If ScriptMonkey does not find an API key in your environment variables, it will prompt you to enter your key. Once entered, it will save the key to a configuration file for future use.\n\n- **Option 3: Using the `--set-api-key` Command**  \n  Use the `--set-api-key` command as shown above to set or update your API key easily.\n\nLet ScriptMonkey take care of your Python errors and project setup so you can focus on building!\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Python package that generates complex software projects and fixes errors in your code using OpenAI's GPT API.",
    "version": "1.4.4",
    "project_urls": {
        "Homepage": "https://github.com/lukerbs/ScriptMonkey"
    },
    "split_keywords": [
        "openai",
        " gpt",
        " ai",
        " project generation",
        " multi-file project",
        " complex project generator",
        " code error fixing",
        " code automation",
        " gpt api",
        " error correction",
        " code assistant",
        " ai coding tools",
        " script monkey",
        " automation",
        " development tools",
        " python tools",
        " code analysis",
        " machine learning",
        " project bootstrap",
        " custom code generation",
        " python package",
        " cursor",
        " devin",
        " copilot",
        " automatic code correction"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4b6a92dbbdd0d69718b7e4076350054f664a574af840600106b45e27aa5cfe3b",
                "md5": "031bf6b04fbd69ac69f5a65e153e4f33",
                "sha256": "e09161726717bff4e460b72625ccd9735ae82066faf7ea2252ae9eb07257a4f6"
            },
            "downloads": -1,
            "filename": "scriptmonkey-1.4.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "031bf6b04fbd69ac69f5a65e153e4f33",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 28419,
            "upload_time": "2024-10-22T16:26:59",
            "upload_time_iso_8601": "2024-10-22T16:26:59.538422Z",
            "url": "https://files.pythonhosted.org/packages/4b/6a/92dbbdd0d69718b7e4076350054f664a574af840600106b45e27aa5cfe3b/scriptmonkey-1.4.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e3763704e0f422affad04488e721c3ef8c4656896987ea002866cc74fb2eb835",
                "md5": "f1929356fbdfc9ec758f6b4667454274",
                "sha256": "8c75365c7d215ad1148c764e3211738f9654825b6fada78ff4009e895d4715ad"
            },
            "downloads": -1,
            "filename": "scriptmonkey-1.4.4.tar.gz",
            "has_sig": false,
            "md5_digest": "f1929356fbdfc9ec758f6b4667454274",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 23031,
            "upload_time": "2024-10-22T16:27:01",
            "upload_time_iso_8601": "2024-10-22T16:27:01.269425Z",
            "url": "https://files.pythonhosted.org/packages/e3/76/3704e0f422affad04488e721c3ef8c4656896987ea002866cc74fb2eb835/scriptmonkey-1.4.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-22 16:27:01",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "lukerbs",
    "github_project": "ScriptMonkey",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "annotated-types",
            "specs": [
                [
                    "==",
                    "0.7.0"
                ]
            ]
        },
        {
            "name": "anyio",
            "specs": [
                [
                    "==",
                    "4.6.0"
                ]
            ]
        },
        {
            "name": "certifi",
            "specs": [
                [
                    "==",
                    "2024.8.30"
                ]
            ]
        },
        {
            "name": "charset-normalizer",
            "specs": [
                [
                    "==",
                    "3.3.2"
                ]
            ]
        },
        {
            "name": "distro",
            "specs": [
                [
                    "==",
                    "1.9.0"
                ]
            ]
        },
        {
            "name": "docutils",
            "specs": [
                [
                    "==",
                    "0.21.2"
                ]
            ]
        },
        {
            "name": "h11",
            "specs": [
                [
                    "==",
                    "0.14.0"
                ]
            ]
        },
        {
            "name": "httpcore",
            "specs": [
                [
                    "==",
                    "1.0.6"
                ]
            ]
        },
        {
            "name": "httpx",
            "specs": [
                [
                    "==",
                    "0.27.2"
                ]
            ]
        },
        {
            "name": "idna",
            "specs": [
                [
                    "==",
                    "3.10"
                ]
            ]
        },
        {
            "name": "importlib_metadata",
            "specs": [
                [
                    "==",
                    "8.5.0"
                ]
            ]
        },
        {
            "name": "jaraco.classes",
            "specs": [
                [
                    "==",
                    "3.4.0"
                ]
            ]
        },
        {
            "name": "jaraco.context",
            "specs": [
                [
                    "==",
                    "6.0.1"
                ]
            ]
        },
        {
            "name": "jaraco.functools",
            "specs": [
                [
                    "==",
                    "4.1.0"
                ]
            ]
        },
        {
            "name": "keyring",
            "specs": [
                [
                    "==",
                    "25.4.1"
                ]
            ]
        },
        {
            "name": "markdown-it-py",
            "specs": [
                [
                    "==",
                    "3.0.0"
                ]
            ]
        },
        {
            "name": "mdurl",
            "specs": [
                [
                    "==",
                    "0.1.2"
                ]
            ]
        },
        {
            "name": "more-itertools",
            "specs": [
                [
                    "==",
                    "10.5.0"
                ]
            ]
        },
        {
            "name": "nh3",
            "specs": [
                [
                    "==",
                    "0.2.18"
                ]
            ]
        },
        {
            "name": "openai",
            "specs": [
                [
                    "==",
                    "1.51.0"
                ]
            ]
        },
        {
            "name": "pkginfo",
            "specs": [
                [
                    "==",
                    "1.10.0"
                ]
            ]
        },
        {
            "name": "pydantic",
            "specs": [
                [
                    "==",
                    "2.9.2"
                ]
            ]
        },
        {
            "name": "pydantic_core",
            "specs": [
                [
                    "==",
                    "2.23.4"
                ]
            ]
        },
        {
            "name": "Pygments",
            "specs": [
                [
                    "==",
                    "2.18.0"
                ]
            ]
        },
        {
            "name": "pyperclip",
            "specs": [
                [
                    "==",
                    "1.9.0"
                ]
            ]
        },
        {
            "name": "python-dotenv",
            "specs": [
                [
                    "==",
                    "1.0.1"
                ]
            ]
        },
        {
            "name": "readme_renderer",
            "specs": [
                [
                    "==",
                    "44.0"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.32.3"
                ]
            ]
        },
        {
            "name": "requests-toolbelt",
            "specs": [
                [
                    "==",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "rfc3986",
            "specs": [
                [
                    "==",
                    "2.0.0"
                ]
            ]
        },
        {
            "name": "rich",
            "specs": [
                [
                    "==",
                    "13.9.2"
                ]
            ]
        },
        {
            "name": "setuptools",
            "specs": [
                [
                    "==",
                    "75.1.0"
                ]
            ]
        },
        {
            "name": "sniffio",
            "specs": [
                [
                    "==",
                    "1.3.1"
                ]
            ]
        },
        {
            "name": "tqdm",
            "specs": [
                [
                    "==",
                    "4.66.5"
                ]
            ]
        },
        {
            "name": "twine",
            "specs": [
                [
                    "==",
                    "5.1.1"
                ]
            ]
        },
        {
            "name": "typing_extensions",
            "specs": [
                [
                    "==",
                    "4.12.2"
                ]
            ]
        },
        {
            "name": "urllib3",
            "specs": [
                [
                    "==",
                    "2.2.3"
                ]
            ]
        },
        {
            "name": "zipp",
            "specs": [
                [
                    "==",
                    "3.20.2"
                ]
            ]
        }
    ],
    "lcname": "scriptmonkey"
}
        
Elapsed time: 0.32047s