├── .all-contributorsrc ├── .github ├── CODEOWNERS ├── settings.yml └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── README_EN.md ├── assets ├── images │ ├── cast_zoltraak.png │ ├── dai4697_A_digital_painting_of_a_female_wizard_casting_a_powerfu_84046a02-5831-48c1-b8e3-c8b5a49d69e8.png │ ├── graph.png │ ├── last_frame.png │ ├── llmcomment.png │ ├── ng.png │ ├── ok.png │ ├── syllabus_graph copy.png │ └── syllabus_graph.png └── videos │ ├── 480p15 │ └── FileStateTransition.mp4 │ ├── natural_langage_state_transition_mov.py │ ├── zoltraak0.1.27_high_quality.gif │ └── zoltraak2_smooth_high_quality.gif ├── codetest.py ├── docs ├── NLProgramming_grammar..md ├── configuration.md ├── contributing.md ├── examples │ ├── example1.md │ └── example2.md ├── faq.md ├── getting-started.md ├── installation.md ├── research.md ├── troubleshooting.md ├── usage.md └── video.md ├── experiments ├── streaml.md └── streaml1.md ├── pypi_update.sh ├── requirements.txt ├── scripts └── run_tests.sh ├── setup.py ├── tests ├── README.md ├── test_cli.py ├── test_converter.py ├── test_llms.py ├── test_minimal.py └── test_sample.py ├── update_and_upload.sh ├── update_version.py └── zoltraak ├── __init__.py ├── cli.py ├── converter.py ├── gencode.py ├── gencodebase.py ├── grimoires ├── architect │ ├── architect.md │ ├── architect_claude.md │ ├── architect_daiagrams.md │ ├── architect_detail.md │ ├── architect_detail_dir.md │ ├── architect_develop.md │ └── architect_functor.md ├── compiler │ ├── biz_consult copy.md │ ├── biz_consult.md │ ├── book_lecture_main.md │ ├── book_lecture_quiz.md │ ├── dev_akirapp.md │ ├── dev_aws.md │ ├── dev_front.md │ ├── dev_func.md │ ├── dev_obj.md │ ├── dev_obj_lisp.md │ ├── dev_obj_lisp_g.md │ ├── dev_obj_lisp_g_base64.md │ ├── dev_obj_mermaid.md │ ├── dev_pypi.md │ ├── dev_react_fastapi.md │ ├── dev_reveal_rite.md │ ├── dev_reveal_strict.md │ ├── dev_streamlit.md │ ├── dev_streamlit_mini.md │ ├── encode_lisp.md │ ├── front_faq.md │ ├── front_hp.md │ ├── general_def.md │ ├── general_reqdef.md │ └── ref_create_directory.py ├── developer │ ├── dev_csharp.md │ └── dev_python.md ├── encryption │ └── emoji.md ├── formatter │ ├── md_comment.md │ ├── md_comment_ar.md │ ├── md_comment_bn.md │ ├── md_comment_de.md │ ├── md_comment_en.md │ ├── md_comment_es.md │ ├── md_comment_fa.md │ ├── md_comment_fr.md │ ├── md_comment_hi.md │ ├── md_comment_hu.md │ ├── md_comment_id.md │ ├── md_comment_it.md │ ├── md_comment_ko.md │ ├── md_comment_lang.md │ ├── md_comment_my.md │ ├── md_comment_nl.md │ ├── md_comment_pl.md │ ├── md_comment_pt.md │ ├── md_comment_ro.md │ ├── md_comment_ru.md │ ├── md_comment_sw.md │ ├── md_comment_th.md │ ├── md_comment_tl.md │ ├── md_comment_tr.md │ ├── md_comment_uk.md │ ├── md_comment_ur.md │ ├── md_comment_vi.md │ ├── md_comment_zh.md │ ├── md_comment_zh_hk_tw.md │ ├── mediawiki_style.md │ └── py_comment.md └── interpretspec │ └── hirokichi.md ├── llms ├── claude.py ├── claude.txt └── gemini.py ├── md_generator.py ├── settings.py └── utils ├── process_text.py └── prompt_import.py /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "dai-motoki", 10 | "name": "DAISUKE MOTOKI", 11 | "avatar_url": "https://avatars.githubusercontent.com/u/58665894?v=4", 12 | "profile": "https://github.com/dai-motoki", 13 | "contributions": [ 14 | "code" 15 | ] 16 | }, 17 | { 18 | "login": "ThePioneerJP", 19 | "name": "The Pioneer", 20 | "avatar_url": "https://avatars.githubusercontent.com/u/116901962?v=4", 21 | "profile": "https://github.com/ThePioneerJP", 22 | "contributions": [ 23 | "code" 24 | ] 25 | }, 26 | { 27 | "login": "hiroki1014", 28 | "name": "Hiroki Koshika", 29 | "avatar_url": "https://avatars.githubusercontent.com/u/39159218?v=4", 30 | "profile": "https://github.com/hiroki1014", 31 | "contributions": [ 32 | "code" 33 | ] 34 | }, 35 | { 36 | "login": "UnagiTabetai", 37 | "name": "MARUMO", 38 | "avatar_url": "https://avatars.githubusercontent.com/u/143519346?v=4", 39 | "profile": "https://github.com/UnagiTabetai", 40 | "contributions": [ 41 | "code" 42 | ] 43 | }, 44 | { 45 | "login": "Sunwood-ai-labs", 46 | "name": "Maki", 47 | "avatar_url": "https://avatars.githubusercontent.com/u/108736814?v=4", 48 | "profile": "https://hamaruki.com/", 49 | "contributions": [ 50 | "code" 51 | ] 52 | }, 53 | { 54 | "login": "onikan27", 55 | "name": "akino", 56 | "avatar_url": "https://avatars.githubusercontent.com/u/74908945?v=4", 57 | "profile": "https://github.com/onikan27", 58 | "contributions": [ 59 | "code" 60 | ] 61 | }, 62 | { 63 | "login": "sarukun99", 64 | "name": "tomoyuki enomoto", 65 | "avatar_url": "https://avatars.githubusercontent.com/u/4081854?v=4", 66 | "profile": "https://github.com/sarukun99", 67 | "contributions": [ 68 | "code" 69 | ] 70 | }, 71 | { 72 | "login": "umayado17", 73 | "name": "umayado17", 74 | "avatar_url": "https://avatars.githubusercontent.com/u/40725757?v=4", 75 | "profile": "https://github.com/umayado17", 76 | "contributions": [ 77 | "code" 78 | ] 79 | }, 80 | { 81 | "login": "kinopeee", 82 | "name": "kinopeee", 83 | "avatar_url": "https://avatars.githubusercontent.com/u/119112484?v=4", 84 | "profile": "https://github.com/kinopeee", 85 | "contributions": [ 86 | "code" 87 | ] 88 | }, 89 | { 90 | "login": "Otori2501", 91 | "name": "Otori", 92 | "avatar_url": "https://avatars.githubusercontent.com/u/10893373?v=4", 93 | "profile": "https://github.com/Otori2501", 94 | "contributions": [ 95 | "doc" 96 | ] 97 | }, 98 | { 99 | "login": "tetumemo", 100 | "name": "tetumemo", 101 | "avatar_url": "https://avatars.githubusercontent.com/u/164516526?v=4", 102 | "profile": "https://t.co/qqv5Zts5V4", 103 | "contributions": [ 104 | "doc" 105 | ] 106 | }, 107 | { 108 | "login": "Habatakurikei", 109 | "name": "Habatakurikei", 110 | "avatar_url": "https://avatars.githubusercontent.com/u/131997581?v=4", 111 | "profile": "https://habatakurikei.com/", 112 | "contributions": [ 113 | "code" 114 | ] 115 | }, 116 | { 117 | "login": "lulu-hk", 118 | "name": "Lulu Hiyokono", 119 | "avatar_url": "https://avatars.githubusercontent.com/u/167414497?v=4", 120 | "profile": "https://github.com/lulu-hk", 121 | "contributions": [ 122 | "code" 123 | ] 124 | }, 125 | { 126 | "login": "zapabob", 127 | "name": "峯岸 亮", 128 | "avatar_url": "https://avatars.githubusercontent.com/u/130830376?v=4", 129 | "profile": "https://github.com/zapabob", 130 | "contributions": [ 131 | "code" 132 | ] 133 | }, 134 | { 135 | "login": "eieio81810", 136 | "name": "Suzuki Yuto", 137 | "avatar_url": "https://avatars.githubusercontent.com/u/34175263?v=4", 138 | "profile": "https://github.com/eieio81810", 139 | "contributions": [ 140 | "tutorial" 141 | ] 142 | }, 143 | { 144 | "login": "astertechs-dev", 145 | "name": "astertechs-dev", 146 | "avatar_url": "https://avatars.githubusercontent.com/u/75663625?v=4", 147 | "profile": "https://github.com/astertechs-dev", 148 | "contributions": [ 149 | "bug" 150 | ] 151 | }, 152 | { 153 | "login": "eltociear", 154 | "name": "Ikko Eltociear Ashimine", 155 | "avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4", 156 | "profile": "https://speakerdeck.com/eltociear", 157 | "contributions": [ 158 | "doc" 159 | ] 160 | } 161 | ], 162 | "contributorsPerLine": 7, 163 | "commitType": "docs", 164 | "commitConvention": "angular", 165 | "projectName": "zoltraak", 166 | "projectOwner": "dai-motoki" 167 | } 168 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | /.github/settings.yml @dai-motoki 2 | -------------------------------------------------------------------------------- /.github/settings.yml: -------------------------------------------------------------------------------- 1 | branch_protection_rules: 2 | - branch_name_pattern: main 3 | enforce_admins: true 4 | required_pull_request_reviews: 5 | dismiss_stale_reviews: true 6 | require_code_owner_reviews: true 7 | required_approving_review_count: 1 8 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | name: PyPI Package CI/CD # PyPIパッケージのCI/CDワークフロー名 4 | 5 | on: # トリガーの設定 6 | push: # - プッシュイベントの場合 7 | branches: # -- 対象ブランチ 8 | - main # --- mainブランチ 9 | - "release/**" # --- releaseで始まるブランチ 10 | pull_request: # - プルリクエストイベントの場合 11 | branches: # -- 対象ブランチ 12 | - main # --- mainブランチ 13 | - "release/**" # --- releaseで始まるブランチ 14 | 15 | jobs: # ジョブの定義 16 | test: # テストジョブ 17 | runs-on: ubuntu-latest # - Ubuntu最新版で実行 18 | strategy: 19 | matrix: 20 | python-version: ["3.10", "3.11"] # 複数のPythonバージョン(3.7〜3.11)でテストを実行 21 | steps: # - ステップの定義 22 | - uses: actions/checkout@v2 # -- リポジトリのチェックアウト(v2) 23 | - name: Set up Python ${{ matrix.python-version }} # -- 指定したバージョンのPythonをセットアップ 24 | uses: actions/setup-python@v2 # --- Python環境のセットアップ(v2) 25 | with: # --- オプション 26 | python-version: ${{ matrix.python-version }} # ---- マトリクスで指定したPythonバージョンを使用 27 | - name: Install dependencies # -- 依存関係のインストール 28 | run: | # --- 以下のコマンドを実行 29 | python -m pip install --upgrade pip # ---- pipのアップグレード 30 | pip install -e . # ---- 現在のディレクトリを編集可能モードでインストール 31 | - name: Run tests # -- テストの実行 32 | run: | # --- 以下のコマンドを実行 33 | pip install pytest # ---- pytestをインストール 34 | - name: Run test_sample.py # -- test_sample.pyの実行 35 | run: | # --- 以下のコマンドを実行 36 | pytest tests/test_sample.py # ---- test_sample.pyをpytestで実行 37 | - name: Run test_llms.py # -- test_llms.pyの実行 38 | env: # --- 環境変数の設定 39 | ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # ---- AnthropicのAPIキー(シークレットから取得) 40 | run: | # --- 以下のコマンドを実行 41 | pytest tests/test_llms.py -s # ---- test_llms.pyをpytestで実行 42 | - name: Run test_minimal.py # -- test_minimal.pyの実行 43 | run: | # --- 以下のコマンドを実行 44 | pytest tests/test_minimal.py -s # ---- test_minimal.pyをpytestで実行し、print内容を出力 45 | 46 | 47 | # - name: Run test_sample.py # -- test_sample.pyの実行 48 | # if: matrix.python-version == '3.11' # --- Python 3.11の場合のみ実行 49 | # run: | # --- 以下のコマンドを実行 50 | # pytest tests/test_sample.py # ---- test_sample.pyをpytestで実行 51 | # - name: Run test_cli.py # -- test_cli.pyの実行 52 | # if: matrix.python-version == '3.11' # --- Python 3.11の場合のみ実行 53 | # run: | # --- 以下のコマンドを実行 54 | # pytest tests/test_cli.py # ---- test_cli.pyをpytestで実行 55 | # - name: Run test_converter.py # -- test_converter.pyの実行 56 | # if: matrix.python-version == '3.11' # --- Python 3.11の場合のみ実行 57 | # run: | # --- 以下のコマンドを実行 58 | # pytest tests/test_converter.py # ---- test_converter.pyをpytestで実行 59 | deploy: # デプロイジョブ 60 | needs: test # - テストジョブが成功した後に実行 61 | runs-on: ubuntu-latest # - Ubuntu最新版で実行 62 | if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release/') # - releaseブランチへのプッシュ時のみ実行 63 | steps: # - ステップの定義 64 | - uses: actions/checkout@v2 # -- リポジトリのチェックアウト(v2) 65 | - name: Set up Python # -- Pythonのセットアップ 66 | uses: actions/setup-python@v2 # --- Python環境のセットアップ(v2) 67 | with: # --- オプション 68 | python-version: 3.10 # ---- Python 3.8を使用 69 | - name: Install dependencies # -- 依存関係のインストール 70 | run: | # --- 以下のコマンドを実行 71 | python -m pip install --upgrade pip # ---- pipのアップグレード 72 | pip install -e . # ---- 現在のディレクトリを編集可能モードでインストール 73 | - name: Update version and upload to PyPI # -- バージョンの更新とPyPIへのアップロード 74 | env: # --- 環境変数の設定 75 | PYPI_USERNAME: ${{ secrets.PYPI_USERNAME }} # ---- PyPIユーザー名(シークレットから取得) 76 | PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} # ---- PyPIパスワード(シークレットから取得) 77 | run: | # --- 以下のコマンドを実行 78 | chmod +x update_and_upload.sh # ---- update_and_upload.shに実行権限を付与 79 | ./update_and_upload.sh # ---- update_and_upload.shを実行 80 | - name: Merge release branch to main # -- リリースブランチをmainブランチにマージ 81 | uses: devmasx/merge-branch@v1.3.1 # --- merge-branchアクションを使用(v1.3.1) 82 | with: # --- オプション 83 | type: now # ---- 即時マージ 84 | from_branch: ${{ github.ref }} # ---- マージ元ブランチ(現在のブランチ) 85 | target_branch: main # ---- マージ先ブランチ(mainブランチ) 86 | github_token: ${{ secrets.GITHUB_TOKEN }} # ---- GitHubトークン(シークレットから取得) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | 162 | .DS_Store 163 | generated/* 164 | requirements/* 165 | requirements2/* 166 | gomi/* 167 | past_md_files/* 168 | 169 | zoltraak-dev/ 170 | assets/videos/480p15/partial_movie_files/ 171 | 172 | SourceSageAssets 173 | 174 | mygrimoire/* 175 | !mygrimoire/ 176 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | # Creative Magic Zoltraak 2 | Zoltraak is the name of a powerful creative magic that symbolizes the beginning of a true magical era. 3 | 4 | It is a system that elevates the invocation of techniques from unstructured spells to a grammatical system of magic, enabling faster and more powerful technique deployment and magic invocation. 5 | 6 | ![](assets/images/dai4697_A_digital_painting_of_a_female_wizard_casting_a_powerfu_84046a02-5831-48c1-b8e3-c8b5a49d69e8.png) 7 | 8 | Zoltraak adopts a prompt compiler system that converts natural language into an execution language. It takes a few words of incantation, expands them into complex techniques, and compiles them into an immediately executable ancient system language. This allows the magician's few words of incantation to pass through a magic circle woven with powerful words of power, greatly enhancing the range and power of the magic. It also enables high-speed creative magic with or without chanting. This makes it possible to invoke techniques overwhelmingly faster and more flexibly than the opposing enemy. 9 | 10 | TODO in the future: 11 | There is no need to worry about the spells being extracted and reverse-engineered by others, as it is possible to compile them into unique language spells and encrypted spells. After fine-tuning, it can be compressed into an ancient language to conceal the spells. Also, by using a unique language and making minor modifications to a few words, the execution language changes instantly and the technique is invoked. 12 | 13 | # Table of Contents 14 | 15 | - [Research](docs/research.md) 16 | - [Configuration](docs/configuration.md) 17 | - [FAQ](docs/faq.md) 18 | - [Getting Started](docs/getting-started.md) 19 | - [Installation](docs/installation.md) 20 | - [Usage](docs/usage.md) 21 | - [Examples](docs/examples) 22 | - [Troubleshooting](docs/troubleshooting.md) 23 | - [Video](docs/video.md) 24 | - [Contributing](docs/contributing.md) 25 | 26 | ![Last frame of video](assets/images/last_frame.png) 27 | 28 | ## Usage 29 | 30 | 1. Install Zoltraak 31 | ```sh 32 | pip install --upgrade zoltraak 33 | ``` 34 | 35 | ## Usage 36 | 37 | 1. How to use 38 | 1. Set the following environment variables in the `.env` file. 39 | ``` 40 | ANTHROPIC_API_KEY={Anthropic key} 41 | ``` 42 | 2. Install Zoltraak with the following command: 43 | ``` 44 | pip install zoltraak 45 | ``` 46 | 3. Run the following command and enter a prompt: 47 | ``` 48 | zoltraak "I want to create a Pokemon-like game system where you can learn the latest large language models" -c dev_obj 49 | ``` 50 | 51 | This will generate a requirements document based on the entered prompt. The generated requirements document serves as a draft, so modify and expand the content as needed. 52 | 53 | 2. Specifying the prompt compiler (invocation formula) 54 | The prompt compiler (invocation formula) that can be changed according to the purpose is specified after the `-c` option. Running without this option will present you a search result that shows the top 5 most-suited compiler for your request. 55 | 56 | | Compiler Name | Description | 57 | | --- | --- | 58 | | dev_func | A compiler that generates requirements documents for development tasks using functional programming | 59 | | dev_obj | A compiler that generates requirements documents for development tasks using object-oriented design | 60 | | biz_consult | A compiler that generates documents related to business consulting | 61 | | general_def | A compiler that generates requirements documents for general development tasks | 62 | | general_reqdef | A compiler that generates requirements documents for general requirements | 63 | | dev_react_fastapi | A compiler that generates requirements documents for development tasks using React + FastAPI | 64 | 65 | 3. Specific examples 66 | ```sh 67 | zoltraak "Develop a program to visualize the MoE (Mixture of Experts) model using Manim" -c dev_func 68 | zoltraak "Develop a multifunctional inventory management system using object-oriented design by the end of this month" -c dev_obj 69 | zoltraak "Create a business consulting document for small and medium-sized enterprises by the end of this month. Specifically, it should include advice on marketing strategies, financial management, and human resource development" -c biz_consult 70 | zoltraak "Develop an educational augmented reality (AR) application by the end of this month" -c general_def 71 | zoltraak "Write a proposal document for the government by the end of this month as a measure against the declining birthrate, including specific measures and budget proposals" -c general_reqdef 72 | ``` 73 | 74 | 2. Create a file named `test_dev_obj.md` and copy and paste the content of the subsequent thread into it. Place this file at the same level as the directory where you run zoltraak. 75 | 76 | 3. Rewrite `test_dev_obj.md` into your own definition document generation program according to the following rules: 77 | - Do not delete `{prompt}` as it is where the prompt (spell) after zoltraak will be inserted. 78 | - Do not delete `## 2. File/Folder Structure` either. 79 | - Everything else can be freely modified. 80 | 81 | 4. Run the following command to use your custom compiler: 82 | ```sh 83 | zoltraak prompt -cc custom_compiler 84 | zoltraak "I want to create a coffee shop customer management system" -cc test_dev_obj.md 85 | ``` 86 | 87 | 5. You should now be able to paste `zoltraak requirements/~~~.md`, so please execute it. 88 | 89 | 6. A directory will be built. For those who cannot launch the open command in Cursor or VSCode, please refer to the following: 90 | https://note.com/88gram/n/n4ead3a677b83 91 | 92 | Note: Everything is executed by Claude3 Haiku (a fee of about 1 yen per time is charged. Please check for yourself). 93 | 94 | ``` 95 | zoltraak book.md -p "I want to write a book" 96 | ``` 97 | 98 | After creating the file, you can rewrite it as many times as you like as follows: 99 | ``` 100 | zoltraak book.md -p "I want to increase the volume" 101 | ``` 102 | 103 | ```sh 104 | # Specify the files to put into RAG 105 | zoltraak aaaa.md -f ./input.md (planned) 106 | # Batch modification 107 | zoltraak dir/*.md (planned) 108 | ``` 109 | 110 | ![llmcomment.png](assets/images/llmcomment.png) 111 | 112 | ### Optional Arguments 113 | - ``-f``: Format specification. Located in the grimoires folder. 114 | - ``-l``: Generic language specification. The language name can be in the local name such as "Español", in English like "Spanish", or in Japanese like "スペイン語" (Spanish). 115 | - If a generic language formatter (a file ending with "``_lang.md``") exists for the specified format, the processing will be based on that file. 116 | - If it doesn't exist, the default language set compiler will be triggered. However, since the effect is relatively less stable, it is highly recommended to create a generic language formatter. 117 | 118 | ``` 119 | zoltraak "Develop a multi-functional inventory management system using object-oriented design within this month" -c dev_obj -l English 120 | zoltraak "Develop a multi-functional inventory management system using object-oriented design within this month" -c dev_obj -f md_comment -l CSharp 121 | zoltraak "Develop a multi-functional inventory management system using object-oriented design within this month" -c dev_obj -l Georgian 122 | ``` 123 | 124 | ## Joining the Project 125 | 126 | 1. Clone the repository: 127 | ``` 128 | git clone https://github.com/yourusername/Zoltraak.git 129 | ``` 130 | 131 | 2. Navigate to the project directory: 132 | ``` 133 | cd Zoltraak 134 | ``` 135 | 136 | 3. Install the necessary dependencies: 137 | ``` 138 | pip install -r requirements.txt 139 | ``` 140 | 141 | 4. Set your Anthropic API key: 142 | - Create a `.env` file in the project's root directory. 143 | - Add the following line to the `.env` file, replacing `YOUR_API_KEY` with your actual Anthropic API key: 144 | ``` 145 | ANTHROPIC_API_KEY=YOUR_API_KEY 146 | ``` 147 | 148 | # Here are the general steps for developing a PyPI package in a local environment: 149 | 150 | 1. Creating a virtual environment 151 | First, create an isolated virtual environment for package development. This allows you to develop in an environment separate from the system-wide Python. 152 | 153 | ```bash 154 | python -m venv zoltraak-dev 155 | source zoltraak-dev/bin/activate # For Linux 156 | mypackage-env\Scripts\activate.bat # For Windows 157 | ``` 158 | 159 | 2. Installing necessary packages 160 | Install the packages required for development. For example, `setuptools` and `wheel` are the bare minimum. 161 | 162 | ```bash 163 | pip install setuptools wheel 164 | ``` 165 | 166 | 3. Package directory structure 167 | Create the package with the following basic directory structure: 168 | 169 | ``` 170 | mypackage/ 171 | mypackage/ 172 | __init__.py 173 | module1.py 174 | module2.py 175 | tests/ 176 | test_module1.py 177 | test_module2.py 178 | setup.py 179 | README.md 180 | ``` 181 | 182 | 4. Creating `setup.py` 183 | Create a `setup.py` file that describes the package's metadata and dependencies. For example: 184 | 185 | ```python 186 | from setuptools import setup, find_packages 187 | 188 | setup( 189 | name='mypackage', 190 | version='0.1.0', 191 | packages=find_packages(), 192 | install_requires=[ 193 | # Dependencies 194 | ], 195 | ) 196 | ``` 197 | 198 | 5. Installing the package 199 | Install the package being developed into the virtual environment. 200 | 201 | ```bash 202 | pip install -e . 203 | ``` 204 | 205 | Now you can use and make changes to the package within the virtual environment. 206 | 207 | 6. Using and testing the package 208 | Proceed with development by using the package's functionality and running unit tests. 209 | 210 | 7. Building and distribution 211 | Once completed, the package can be built and published to PyPI using the following commands: 212 | 213 | ```bash 214 | python setup.py sdist bdist_wheel 215 | twine upload dist/* 216 | ``` 217 | 218 | This is the basic flow of PyPI package development in a local environment. The key points are to use a virtual environment and prepare an appropriate directory structure and `setup.py`. 219 | 220 | ### Additional Commands 221 | 222 | update_and_upload.sh 223 | ```sh 224 | echo "Updating version..." 225 | python update_version.py 226 | 227 | echo "Building package..." 228 | python setup.py sdist bdist_wheel 229 | 230 | echo "Uploading built package to PyPI..." 231 | twine upload dist/* 232 | ``` 233 | 234 | ## Directory Structure 235 | 236 | ``` 237 | zoltraak/grimoires/ 238 | ├── compiler: Converter from incantation to natural language 239 | │ ├── akirapp.md 240 | │ ├── func.md 241 | │ ├── lisp.md 242 | │ ├── obj.md 243 | │ ├── obj_mermaid.md 244 | │ ├── obj_lisp.md 245 | │ ├── obj_lisp_g.md 246 | │ ├── obj_lisp_g_base64.md 247 | │ └── reqdef.md 248 | ├── encryption: Encryption tools 249 | │ └── emoji.md 250 | ├── formatter: Prompt formatters 251 | │ ├── md_comment.md 252 | │   ├── md_comment_xx.md (md_comment that can specify some languages including but not limited to en and zh. Try running it first with the abbreviated form of your target language. If it doesn't work, please wait for the further support) 253 | │ └── py_comment.md 254 | ├── interpretspec: Interpreter-type LLM enhancement prompts 255 | │ └── hirokichi.md 256 | └── softdb: Soft DB 257 | 258 | memo: Want to include an experimental system to benchmark all items in the grimoires directory 259 | 260 | ``` 261 | 262 | ## Usage 263 | 264 | To convert a Markdown file to Python code, use the following command: 265 | 266 | ## Caching 267 | 268 | Zoltraak implements a caching mechanism to avoid unnecessary conversions of unchanged Markdown files. It calculates the hash value of each Markdown file and saves it in the `hashes.txt` file. When the conversion command is executed, Zoltraak compares the current hash value with the saved one. If the hash values match, indicating that the Markdown file has not been modified, the conversion is skipped, and the previously generated Python code is used. 269 | 270 | ## Integration with CI/CD 271 | 272 | Zoltraak can be integrated into CI/CD workflows to automate the conversion process. The `run_tests.sh` script is provided to facilitate this integration. It performs the following steps: 273 | 274 | 1. Creates and activates a virtual environment. 275 | 276 | 2. Installs the necessary dependencies. 277 | 278 | 3. Converts the Markdown files to Python code. 279 | 280 | 4. Executes the generated Python code. 281 | 282 | 5. Runs the corresponding unit tests. 283 | 284 | To use the `run_tests.sh` script in your CI/CD pipeline, configure your CI/CD system to execute the script as part of the build process. 285 | 286 | ## Contributing 287 | 288 | Contributions are welcome! If you encounter any issues or have suggestions for improvement, please open an issue or submit a pull request. 289 | 290 | ## License 291 | 292 | ## TODO 293 | 294 | ### Urgent 295 | 296 | - [ ] https://x.com/ai_syacho/status/1782956863912649114 297 | - [ ] zoltraak "slkajfka" -c file_path (make it possible to use self-made compilers) 298 | 299 | ``` 300 | ModuleNotFoundError can be resolved by 301 | pip install ~~~~ 302 | 303 | In this case, 304 | pip install anthropic 305 | will resolve the issue. 306 | 307 | ↓ 308 | pip install zoltraak 309 | will be adjusted to install all dependencies in one go. 310 | ``` 311 | 312 | ### CLI Command-related 313 | - [ ] zoltraak -p "I want to create a manim video" - This generates a requirements document and a program 314 | 315 | - 316 | 317 | ### Document Generation 318 | - [ ] Want documents of the generated Python files and detailed design documents. 319 | - Want to generate documents from Python files 320 | - Example: Specify a Python file like `Zoltraakgenerated/calc.py` to generate or update the corresponding markdown document for that file 321 | - Automatically generate documents from docstrings and comments in the Python file 322 | - Output the generated documents in markdown format 323 | 324 | ### Testing 325 | - [ ] Test files should be created separately and executed at necessary timings, such as git push. 326 | 327 | ### Issue Management 328 | - [ ] Want to describe issues. 329 | 330 | ### File Management 331 | - [x] When using repeatedly, automatically associate Markdown files with Python files. (Recompile only if there are changes) 332 | 333 | ### Requirements Definition-related 334 | - [ ] Implement a program to generate a requirements document from a read-aloud text in Akira-san's project. 335 | - It seems better to mix declarative and procedural styles together 336 | - [ ] ZoltraakAAA.md ~want to modify the requirements document 337 | - [ ] It would be nice to have a prompt document for deciding requirements definition 338 | - Want to select the compiler file 339 | - [ ] Need a flow to go back from a program to requirements definition. 340 | 341 | ### Others 342 | - [ ] It is good to prepare an intermediate file in advance to eliminate strange quirks of various high-level languages. 343 | - [ ] Please tell me the number of lines of the prompt that correspond to the color in this file. 344 | - [ ] Want to communicate the diff as a prompt. 345 | - [ ] Rebuild everything from scratch. From md file 346 | ![image](assets/images//graph.png) 347 | 348 | ## Overall Flow 349 | 350 | - ① Ambiguous and abstract: The initial prompt corresponds to this. A vague requirement like "I want to do something." 351 | 352 | shell 353 | ``` 354 | zoltraak "I want to write a book" 355 | ``` 356 | ↓ 357 | 358 | md file 359 | gen_def_{goal}.md 360 | 361 | ``` 362 | # Goal: I want to write a book 363 | Requirements Document: 364 | {def} 365 | ``` 366 | ↓ 367 | 368 | - ② Precise and abstract: Requirements documents, etc. By creating a definition document from the prompt, ambiguity is eliminated, and it becomes an abstract state. 369 | def_{goal}.md 370 | ``` 371 | Book Writing Requirements Document: 372 | import {def} 373 | import {def} 374 | import {def} 375 | 376 | ~~~~~~~ 377 | ~~~~~~~ 378 | ~~~~~~~ 379 | ~~~~~~~ 380 | ~~~~~~~ 381 | ``` 382 | ↓ 383 | 384 | - ③ Ambiguous and concrete: Accompanied by concrete actions but still in the trial-and-error stage. It can also be called interactive (interpreter). 385 | exe_{goal}.py 386 | ``` 387 | program # comment 388 | program # comment 389 | program # comment 390 | program # comment 391 | ``` 392 | - ④ Precise and concrete: Narrowed down to a single concrete action and manualized (document type, compiled). 393 | 394 | exe_{goal}.md 395 | ``` 396 | Detailed procedure (encrypt, abstract, make it easy for users to understand) 397 | 398 | ``` 399 | 400 | zoltraak book.md 401 | 402 | ### Genealogy of Natural Language Programming 403 | 404 | ``` 405 | *Emergence of ChatGPT 406 | |→ Prompt Engineering 407 | *Need for system development application of prompts 408 | |→ Prompt Programming 409 | *Emergence of Claude3 Opus 410 | |→ Document Programming 411 | |→ Natural Language Programming 412 | motoki → arbor → zoltraak 413 | *Groq x Llama3's fast text output control without interaction 414 | |→ Natural Language Framework zoltraak 415 | |→ Unified Programming Language babel 416 | ↑ Current Stage 417 | ``` 418 | 419 | ### How to Upload 420 | 421 | Here are the steps to upload a package to PyPI: 422 | 423 | 1. Preparing the package: 424 | - Set up the appropriate directory structure for your project. 425 | - Create a `setup.py` file and describe the package information (name, version, dependencies, etc.). 426 | - Create a `README.md` file and provide a description and usage instructions for the package. 427 | 428 | 2. Creating an account and obtaining an API token: 429 | - Access the PyPI website (https://pypi.org/). 430 | - Create a new account or log in to an existing account. 431 | - Generate an API token on the account settings page. 432 | 433 | 3. Installing build and upload tools: 434 | - Install `twine` and `setuptools`. 435 | ``` 436 | pip install twine setuptools 437 | ``` 438 | 439 | 4. Building the package: 440 | - Execute the following command in the project's root directory to build the package: 441 | ``` 442 | python setup.py sdist bdist_wheel 443 | ``` 444 | - This will generate the distribution files for the package in the `dist` directory. 445 | 446 | 5. Uploading to PyPI: 447 | - Execute the following command to upload the package to PyPI: 448 | ``` 449 | twine upload dist/* 450 | ``` 451 | - Use the obtained API token instead of the username and password. 452 | 453 | 6. Verifying the upload: 454 | - Access the PyPI website and confirm that the uploaded package is displayed correctly. 455 | 456 | Now the `zoltraak` package is published on PyPI. Users can install the package using the `pip install zoltraak` command. 457 | 458 | Notes: 459 | - The package name must be unique. You cannot use a name that already exists. 460 | - The version number needs to be incremented each time you upload a new version. 461 | - Ensure that the `setup.py` file includes the appropriate metadata and dependencies. 462 | - Clearly describe the package's description and usage instructions in the `README.md` file. 463 | 464 | This covers the steps for uploading a package to PyPI. If you encounter any issues, refer to the PyPI documentation or seek help from the community. 465 | 466 | ## Executing in a Virtual Environment 467 | 468 | `pyenv` is a Python version management tool, but it does not have a direct feature to create virtual environments. To create a virtual environment, you need to use a plugin called `pyenv-virtualenv`. 469 | 470 | Here are the steps to create a virtual environment using `pyenv-virtualenv`: 471 | 472 | 1. **Installing pyenv-virtualenv** 473 | 474 | First, install the `pyenv-virtualenv` plugin. This assumes that `pyenv` is already installed. 475 | 476 | ```bash 477 | git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv 478 | ``` 479 | 480 | After installation, add the following to your shell configuration file (e.g., `.bashrc` or `.zshrc`) and restart your shell. 481 | 482 | ```bash 483 | eval "$(pyenv init --path)" 484 | eval "$(pyenv virtualenv-init -)" 485 | ``` 486 | 487 | 2. **Installing Python** 488 | 489 | Use `pyenv` to install the Python version for the virtual environment. 490 | 491 | ```bash 492 | pyenv install 3.8.5 # Example: Install Python 3.8.5 493 | ``` 494 | 495 | 3. **Creating a Virtual Environment** 496 | 497 | Next, create a virtual environment with the specified Python version. 498 | 499 | ```bash 500 | pyenv virtualenv 3.8.5 my-virtual-env-3.8.5 501 | ``` 502 | 503 | Here, `my-virtual-env-3.8.5` is the name of the virtual environment. 504 | 505 | 4. **Activating the Virtual Environment** 506 | 507 | Activate the created virtual environment. 508 | 509 | ```bash 510 | pyenv activate my-virtual-env-3.8.5 511 | ``` 512 | 513 | This activates the specified virtual environment. 514 | 515 | 5. **Deactivating the Virtual Environment** 516 | 517 | To deactivate the virtual environment, use the following command: 518 | 519 | ```bash 520 | pyenv deactivate 521 | ``` 522 | 523 | This explains how to create and manage Python virtual environments using `pyenv` and `pyenv-virtualenv`. 524 | 525 | Local Environment 526 | 527 | Running `pip install -e .` seems to install the package in `Users/motokidaisuke/.pyenv/versions/3.11.5`. 528 | 529 | python setup.py sdist bdist_wheel 530 | twine upload --verbose dist/* 531 | 532 | Virtual Environment 533 | deactivate 534 | rm -rf /Users/motokidaisuke/aaaaa/zoltraak-env 535 | python3 -m venv /Users/motokidaisuke/aaaaa/zoltraak-env 536 | source /Users/motokidaisuke/aaaaa/zoltraak-env/bin/activate 537 | 538 | # Idea (Important) 539 | 540 | Incantation → Document → Structure → Information Structure → Execution 541 | |→ Natural Language |→ Natural Language 542 | |→ Programming Language 543 | 544 | # Memo 545 | 546 | ``` 547 | import compiler.dev.obj 548 | import writer.book.lecture 549 | ``` 550 | 551 | # TODO 552 | 553 | - [ ] Make the directory construction not pasted but asked to be built from the system 554 | - [ ] Functionalize the Python file retrieval part and externalize it 555 | - [ ] Introduce designers and developers. 556 | 557 | # Contributors 558 | 559 | 560 | [![All Contributors](https://img.shields.io/badge/all_contributors-0-orange.svg?style=flat-square)](#contributors-) 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | ## How to add a contributor 571 | 572 | To add a contributor, follow these steps: 573 | 574 | 1. Leave a comment on an issue or pull request in the following format: 575 | @all-contributors please add @username for 576 | Replace `@username` with the GitHub username of the contributor and `` with the type of contributions they made. Contribution types can be found in the [Emoji Key](https://allcontributors.org/docs/en/emoji-key). 577 | 578 | 2. The bot will then create a pull request to add the contributor to the project. 579 | 580 | 3. Once the pull request is merged, the contributor will be added to the README. 581 | -------------------------------------------------------------------------------- /assets/images/cast_zoltraak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/cast_zoltraak.png -------------------------------------------------------------------------------- /assets/images/dai4697_A_digital_painting_of_a_female_wizard_casting_a_powerfu_84046a02-5831-48c1-b8e3-c8b5a49d69e8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/dai4697_A_digital_painting_of_a_female_wizard_casting_a_powerfu_84046a02-5831-48c1-b8e3-c8b5a49d69e8.png -------------------------------------------------------------------------------- /assets/images/graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/graph.png -------------------------------------------------------------------------------- /assets/images/last_frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/last_frame.png -------------------------------------------------------------------------------- /assets/images/llmcomment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/llmcomment.png -------------------------------------------------------------------------------- /assets/images/ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/ng.png -------------------------------------------------------------------------------- /assets/images/ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/ok.png -------------------------------------------------------------------------------- /assets/images/syllabus_graph copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/syllabus_graph copy.png -------------------------------------------------------------------------------- /assets/images/syllabus_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/images/syllabus_graph.png -------------------------------------------------------------------------------- /assets/videos/480p15/FileStateTransition.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/videos/480p15/FileStateTransition.mp4 -------------------------------------------------------------------------------- /assets/videos/natural_langage_state_transition_mov.py: -------------------------------------------------------------------------------- 1 | from manim import * 2 | 3 | class FileStateTransition(Scene): 4 | def construct(self): 5 | # テキストを作成 6 | text_read = Text("プロンプト", color=RED, font_size=24) # フォントサイズを24に変更 7 | text_req = Text("ドキュメント\n(自然言語)", color=BLUE, font_size=24) # フォントサイズを24に変更 8 | text_lang = Text("プログラム\n(高級言語)", color=GREEN, font_size=24) # フォントサイズを24に変更 9 | text_test = Text("システム\nテスト項目", color=ORANGE, font_size=24) # テスト項目のテキストを追加 10 | 11 | # 丸と四角を作成 12 | circle_read = Circle(color=WHITE) 13 | circle_req = Circle(color=WHITE) 14 | circle_lang = Circle(color=WHITE) 15 | square_test = Square(color=WHITE) # テスト項目の四角を追加 16 | 17 | # 丸と四角を横に並べる(間隔を狭める) 18 | shapes = VGroup(circle_read, circle_req, circle_lang, square_test).arrange(RIGHT, buff=1.5) 19 | 20 | # テキストを丸と四角の上に配置 21 | text_read.next_to(circle_read, UP) 22 | text_req.next_to(circle_req, UP) 23 | text_lang.next_to(circle_lang, UP) 24 | text_test.next_to(square_test, UP) # テスト項目のテキストを四角の上に配置 25 | 26 | # 丸、四角、テキストを表示 27 | self.play(Create(shapes), Write(text_read), Write(text_req), Write(text_lang), Write(text_test)) 28 | self.wait(1) 29 | 30 | # 赤色の丸を先に光らせる 31 | self.play(circle_read.animate.set_fill(RED, opacity=1)) 32 | self.wait(1) 33 | 34 | # "zoltraakプロンプト.txt" コマンドを表示 35 | command1 = Text("zoltraakdocument -p prompt", font_size=24).next_to(circle_read, DOWN) 36 | self.play(Write(command1)) 37 | self.wait(1) 38 | # self.play(FadeOut(command1)) # command1をフェードアウト 39 | 40 | # 矢印を作成し、コマンドと同時に表示 41 | arrow1 = Arrow(circle_read.get_right(), circle_req.get_left(), color=WHITE) 42 | self.play(Create(arrow1), run_time=1) 43 | self.play( 44 | circle_req.animate.set_fill(BLUE, opacity=1), 45 | ) 46 | self.wait(1) 47 | 48 | # "zoltraakドキュメント" コマンドを表示 49 | command2 = Text("zoltraakdocument", font_size=24).next_to(circle_req, DOWN) 50 | self.play( 51 | FadeOut(command1), # 前のコマンドを消す 52 | Write(command2) 53 | ) 54 | self.wait(1) 55 | 56 | # 矢印を作成し、コマンドと同時に表示 57 | arrow2 = Arrow(circle_req.get_right(), circle_lang.get_left(), color=WHITE) 58 | self.play(Create(arrow2), run_time=1) 59 | self.play( 60 | circle_lang.animate.set_fill(GREEN, opacity=1), 61 | ) 62 | self.wait(1) 63 | 64 | # プログラムからテスト項目への矢印を作成 65 | arrow3 = Arrow(circle_lang.get_right(), square_test.get_left(), color=WHITE) 66 | self.play(Create(arrow3), run_time=1) 67 | self.play( 68 | square_test.animate.set_fill(ORANGE, opacity=1), 69 | ) 70 | self.wait(1) 71 | 72 | # テスト項目からドキュメントへの矢印を作成 73 | arrow4 = Arrow(square_test.get_right(), circle_req.get_right(), color=WHITE).shift(DOWN*1.7) # 矢印の位置を上にずらす 74 | self.play(Create(arrow4), run_time=1) 75 | self.wait(1) 76 | 77 | # ドキュメントとプログラムの同期を表現 78 | sync_text = Text("テスト項目を網羅されるまで、ドキュメントとプログラムの再構築が進む", font_size=24).next_to(shapes, DOWN*1.7, buff=1) 79 | self.play(Write(sync_text)) 80 | self.wait(1) # 1秒待つ 81 | self.play(FadeOut(sync_text)) # sync_textを消す 82 | 83 | # ドキュメントとプログラムの間に双方向の矢印を追加 84 | 85 | sync_arrow1 = DoubleArrow(circle_req.get_bottom(), circle_lang.get_bottom(), color=YELLOW, buff=0.5) 86 | sync_arrow2 = DoubleArrow(circle_lang.get_bottom(), circle_req.get_bottom(), color=YELLOW, buff=0.5) 87 | # ドキュメントとプログラムの間に "Compile" というテキストを追加 88 | compile_text = Text("Compile", font_size=24).move_to(sync_arrow1.get_center() + UP*0.5) 89 | self.play(Write(compile_text)) 90 | 91 | # "zoltraakドキュメント" コマンドを表示 92 | sync_command = Text("zoltraakdocument", font_size=24).next_to(shapes, DOWN) 93 | self.play( 94 | FadeOut(command2), # 前のコマンドを消す 95 | Write(sync_command) 96 | ) 97 | 98 | # ドキュメントが変更されてピコンとなる 99 | self.play( 100 | circle_req.animate.set_fill(BLUE, opacity=0.5), 101 | Flash(circle_req, line_length=0.5, num_lines=20, color=BLUE, flash_radius=circle_req.width/2+SMALL_BUFF, time_width=0.5), 102 | run_time=1 103 | ) 104 | 105 | # プログラムが変更されてピコンとなる 106 | self.play( 107 | circle_lang.animate.set_fill(GREEN, opacity=0.5), 108 | Flash(circle_lang, line_length=0.5, num_lines=20, color=GREEN, flash_radius=circle_lang.width/2+SMALL_BUFF, time_width=0.5), 109 | run_time=1 110 | ) 111 | 112 | # プログラムが変更されてピコンとなる 113 | self.play( 114 | circle_lang.animate.set_fill(GREEN, opacity=0.5), 115 | Flash(circle_lang, line_length=0.5, num_lines=20, color=GREEN, flash_radius=circle_lang.width/2+SMALL_BUFF, time_width=0.5), 116 | run_time=1 117 | ) 118 | 119 | # ドキュメントが変更されてピコンとなる 120 | self.play( 121 | circle_req.animate.set_fill(BLUE, opacity=0.5), 122 | Flash(circle_req, line_length=0.5, num_lines=20, color=BLUE, flash_radius=circle_req.width/2+SMALL_BUFF, time_width=0.5), 123 | run_time=1 124 | ) 125 | 126 | self.play(Create(sync_arrow1), Create(sync_arrow2)) 127 | 128 | self.wait(1) 129 | # ドキュメントとプログラムの同期を表現 130 | sync_text = Text("zoltraakdocument を行うたびにシステム実行と双方の同期がチェックされる", font_size=24).next_to(shapes, DOWN*1.7, buff=1) 131 | self.play(Write(sync_text)) -------------------------------------------------------------------------------- /assets/videos/zoltraak0.1.27_high_quality.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/videos/zoltraak0.1.27_high_quality.gif -------------------------------------------------------------------------------- /assets/videos/zoltraak2_smooth_high_quality.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/assets/videos/zoltraak2_smooth_high_quality.gif -------------------------------------------------------------------------------- /codetest.py: -------------------------------------------------------------------------------- 1 | code = """ 2 | はい、app.pyに対するユニットテストを作成しましょう。ここでは、Python標準のunittestモジュールを使用して、簡単な例を示します。 3 | 4 | まず、app.pyというファイルを作成し、以下のようなコードを書きます: 5 | 6 | ```python 7 | def add(a, b): 8 | return a + b 9 | 10 | def subtract(a, b): 11 | return a - b 12 | ``` 13 | 14 | 次に、app_test.pyというファイルを作成し、以下のようなユニットテストを書きます: 15 | 16 | ```python 17 | import unittest 18 | from app import add, subtract 19 | 20 | class TestApp(unittest.TestCase): 21 | def test_add(self): 22 | self.assertEqual(add(2, 3), 5) 23 | self.assertEqual(add(-1, 1), 0) 24 | 25 | def test_subtract(self): 26 | self.assertEqual(subtract(5, 3), 2) 27 | self.assertEqual(subtract(0, 1), -1) 28 | 29 | if __name__ == '__main__': 30 | unittest.main() 31 | ``` 32 | 33 | このテストケースでは、`add`関数と`subtract`関数の動作を確認しています。 34 | 35 | `test_add`メソッドでは、`add`関数の結果が期待値と一致することを確認しています。 36 | 37 | `test_subtract`メソッドでは、`subtract`関数の結果が期待値と一致することを確認しています。 38 | 39 | 最後に、`if __name__ == '__main__':`ブロックで`unittest.main()`を呼び出すことで、このテストモジュールを直接実行できるようにしています。 40 | 41 | これらのファイルを同じディレクトリに保存し、コマンドラインから以下のように実行すると、テストが実行されます: 42 | 43 | ``` 44 | python app_test.py 45 | ``` 46 | 47 | テストが成功すれば、以下のような出力が得られます: 48 | 49 | ``` 50 | .... 51 | ---------------------------------------------------------------------- 52 | Ran 4 tests in 0.001s 53 | 54 | OK 55 | ``` 56 | 57 | これは、app.pyの`add`関数と`subtract`関数が期待通りに動作していることを示しています。 58 | 59 | このように、ユニットテストを書くことで、アプリケーションの個々の部分が正しく動作することを確認できます。これは、ソフトウェア開発の品質を高め、バグを早期に発見するのに役立ちます。 60 | """ 61 | 62 | def process_text(text): 63 | lines = text.split('\n') 64 | inside_code_block = False 65 | result = [] 66 | 67 | for i, line in enumerate(lines): 68 | if line.startswith('```'): 69 | inside_code_block = not inside_code_block 70 | else: 71 | if inside_code_block: 72 | result.append(line) 73 | else: 74 | result.append('# ' + line) 75 | 76 | return '\n'.join(result) 77 | def process_text2(text, language=None): 78 | lines = text.split('\n') 79 | inside_code_block = False 80 | result = [] 81 | 82 | for i, line in enumerate(lines): 83 | if line.startswith('```'): 84 | if not inside_code_block: 85 | inside_code_block = True 86 | if language is not None and language.lower() not in line.lower(): 87 | inside_code_block = False 88 | else: 89 | inside_code_block = False 90 | else: 91 | if inside_code_block: 92 | result.append(line) 93 | else: 94 | result.append('# ' + line) 95 | 96 | return '\n'.join(result) 97 | 98 | aaa = process_text2(code, "python") 99 | print(aaa) -------------------------------------------------------------------------------- /docs/NLProgramming_grammar..md: -------------------------------------------------------------------------------- 1 | # 自然言語プログラミング 文法 2 | 3 | 4 | ## 機動式(プロンプトコンパイラ)の書き方 5 | 6 | アンチパターン 7 | 8 | 9 | 以下のように左端にべたっと貼り付けると文言がそのまま出力される 10 | ![aaa](../assets/images/ng.png) 11 | 12 | 13 | 良いパターン 14 | 必ず小項目は改行するように 15 | ![aaa](../assets/images/ok.png) -------------------------------------------------------------------------------- /docs/configuration.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 用語定義(わかりにくくなってきたのでじき修正します) 4 | 5 | | システム用語 | 魔法体系 | 説明 | 自然言語プログラミング体系 | 6 | |---|---|---|---| 7 | | インタプリタ実行 | 即時魔法 | 対話形式の自然言語による指示のこと。即座に魔法を発動できる。 | zoltraak 魔導書 | 8 | | コンパイラ実行 | 錬成魔法 | ドキュメント形式で記述された魔法の定義のこと。じっくりと魔法を錬成できる。 | zoltraak 魔導書 --prompt 呪文 | 9 | | コンパイラ | 錬成器、起動式 | 詠唱から魔導書、魔法陣を錬成するための道具のこと。 錬成機自体は起動式が記述されている。魔法の品質を高めるのに役立つ。 | zoltraak -c 錬成器 | 10 | | 自然言語プログラム | 魔導書、魔法式、術式 | 魔法の理論や使い方を体系的にまとめた書物のこと。魔法の学習に役立ちこれ自体は一般言語で執筆されている。zoltraakにより魔法を発動することも出来る。 | zoltraak 魔導書 | 11 | | 高級言語プログラム | 古代魔導書 | 太古の魔法使いたちが残した神秘的な書物。ルーン文字で書かれており、強力な魔法の秘密が記されている。解読は容易ではないが、魔法の真髄を学ぶことができる。 | zoltraak -a 古代魔導書 | 12 | | 機械語 | 魔法石 | 魔導書を錬成器で錬成したもの、魔導書を実行すると魔法石により魔法が発動する | zoltraak -c 魔法石.md | 13 | 14 | 15 | 16 | ### 文字 17 | | システム用語 | 魔法体系 | 説明 | 18 | |---|---|---| 19 | | 自然言語 | 世界語 | 人間が日常的に使用する言語。自然に発生し、文法や語彙が複雑。魔法を唱えるのに使われる。 | 20 | | プログラミング言語 | 古代語 | 魔法を正確に記述するための言語。厳密な文法と限られた語彙を持つ。魔導書の記述に使われる。 | 21 | 22 | ### 術式 23 | 24 | | 術式 | 説明 | 25 | |:--|:--| 26 | | 起動術式 | 魔法術式を構築するための術式 | 27 | | 魔法術式 | イメージを具体的に記した術式のこと| 28 | | 魔法陣 | 魔法術式の中でも視覚情報は魔法陣と呼ぶ| 29 | | 領域術式 | 魔法術式を得て領域を具現化する術式 | 30 | | 視覚術式 | 魔法術式を得て領域を具現化する術式、魔導書に相当する魔法術式は文字情報が多いため、視覚化する目的でも利用する | 31 | 32 | 33 | ## 主な機能(予定) 34 | 35 | - マークダウンファイルから様々な高級言語のコードへの変換 36 | - 対応言語: Python, Java, C++, JavaScript, TypeScriptなど 37 | - AnthropicのClaude AIモデルを利用したコード生成 38 | - 変換済みファイルのキャッシュによる高速な再実行 39 | - 進捗状況の追跡とテストケースの実行 40 | - CI/CDワークフローとの統合 41 | 42 | 43 | 44 | | |プロンプト|ドキュメント|高級言語| 45 | |---|---|---|---| 46 | |ファイルなし|zoltraak docs --prompt text|zoltraak docs|zoltraak docs| 47 | |ファイルあり (修正変更なし)|zoltraak docs --prompt text|zoltraak docs|zoltraak docs| 48 | |ファイルあり (修正変更あり)|zoltraak docs --prompt text|zoltraak docs|zoltraak docs| 49 | 50 | この表では、各セルに `zoltraak {ファイル名}` の形式でファイル名を入れています。 51 | 52 | - 左側の列は、ファイルの有無とファイルの状態を表しています。 53 | 1. ファイルなし 54 | 2. ファイルあり (修正変更なし) 55 | 3. ファイルあり (修正変更あり) 56 | 57 | - 上側の行は、ファイルの種類とその説明を表しています。 58 | - テキストファイル (読み上げ文章) 59 | - マークダウンファイル (要件定義書) 60 | - Pythonファイル (高級言語) 61 | 62 | 各セルには、対応するファイルの種類に基づいて `zoltraak 読み上げ文章`、`zoltraak 要件定義書`、`zoltraak 高級言語` のようなコマンドが入っています 63 | 64 | この表は、ファイルの有無とファイルの状態の関係性を明確に表現しており、ファイルの種類ごとにそれぞれの状態が適用可能であることを示しています。また、各セルにファイル名を入れることで、具体的なファイルの例を提供しています。 65 | 66 | 67 | ## オプション(Option) 68 | 69 | Zoltraakには以下のようなオプションが用意されています。 70 | 71 | - `--output-dir`: 生成されたPythonファイルの出力ディレクトリを指定します。デフォルトは"generated"ディレクトリです。 72 | - `-p`, `--prompt`: 追加のプロンプト情報を指定します。これにより、既存のMarkdownファイルに対して変更を提案したり、新しい要件定義書を生成することができます。 73 | - `-c`, `--compiler`: 要件定義書のテンプレートとなるMarkdownファイルのパスを指定します。デフォルトは"reqdef.md"です。 74 | 75 | これらのオプションを使うことで、Zoltraakの機能をより柔軟に活用できます。例えば、既存のMarkdownファイルに対して変更を提案したり、新しい要件定義書を生成することができます。 76 | 77 | また、要件定義書のテンプレートとなるMarkdownファイルを変更することで、生成される要件定義書の形式を変更することも可能です。 78 | 79 | 80 | 81 | 82 | ## 様々なプログラミング言語でのZoltraakの利用方法(作成予定) 83 | 84 | Zoltraakは様々なプログラミング言語のファイルを処理することができます。以下に主要な言語での利用例を示します。 85 | 86 | ファイル作成 & 87 | 88 | ``` 89 | # 様々な言語でzoltraak を試してみよう 90 | 91 | ## Python 92 | zoltraak script.py -p "ユーザー情報を管理するクラスを作成したい" 93 | zoltraak utils.py -p "CSVファイルを読み込んでデータを処理する関数が必要" 94 | 95 | ## JavaScript 96 | zoltraak app.js -p "TODOリストを管理するReactコンポーネントが必要" 97 | zoltraak server.js -p "ExpressでRESTful APIを実装したい" 98 | 99 | ## Java 100 | zoltraak Main.java -p "学生の成績を計算するメソッドを追加してほしい" 101 | zoltraak UserService.java -p "ユーザーのCRUD操作を行うメソッドを作成" 102 | 103 | ## C++ 104 | zoltraak main.cpp -p "リンクリストを使ってデータを管理する関数を書きたい" 105 | zoltraak utils.h -p "数学計算用のユーティリティ関数を定義したい" 106 | 107 | ## Ruby 108 | zoltraak app.rb -p "ユーザー認証機能を実装したい" 109 | zoltraak parser.rb -p "JSONデータをパースしてオブジェクトに変換する機能が欲しい" 110 | 111 | 上記は一例ですが、このようにzoltraak を使えば様々な言語やシチュエーションでコード生成ができます。 112 | ぜひ色々なプロンプトを試して、zoltraak の可能性を探ってみてください! 113 | ``` 114 | 115 | 実行 116 | 117 | 118 | 119 | このように、zoltraak は対象となるファイルの拡張子から言語を判断し、適切な形式でコードを生成します。プロンプトには自然言語で実現したい機能や要件を記述するだけで、zoltraak が自動的にコードを生成してくれます。 120 | プログラミング言語に関わらず、同じようにzoltraak を使うことができるため、様々なプロジェクトで活用できるでしょう。 121 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/docs/contributing.md -------------------------------------------------------------------------------- /docs/examples/example1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/docs/examples/example1.md -------------------------------------------------------------------------------- /docs/examples/example2.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/docs/examples/example2.md -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/docs/faq.md -------------------------------------------------------------------------------- /docs/getting-started.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/docs/getting-started.md -------------------------------------------------------------------------------- /docs/installation.md: -------------------------------------------------------------------------------- 1 | # インストール方法 2 | ## STEP1:環境変数の設定 3 | Zoltraakは、.env ファイルに環境変数を設定する必要があります。 4 | .envファイルは、Zoltraakを動作させるディレクトリの配下に作成して下さい。 5 | 6 | ``` 7 | ANTHROPIC_API_KEY={Anthropicのキー} 8 | ``` 9 | ※...{}は必要ありません。 10 | 11 | ## STEP2:インストール 12 | ターミナルに以下のコマンドを入力することでZoltraakをインストールします。 13 | ``` 14 | pip install zoltraak 15 | ``` 16 | 17 | ### バージョンアップしたい時 18 | ```sh 19 | pip install --upgrade zoltraak 20 | ``` 21 | -------------------------------------------------------------------------------- /docs/research.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 全体アーキ 4 | 5 | ![aa](../assets/images/arch.png) 6 | 7 | 8 | ## プロンプトの分類 9 | 10 | プロンプトは以下の4つの分類に分けることができます。 11 | 12 | | | 抽象的 | 具体的 | 13 | |-------|-------|--------| 14 | | 曖昧 | ① 初期プロンプト
例)ほにゃらしたい | ③ 試行錯誤段階
対話型(インタプリタ)| 15 | | 厳密 | ② 要件定義書
曖昧さが排除された状態 | ④ マニュアル化
ドキュメント型(コンパイル)| 16 | 17 | - ①曖昧で抽象的:初期のプロンプトがこれに相当。「ほにゃらしたい」という曖昧な要求。 18 | - ②厳密で抽象的:要件定義書など。プロンプトから定義書を作成することで曖昧さが排除され、抽象的な状態になる。 19 | - ③曖昧で具体的:具体的な行動は伴っているが、まだ試行錯誤している段階。対話型(インタプリタ)とも言える。 20 | - ④厳密で具体的:1本の具体的な行動に落とし込まれており、マニュアル化(ドキュメント型、コンパイル)された状態。 21 | 使eう。 22 | 23 | つまり、プロンプトが「曖昧」な時は対話型、「厳密」な時はドキュメント型で使っていると言えます。 24 | プロンプトの性質を理解することで、AIとの対話をより効果的に行うことができるでしょう。 25 | 26 | 27 | ## プロンプトコンパイラの分類について 28 | 29 | 30 | ### 機能レベル 31 | 32 | 33 | - 自然言語 → 自然言語 のプロンプトコンパイラがある 34 | - 自然言語 → 高級言語 のプロンプトコンパイラがある 35 | 36 | 37 | 38 | ### 黒魔法 39 | 40 | - 呪文 41 | - 起動術式 42 | - 魔法術式 43 | - 領域術式 44 | 45 | 46 | ### 白魔法 47 | - 錬成術式 48 | 49 | 50 | 51 | 言霊 52 | 53 | 54 | 55 | 56 | 領域術式 57 | 58 | 59 | 60 | 61 | ### 概念レベル 62 | 63 | 64 | 65 | | 大項目 | 中項目 | 規模感 | 抽象度 | 宣言型 | 手続き型 | 66 | |------|------|------|------|----------------------------------------------------------------|----------------------------------------------------------------| 67 | | 単機能 | 要件定義書 | 小規模 | 低 | - 要件定義書 | - 要件定義書から手順書への変換 | 68 | | 単機能 | プログラムファイル | 小規模 | 低 | - Kubernetesマニフェストファイル
- Terraformファイル (IaC)
- Ansibleのplaybook | - シェルスクリプト
- Makefile
- CI/CDパイプライン
- プロンプトフロー | 69 | | 単機能 | 画像ファイル | 小規模 | 低 | - AIによる画像生成機能 | - 画像処理スクリプト | 70 | | 単機能 | 動画ファイル | 小規模 | 低 | - 動画ファイル作成機能 | - 動画編集スクリプト | 71 | | プロジェクト | 要件定義 | 中規模 | 中 | - 要件定義書を用いたソフトウェア開発プロジェクト
- 要件定義書を用いた建築設計プロジェクト
- 要件定義書を用いた企画提案プロジェクト
- 要件定義書を用いたデータ可視化プロジェクト | - 要件定義書から設計書への変換
- 要件定義書から仕様書への変換
- 要件定義書からプロジェクト計画書への変換 | 72 | | プロジェクト | 設計 | 中規模 | 中 | - 設計書、アーキテクチャ図を用いたソフトウェア開発プロジェクト
- 設計図、青写真、模型を用いた建築設計プロジェクト | - コーディング規約、詳細設計書、テスト仕様書を用いたソフトウェア開発プロジェクト
- 施工手順書、工程表、資材リストを用いた建築設計プロジェクト | 73 | | プロジェクト | 企画 | 中規模 | 中 | - プレゼンテーション資料、スライド、図表を用いた企画提案プロジェクト | - タスクリスト、スケジュール表、予算計画を用いたプロジェクト管理 | 74 | | プロジェクト | データ分析 | 中規模 | 中 | - データ分析レポート、ダッシュボード、グラフを用いたデータ可視化プロジェクト | - データクレンジング手順、分析手法、レポートテンプレートを用いたデータ分析プロジェクト | 75 | | 業界 |全体 | 大規模 | 高 | - 業界標準、ベストプラクティス
- 企業理念、ミッション、ビジョン
- 長期戦略、事業計画
- 組織文化、 価値観 | - 業務プロセス、ワークフロー
- 組織構造、権限と責任
- 予算管理、資源配分
- 人事制度、評価システム | 76 | | 業界 | IT業界 | 大規模 | 高 | - コーディング規約、設計原則
- アジャイル開発手法
- クラウドネイティブアーキテクチャ
- DevOps文化 | - ソフトウェア開発ライフサイクル
- マイクロサービスアーキテクチャ
- CI/CDパイプライン
- アジャイルプロジェクト管理 | 77 | | 業界 | 建築業界 | 大規模 | 高 | - 建築基準法、都市計画法
- 環境性能評価、省エネルギー基準
- ユニバーサルデザイン
- 安全施工管理 | - BIM (Building Information Modeling)
- ゼネコン、サブコン、専門工事業者の役割分担
- 工程管理、原価管理
- 品質管理、環境管理 | 78 | | 世界 | - | 最大 | 最大 | - 理想の社会像、ユートピア
- 憲法、基本法、権利章典
- 国連の持続可能な開発目標(SDGs)
- 人権宣言、子どもの権利条約 | - 法律、規則、倫理規定
- 国家予算、財政計画
- 外交政策、安全保障戦略
- 教育制度、社会保障制度 | 79 | 80 | 81 | 82 | ## 世界・国家 83 | 84 | | 宣言型 | 手続き型 | 85 | |----------------------------------------------------------------|----------------------------------------------------------------| 86 | | - 理想の社会像、ユートピア
- 憲法、基本法、権利章典
- 国連の持続可能な開発目標(SDGs)
- 人権宣言、子どもの権利条約 | - 法律、規則、倫理規定
- 国家予算、財政計画
- 外交政策、安全保障戦略
- 教育制度、社会保障制度 | 87 | 88 | 世界・国家レベルでは、宣言型には理想の社会像やユートピア、憲法や基本法、権利章典、国連のSDGsなどが含まれます。これらは、目指すべき社会の姿や価値観を明確に示すものです。 89 | 90 | 一方、手続き型には、具体的な法律や規則、倫理規定、国家予算や財政計画、外交政策や安全保障戦略、教育制度や社会保障制度などが含まれます。これらは、宣言型で示された理想の社会を実現するための具体的な手段や方法を定めるものです。 91 | 92 | 宣言型と手続き型を適切に組み合わせることで、理想の社会の実現に向けて効果的に取り組むことができます。宣言型で目指すべき方向性を明確にし、手続き型でその実現のための具体的な道筋を示すことが重要です。 93 | 94 | 95 | 96 | 小規模 (機能ベース) の宣言型の部分に、動画ファイル作成機能、画像出力機能、AI APIを追加しました。これらは、宣言型のアプローチを用いて、特定の機能を実現するプロンプトコンパイラの例です。 97 | 98 | また、小規模 (機能ベース) の手続き型の部分に、CI/CDパイプラインとプロンプトフローを追加しました。CI/CDパイプラインは、手続き型のアプローチを用いて、ソフトウェアの継続的なインテグレーションとデリバリーを自動化するプロンプトコンパイラの一例です。プロンプトフローは、手続き型のアプローチを用いて、プロンプトの実行フローを定義するプロンプトコンパイラの一例です。 99 | 100 | この修正された表は、小規模 (機能ベース) のプロンプトコンパイラの種類をより具体的に表現しています。 101 | 102 | 103 | 104 | | 業界 | 宣言型(最終成果イメージ) | 手続き型(ゴールまでの手順) | 105 | |-----------|----------------------|-----------------------------------| 106 | | 建築業界 | 設計図、青写真 | 施工手順書、工程表 | 107 | | 料理業界 | レシピ、料理写真 | 調理手順、料理動画 | 108 | | 音楽業界 | 楽譜、コード進行 | 演奏手順、練習スケジュール | 109 | | 教育業界 | シラバス、カリキュラム | 授業計画、学習スケジュール | 110 | | 映画業界 | 脚本、絵コンテ | 撮影スケジュール、編集作業 | 111 | | ファッション業界 | デザイン画、着こなし例 | 縫製手順、コーディネート手順 | 112 | | スポーツ業界 | 戦術図、フォーメーション | トレーニングメニュー、試合の流れ | 113 | | ビジネス業界 | 事業計画書、組織図 | 業務フロー、営業プロセス | 114 | | 医療業界 | 処方箋、診断書 | 治療計画、リハビリテーションプログラム | 115 | | 法律業界 | 憲法、法律、政令、省令、法律条文、契約書 | 訴訟手続き、法的手続き | 116 | | 生物 | DNA塩基配列 | 遺伝子発現、タンパク質合成、細胞分化、器官形成の過程 | 117 | 118 | 119 | 宣言型: 120 | - ゴールの定義に重点を置く 121 | - 目的地や到達点を明確に示す 122 | - 具体的な手順は抽象化されている 123 | - "What"(何を達成するか)に焦点を当てる 124 | 125 | 手続き型: 126 | - ゴールへの道のりに重点を置く 127 | - 目的地に到達するための具体的な手順を示す 128 | - 各ステップを順序立てて説明する 129 | - "How"(どのように達成するか)に焦点を当てる 130 | 131 | 例えば、旅行で目的地に行く場合を考えてみましょう。 132 | 133 | 宣言型:「パリに行きたい」と宣言するだけで、具体的な交通手段や経路は明示しません。 134 | 135 | 手続き型:「羽田空港からシャルル・ド・ゴール空港までの飛行機に乗り、空港から市内へは電車で移動する」と、目的地に到達するための詳細な手順を示します。 136 | 137 | このように、宣言型はゴールや目的地を明確に定義することに重点を置き、手続き型はゴールへ到達するための具体的な手順に重点を置いています。両方のアプローチを適切に組み合わせることで、効果的に目的を達成することができます。 138 | 139 | ### 時間軸とゴールの関係 140 | 141 | 音楽や動画など、時間の流れが関わるものについては、時間軸に沿って進行していきますが、それがゴールまでの過程を意味する場合もあれば、それ自体をゴールと考えることができる場合もあります。 142 | 143 | 例えば、友人を鼓舞したい、元気にしたいというゴールがある場合、友人に渡すポップな音楽はその過程の一部となります。一方、荘厳な音楽を作ろうという場合、音楽自体がゴールであり、それまでの制作過程がゴールに至るまでの過程となります。 144 | 145 | ### 生成AIとイメージの世界 146 | 147 | 生成AIは、ゴールのイメージを示すことで、そのイメージを実現するための過程を自動的に生成することができます。つまり、生成AIはゴールを示せば、その過程を実行してあるべき姿にする補助輪の役目を担っているのです。 148 | 149 | 将来的には、イメージしたものがすぐに具現化できるようになるでしょう。それは「魔法」と言っても過言ではありません。生成AIの発展により、私たちはイメージの世界により近づいているのです。 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | ------------- 159 | 160 | 161 | 162 | ## 数学表現について 163 | 164 | 165 | 166 | 行列 167 | $$ 168 | A = \begin{pmatrix} 169 | 1 & 2 & 3 \\ 170 | 4 & 5 & 6 171 | \end{pmatrix} 172 | $$ 173 | 174 | 行列式は、行列の値を一つの数値で表したものです。例えば、$2 \times 2$行列$B$の行列式は以下のように計算されます。 175 | 176 | $$ 177 | B = \begin{pmatrix} 178 | 2 & 3 \\ 179 | 1 & 4 180 | \end{pmatrix} 181 | $$ 182 | 183 | $$ 184 | \det B = \begin{vmatrix} 185 | 2 & 3 \\ 186 | 1 & 4 187 | \end{vmatrix} = 2 \times 4 - 3 \times 1 = 5 188 | $$ 189 | 190 | また、$3 \times 3$行列$C$の行列式は以下のように計算されます。 191 | 192 | $$ 193 | C = \begin{pmatrix} 194 | 1 & 2 & 3 \\ 195 | 4 & 5 & 6 \\ 196 | 7 & 8 & 9 197 | \end{pmatrix} 198 | $$ 199 | 200 | $$ 201 | \det C = \begin{vmatrix} 202 | 1 & 2 & 3 \\ 203 | 4 & 5 & 6 \\ 204 | 7 & 8 & 9 205 | \end{vmatrix} = 1 \times (5 \times 9 - 6 \times 8) - 2 \times (4 \times 9 - 6 \times 7) + 3 \times (4 \times 8 - 5 \times 7) = 0 206 | $$ 207 | 208 | 209 | 210 | 量子力学の基本的な数式の一つにシュレーディンガー方程式があります。この方程式は、量子系の状態の時間発展を記述します。一次元の場合の時間に依存しないシュレーディンガー方程式は以下のように表されます。 211 | 212 | 量子力学の問題を解いてみましょう。以下のシュレーディンガー方程式を考えます。 213 | 214 | $$ 215 | - \frac{\hbar^2}{2m} \frac{d^2 \psi}{dx^2} + V(x) \psi = E \psi 216 | $$ 217 | 218 | ここで、 219 | - $\hbar$ はディラック定数(プランク定数を $2\pi$ で割ったもの) 220 | - $m$ は粒子の質量 221 | - $\psi$ は波動関数 222 | - $V(x)$ はポテンシャルエネルギー 223 | - $E$ は系の全エネルギー 224 | 225 | この方程式を使って、無限深さのポテンシャル井戸内での粒子のエネルギー状態を求めます。ポテンシャル$V(x)$は以下のように与えられます。 226 | 227 | $$ 228 | V(x) = \begin{cases} 229 | 0 & \text{if } 0 \leq x \leq a \\ 230 | \infty & \text{otherwise} 231 | \end{cases} 232 | $$ 233 | 234 | 境界条件$\psi(0) = \psi(a) = 0$を用いて、この問題を解いてみましょう。この条件下で、波動関数$\psi(x)$とエネルギー$E$を求めることが目標です。 235 | 236 | この問題の解は、量子力学の基本的な理解を深めるのに役立ちます。 237 | 238 | 239 | ## 解答 240 | 241 | シュレーディンガー方程式を解くために、以下の手順で進めます。 242 | 243 | 1. 境界条件を考慮して、波動関数の一般解を求める。 244 | 2. 境界条件から、エネルギー固有値を求める。 245 | 3. エネルギー固有値を用いて、規格化された波動関数を求める。 246 | 247 | ### 1. 波動関数の一般解 248 | 249 | ポテンシャル内部($0 \leq x \leq a$)では、シュレーディンガー方程式は以下のようになります。 250 | 251 | $$ 252 | - \frac{\hbar^2}{2m} \frac{d^2 \psi}{dx^2} = E \psi 253 | $$ 254 | 255 | この方程式の一般解は、以下のように表されます。 256 | 257 | $$ 258 | \psi(x) = A \sin(kx) + B \cos(kx), \quad k = \sqrt{\frac{2mE}{\hbar^2}} 259 | $$ 260 | 261 | ここで、$A$と$B$は定数です。 262 | 263 | ### 2. エネルギー固有値 264 | 265 | 境界条件$\psi(0) = \psi(a) = 0$を適用すると、以下の条件が得られます。 266 | 267 | $$ 268 | B = 0, \quad \sin(ka) = 0 269 | $$ 270 | 271 | したがって、$ka$は$\pi$の整数倍でなければなりません。 272 | 273 | $$ 274 | ka = n\pi, \quad n = 1, 2, 3, \ldots 275 | $$ 276 | 277 | これを$k$について解くと、エネルギー固有値が得られます。 278 | 279 | $$ 280 | E_n = \frac{\hbar^2 \pi^2 n^2}{2ma^2}, \quad n = 1, 2, 3, \ldots 281 | $$ 282 | 283 | ### 3. 規格化された波動関数 284 | 285 | エネルギー固有値を用いて、規格化された波動関数を求めます。 286 | 287 | $$ 288 | \psi_n(x) = A_n \sin\left(\frac{n\pi x}{a}\right), \quad n = 1, 2, 3, \ldots 289 | $$ 290 | 291 | 規格化条件から、係数$A_n$を決定します。 292 | 293 | $$ 294 | \int_0^a |\psi_n(x)|^2 dx = 1 295 | $$ 296 | 297 | これを解くと、以下のようになります。 298 | 299 | $$ 300 | A_n = \sqrt{\frac{2}{a}} 301 | $$ 302 | 303 | したがって、規格化された波動関数は以下のように表されます。 304 | 305 | $$ 306 | \psi_n(x) = \sqrt{\frac{2}{a}} \sin\left(\frac{n\pi x}{a}\right), \quad n = 1, 2, 3, \ldots 307 | $$ 308 | 309 | 以上が、無限深さのポテンシャル井戸内での粒子のエネルギー状態と波動関数の導出過程です。この結果は、量子力学の基本的な概念を理解する上で重要な役割を果たします。 310 | 311 | 312 | 313 | 314 | 315 | ### 1. 波動関数の一般解 316 | 317 | $$ 318 | \begin{aligned} 319 | - \frac{\hbar^2}{2m} \frac{d^2 \psi}{dx^2} &= E \psi \\ 320 | \psi(x) &= A \sin(kx) + B \cos(kx), \quad k = \sqrt{\frac{2mE}{\hbar^2}} \\ 321 | B &= 0, \quad \sin(ka) = 0 \\ 322 | ka &= n\pi, \quad n = 1, 2, 3, \ldots \\ 323 | E_n &= \frac{\hbar^2 \pi^2 n^2}{2ma^2}, \quad n = 1, 2, 3, \ldots \\ 324 | \psi_n(x) &= A_n \sin\left(\frac{n\pi x}{a}\right), \quad n = 1, 2, 3, \ldots \\ 325 | \int_0^a |\psi_n(x)|^2 dx &= 1 \\ 326 | A_n &= \sqrt{\frac{2}{a}} \\ 327 | \psi_n(x) &= \sqrt{\frac{2}{a}} \sin\left(\frac{n\pi x}{a}\right), \quad n = 1, 2, 3, \ldots 328 | \end{aligned} 329 | $$ 330 | 331 | 332 | 333 | 334 | 335 | 無限深さのポテンシャル井戸内での粒子の量子力学的な振る舞いを理解するために、時間独立シュレディンガー方程式を用いて、粒子のエネルギー固有状態と波動関数を求めます。ポテンシャル$V(x)$は以下のように定義されます。 336 | 337 | $$ 338 | V(x) = \begin{cases} 339 | 0 & 0 \leq x \leq a の範囲内\\ 340 | \infty & それ以外の領域 341 | \end{cases} 342 | $$ 343 | 344 | 境界条件$\psi(0) = \psi(a) = 0$を満たすように解を求めます。この条件下で、粒子の波動関数$\psi(x)$とエネルギー$E$を導出することが目標です。 345 | 346 | 347 | $$ 348 | - \frac{\hbar^2}{2m} \frac{d^2 \psi}{dx^2} + V(x) \psi = E \psi 349 | $$ 350 | 351 | 352 | 353 | 354 | ## アーキ 355 | 356 | - compiler: 抽象文書を具体文書に変換するコンパイラ 357 | - archtecture: 358 | - 文書を構造体として骨組みを作る実行体 359 | - 360 | - execute: 361 | 362 | 363 | 364 | ``` 365 | アーキテクチャ (Architecture) とデザイン (Design) という言葉の原義から、その意図を読み解いてみましょう。 366 | 367 | アーキテクチャ (Architecture): 368 | - 語源はギリシャ語の "arkhitekton" で、"chief builder" (主要な建設者) を意味します。 369 | - 建築の文脈では、建物の全体的な構造や様式を指します。 370 | - ITの文脈では、システムの全体的な構造や設計原則を意味します。 371 | - つまり、アーキテクチャは「全体を見渡し、大局的な設計を行う」という意図を持っています。 372 | 373 | デザイン (Design): 374 | - 語源はラテン語の "designare" で、"to mark out, devise, choose, designate, appoint" (印をつける、考案する、選ぶ、指定する、任命する) を意味します。 375 | - 一般的に、機能性と美的感覚を兼ね備えた設計を指します。 376 | - ITの文脈では、システムの詳細な設計や実装方法を意味します。 377 | - つまり、デザインは「具体的な設計を行い、機能性と美的感覚を追求する」という意図を持っています。 378 | 379 | これらの言葉の原義から、アーキテクチャは「大局的な視点」を、デザインは「詳細な視点」を重視していることがわかります。アーキテクチャは、システム全体の構造や設計原則を定義し、デザインはその原則に基づいて具体的な設計を行うという役割分担があると言えます。 380 | 381 | また、アーキテクチャが "chief builder" を意味することから、アーキテクトは技術的なリーダーシップを発揮し、プロジェクトの方向性を示す役割を担っていることがわかります。一方、デザインは "to mark out, devise" を意味することから、デザイナーは創造性を発揮し、機能性と美的感覚を兼ね備えた設計を行う役割を担っていると言えます。 382 | 383 | ``` 384 | 385 | 386 | 387 | 388 | 389 | 390 | # サードパーティ定義書 391 | - `Python開発者`= `{developer.dev_python}` 392 | - `JavaScript開発者` = `{developer.dev_javascript}` 393 | - `保険システムアーキテクト` = `{insurance_system_architect.architecture}` 394 | - `デザイナー` = `{designer.design}` 395 | - `保険ドメインエキスパート` = `{insurance_domain_expert.domain_knowledge}` 396 | - `アクチュアリー` = `{actuary.risk_analysis}` 397 | - `プロジェクトマネージャー` = `{project_manager.management}` 398 | - `品質保証エンジニア` = `{qa_engineer.quality_assurance}` 399 | - `セキュリティスペシャリスト` = `{security_specialist.security}` 400 | - `電話応対ロボット` = `{phone_robot.customer_service}` 401 | - `窓口応対ロボット` = `{counter_robot.customer_service}` 402 | 403 | # 自作定義書 404 | - `システム全体図` = `{insurance_system_architect.system_overview_diagram}` 405 | - `ユースケース図` = `{insurance_domain_expert.usecase_diagram}` 406 | - `シーケンス図` = `{insurance_system_architect.sequence_diagram}` 407 | - `ER図` = `{insurance_domain_expert.er_diagram}` 408 | ## 保険システム開発の仕様書 409 | 410 | ### 目的 411 | 本仕様書は、保険関係のシステム開発を行うにあたり、開発者、アーキテクト、デザイナー、ドメインエキスパート、アクチュアリー、プロジェクトマネージャー、品質保証エンジニア、セキュリティスペシャリスト、そしてカスタマーサービスロボットの役割と連携方法を明確にすることを目的とします。 412 | 413 | ### 成果物 414 | - 業務要件定義書 (`保険ドメインエキスパート`・`アクチュアリー`) 415 | - システム設計書 (`保険システムアーキテクト`) 416 | - ユーザーインターフェース設計書 (`デザイナー`) 417 | - ソースコード (開発者) 418 | - `Python開発者`によるバックエンドシステム 419 | - `JavaScript開発者`によるフロントエンドシステム 420 | - テスト仕様書・テスト結果報告書 (`品質保証エンジニア`) 421 | - 脆弱性診断報告書・セキュリティテスト結果報告書 (`セキュリティスペシャリスト`) 422 | - プロジェクト計画書・進捗報告書 (`プロジェクトマネージャー`) 423 | - カスタマーサービスロボット仕様書 (`電話応対ロボット`・`窓口応対ロボット`) 424 | - ユーザーマニュアル (`デザイナー`・開発者) 425 | - `システム全体図` 426 | - `ユースケース図` 427 | - `シーケンス図` 428 | - `ER図` 429 | 430 | ### 開発体制 431 | - 開発者 (Developer) 432 | - Pythonによる開発を担当: `Python開発者` 433 | - JavaScriptによる開発を担当: `JavaScript開発者` 434 | - アーキテクト (Architect): `保険システムアーキテクト` 435 | - システム全体のアーキテクチャ設計を担当 436 | - 技術的なリーダーシップを発揮し、プロジェクトの方向性を示す 437 | - デザイナー (Designer): `デザイナー` 438 | - ユーザーインターフェースのデザインを担当 439 | - 機能性と美的感覚を兼ね備えたデザインを追求する 440 | - 保険ドメインエキスパート: `保険ドメインエキスパート` 441 | - 保険業務に関する専門知識を提供 442 | - 業務要件の定義と確認を行う 443 | - アクチュアリー: `アクチュアリー` 444 | - 保険商品の設計と料率計算を担当 445 | - リスク分析とモデリングを行う 446 | - プロジェクトマネージャー: `プロジェクトマネージャー` 447 | - プロジェクト全体の管理と調整を行う 448 | - スケジュール、コスト、品質、リスクを管理する 449 | - 品質保証エンジニア: `品質保証エンジニア` 450 | - テスト計画の作成とテストの実施を担当 451 | - 品質基準の設定と品質管理を行う 452 | - セキュリティスペシャリスト: `セキュリティスペシャリスト` 453 | - セキュリティ要件の定義とセキュリティ設計を担当 454 | - 脆弱性診断とセキュリティテストを実施する 455 | - カスタマーサービスロボット: 456 | - 電話応対: `電話応対ロボット` 457 | - 窓口応対: `窓口応対ロボット` 458 | 459 | ### 開発プロセス 460 | 1. `保険ドメインエキスパート`と`アクチュアリー`が業務要件を定義する 461 | - 保険商品の仕様と料率体系を決定する 462 | 2. `保険システムアーキテクト`がシステム全体のアーキテクチャを設計する 463 | - 設計原則を定義し、全体的な構造を決定する 464 | - `セキュリティスペシャリスト`と協力し、セキュリティ要件を組み込む 465 | 3. `デザイナー`がユーザーインターフェースのデザインを行う 466 | - `保険システムアーキテクト`の設計原則に基づき、具体的なデザインを作成する 467 | 4. 開発者が`保険システムアーキテクト`の設計と`デザイナー`のデザインに基づいて開発を行う 468 | - `Python開発者`は主にバックエンドの開発を担当 469 | - `JavaScript開発者`はフロントエンドの開発を担当 470 | 5. `品質保証エンジニア`がテスト計画を作成し、テストを実施する 471 | - 単体テスト、結合テスト、システムテストを網羅的に行う 472 | 6. `セキュリティスペシャリスト`が脆弱性診断とセキュリティテストを実施する 473 | - 潜在的なセキュリティリスクを特定し、対策を講じる 474 | 7. `プロジェクトマネージャー`が各工程の進捗を管理し、問題があれば適宜調整する 475 | - スケジュール、コスト、品質、リスクを常にモニタリングする 476 | 8. `電話応対ロボット`と`窓口応対ロボット`の動作を確認する 477 | - カスタマーサービスの自動化部分をテストし、チューニングする 478 | 9. 各工程で密な連携を取り、フィードバックを行う 479 | - 定期的なミーティングを開催し、進捗状況の共有と課題の解決を図る 480 | 481 | 482 | ### 留意事項 483 | - 各工程でのコミュニケーションを密に取り、認識齟齬がないようにする 484 | - `保険ドメインエキスパート`と`アクチュアリー`の知見を活かし、業務要件を正しく理解する 485 | - `セキュリティスペシャリスト`の助言を得て、セキュリティとパフォーマンスに十分配慮し、堅牢で効率的なシステムを構築する 486 | - 変化する要件に柔軟に対応できるよう、保守性の高いコードを書く 487 | - `電話応対ロボット`と`窓口応対ロボット`の自然な対話を実現し、顧客満足度を高める 488 | 489 | 490 | -------------------------------------------------------------------------------- /docs/troubleshooting.md: -------------------------------------------------------------------------------- 1 | 2 | ### 課題 3 | 4 | | コマンド | zoltraak dev環境 | zoltraak env環境 | 5 | |---------|------|------| 6 | | Current directory: | /Users/motokidaisuke/motoki/zoltraak | /Users/motokidaisuke/aaaaa/zoltraak-env/lib/python3.11/site-packages/zoltraak | 7 | | zoltraak.\_\_file\_\_ | /Users/motokidaisuke/motoki/zoltraak/\_\_init\_\_.py | /Users/motokidaisuke/aaaaa/zoltraak-env/lib/python3.11/site-packages/zoltraak/\_\_init\_\_.py | 8 | | sys.prefix | /Users/motokidaisuke/motoki/zoltraak-dev | /Users/motokidaisuke/aaaaa/zoltraak-env | 9 | | site.getsitepackages() | ['/Users/motokidaisuke/motoki/zoltraak-dev/lib/python3.11/site-packages'] | ['/Users/motokidaisuke/aaaaa/zoltraak-env/lib/python3.11/site-packages'] | 10 | | install_paths = site.getsitepackages()
for path in install_paths:
    print(path) | /Users/motokidaisuke/motoki/zoltraak-dev/lib/python3.11/site-packages | /Users/motokidaisuke/aaaaa/zoltraak-env/lib/python3.11/site-packages | 11 | 12 | 13 | 14 | ### 解決策 15 | 16 | - zoltraak.\_\_file\_\_ を利用する 17 | -------------------------------------------------------------------------------- /docs/usage.md: -------------------------------------------------------------------------------- 1 | # Zoltraakの使い方 2 | 3 | ## インストール 4 | 1. Zoltraakをインストール 5 | ```sh 6 | pip install --upgrade zoltraak 7 | ``` 8 | 9 | - [インストールの詳細はこちら](docs/installation.md) 10 | 11 | ## 設定と準備 12 | 13 | 14 | 1. 使い方 15 | 1. `.env` ファイルに以下の環境変数を設定します。 16 | ``` 17 | ANTHROPIC_API_KEY={Anthropicのキー} 18 | ``` 19 | 2. 以下のコマンドでZoltraakをインストールします。 20 | ``` 21 | pip install zoltraak 22 | ``` 23 | 3. 以下のコマンドを実行し、プロンプトを入力します。 24 | ``` 25 | zoltraak "最新の大規模言語モデルが学べるポケモンゲームの様なシステムを作りたい" -c dev_obj 26 | ``` 27 | 28 | これにより、入力したプロンプトに基づいた要件定義書が生成されます。生成された要件定義書は叩き台となるため、必要に応じて内容を修正・拡充してください。 29 | 30 | 2. プロンプトコンパイラ(起動式)の指定 31 | `-c` オプション以降は用途に応じて変更できるプロンプトコンパイラ(起動式)を指定します。 32 | 33 | | コンパイラ名 | 説明 | 34 | | --- | --- | 35 | | dev_func | 関数型プログラミングを用いた開発タスクに関する要件定義書を生成するコンパイラ | 36 | | dev_obj | オブジェクト指向設計を用いた開発タスクに関する要件定義書を生成するコンパイラ | 37 | | biz_consult | ビジネスコンサルティングに関するドキュメントを生成するコンパイラ | 38 | | general_def | 一般的な開発タスクに関する要件定義書を生成するコンパイラ | 39 | | general_reqdef | 一般的な要求事項に関する要件定義書を生成するコンパイラ | 40 | | dev_react_fastapi | React + FastAPIを用いた開発タスクに関する要件定義書を生成するコンパイラ | 41 | 42 | 3. 具体例 43 | ```sh 44 | zoltraak "Manimを用いて、MoE(専門家の混合)モデルを視覚化するプログラムを開発する" -c dev_func 45 | zoltraak "今月中にオブジェクト指向設計を用いて、多機能在庫管理システムを開発する" -c dev_obj 46 | zoltraak "今月中に中小企業向けのビジネスコンサルティングドキュメントを作成する。具体的には、マーケティング戦略、財務管理、人材育成に関するアドバイスを含む" -c biz_consult 47 | zoltraak "今月中に教育用の拡張現実(AR)アプリケーションを開発する" -c general_def 48 | zoltraak "今月中に政府向けの少子化対策として、具体的な施策と予算案を含む提言書を執筆する" -c general_reqdef 49 | ``` 50 | 51 | 52 | 53 | 54 | 2. `test_dev_obj.md`というファイルを作成し、後続スレッドの内容をコピーして貼り付けてください。このファイルをzoltraakを実行するディレクトリと同じ階層に配置します。 55 | 56 | 3. `test_dev_obj.md`を以下のルールに従って自分の定義書生成プログラムに書き換えましょう: 57 | - `{prompt}`は zoltraakの後のプロンプト(呪文)が入るので消さないでください。 58 | - `## 2. ファイル・フォルダ構成`も消さないでください。 59 | - それ以外は自由に変更可能です。 60 | 61 | 4. 以下のコマンドを実行して、自作コンパイラを使用します: 62 | ```sh 63 | zoltraak プロンプト -cc 自作コンパイラ 64 | zoltraak "コーヒーショップ顧客管理システムを作りたい" -cc test_dev_obj.md 65 | ``` 66 | 67 | 5. `zoltraak requirements/~~~.md`が貼り付けできるようになっているはずなので実行してください。 68 | 69 | 6. ディレクトリが構築されます。Cursor、VSCodeにてopenコマンドが起動しない方は以下を参照してください: 70 | https://note.com/88gram/n/n4ead3a677b83 71 | 72 | 注意: 全てClaude3 Haikuにより実行されています(一回あたり約1円の料金がかかります。ご自身で確認ください)。 73 | 74 | 75 | ``` 76 | zoltraak book.md -p "本を書きたい" 77 | ``` 78 | 79 | ファイル作成後は以下のように何度でも書き換えることができる。 80 | ``` 81 | zoltraak book.md -p "もっと分量増やしたい" 82 | ``` 83 | 84 | ```sh 85 | # RAGに突っ込むファイル群を指定 86 | zoltraak aaaa.md -f ./input.md (作成予定) 87 | # 一括修正 88 | zoltraak dir/*.md (作成予定) 89 | ``` 90 | 91 | ![llmcomment.png](assets/images/llmcomment.png) 92 | -------------------------------------------------------------------------------- /docs/video.md: -------------------------------------------------------------------------------- 1 | # はじめに 2 | 3 | このドキュメントでは、プロンプト、ドキュメント(自然言語)、プログラム(高級言語)、システムテスト項目の4つの状態を表現し、それらの間の遷移や同期をアニメーションで示す方法について説明します。アニメーションの作成にはPythonのライブラリであるmanim(Mathematical Animation Engine)を使用します。 4 | 5 | # 各状態の表現 6 | 7 | ## テキストの作成 8 | 9 | 各状態を表すテキストを作成します。テキストには状態の名称を記載し、色とフォントサイズを指定します。プロンプトは赤色、ドキュメントは青色、プログラムは緑色、システムテスト項目はオレンジ色とします。フォントサイズは24に設定します。 10 | 11 | ## 図形の作成 12 | 13 | 各状態を表す図形を作成します。プロンプト、ドキュメント、プログラムは円形、システムテスト項目は四角形とします。初期の図形の色は白色とします。 14 | 15 | ## 図形の配置 16 | 17 | 作成した図形を横に並べます。図形間の間隔は1.5に設定します。 18 | 19 | ## テキストの配置 20 | 21 | 作成したテキストを対応する図形の上に配置します。 22 | 23 | # アニメーションの構築 24 | 25 | ## 図形とテキストの表示 26 | 27 | 作成した図形とテキストを同時に表示します。図形の表示にはアニメーションを使用し、テキストの表示には単純な表示を使用します。 28 | 29 | ## 状態遷移の表現 30 | 31 | 状態間の遷移を矢印で表現します。矢印は白色とします。 32 | 33 | 1. プロンプトからドキュメントへの遷移 34 | - プロンプトの円形を赤色に変更し、1秒間待機します。 35 | - "zoltraak document -p prompt"というコマンドを表示し、1秒間待機します。 36 | - プロンプトからドキュメントへの矢印を表示し、ドキュメントの円形を青色に変更します。 37 | - 1秒間待機します。 38 | 39 | 2. ドキュメントからプログラムへの遷移 40 | - "zoltraakdocument"というコマンドを表示し、前のコマンドを非表示にします。 41 | - ドキュメントからプログラムへの矢印を表示し、プログラムの円形を緑色に変更します。 42 | - 1秒間待機します。 43 | 44 | 3. プログラムからシステムテスト項目への遷移 45 | - プログラムからシステムテスト項目への矢印を表示し、システムテスト項目の四角形をオレンジ色に変更します。 46 | - 1秒間待機します。 47 | 48 | 4. システムテスト項目からドキュメントへの遷移 49 | - システムテスト項目からドキュメントへの矢印を表示します。矢印の位置は他の矢印より下に配置します。 50 | - 1秒間待機します。 51 | 52 | ## 同期の表現 53 | 54 | ドキュメントとプログラムの同期を表現するために、以下の手順を実行します。 55 | 56 | 1. "テスト項目を網羅されるまで、ドキュメントとプログラムの再構築が進む"というテキストを表示し、1秒間待機後に非表示にします。 57 | 58 | 2. ドキュメントとプログラムの間に双方向の黄色い矢印を表示します。 59 | 60 | 3. ドキュメントとプログラムの間に"Compile"というテキストを表示します。 61 | 62 | 4. "zoltraakdocument"というコマンドを表示し、前のコマンドを非表示にします。 63 | 64 | 5. ドキュメントが変更されたことを表現するために、ドキュメントの円形の色を薄い青色に変更し、フラッシュアニメーションを適用します。 65 | 66 | 6. プログラムが変更されたことを表現するために、プログラムの円形の色を薄い緑色に変更し、フラッシュアニメーションを適用します。これを2回繰り返します。 67 | 68 | 7. ドキュメントが再度変更されたことを表現するために、ドキュメントの円形の色を薄い青色に変更し、フラッシュアニメーションを適用します。 69 | 70 | 8. "zoltraakdocument を行うたびにシステム実行と双方の同期がチェックされる"というテキストを表示します。 71 | 72 | # まとめ 73 | 74 | このドキュメントでは、プロンプト、ドキュメント、プログラム、システムテスト項目の4つの状態とそれらの間の遷移や同期をアニメーションで表現する方法について説明しました。以下の手順でアニメーションを構築します。 75 | 76 | 1. 各状態を表すテキストと図形を作成し、適切に配置します。 77 | 2. 図形とテキストを表示します。 78 | 3. 状態間の遷移を矢印で表現します。 79 | 4. ドキュメントとプログラムの同期を双方向の矢印とフラッシュアニメーションで表現します。 80 | 81 | このアニメーションにより、システムの状態遷移と同期の流れを視覚的に理解することができます。 -------------------------------------------------------------------------------- /experiments/streaml.md: -------------------------------------------------------------------------------- 1 | `py` = [Python] 2 | 3 | 4 | `py`のstreamlitを使って 5 | 簡単なAIアプリケーションを作成したい 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /experiments/streaml1.md: -------------------------------------------------------------------------------- 1 | # 組み込み 2 | `定義書生成` = [compiler.dev_func] 3 | `設計者` = [architect.onefile] 4 | `デザイナー` = [designer.web] 5 | `開発者` = [developer.python] 6 | 7 | # 要望 8 | `py`のstreamlitを使って自然言語処理による文章の感情分析アプリを作りたい 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /pypi_update.sh: -------------------------------------------------------------------------------- 1 | # pip install wheel 2 | python setup.py sdist bdist_wheel 3 | twine upload dist/grimo-1.2.6* 4 | # git add . && git commit -m "Release v1.2.6" && git push && git tag v1.2.6 && git push --tags 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | anthropic 2 | python-dotenv 3 | pyyaml 4 | graphviz 5 | groq 6 | pyperclip 7 | pytest -------------------------------------------------------------------------------- /scripts/run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # 仮想環境の作成と有効化 6 | python -m venv venv 7 | source venv/bin/activate 8 | 9 | # 依存関係のインストール 10 | pip install -r requirements.txt 11 | 12 | # マークダウンファイルからPythonファイルを生成し、テストを実行 13 | for md_file in requirements/*.md; do 14 | py_file="generated/$(basename "${md_file%.md}").py" 15 | zoltraak"$md_file" "$py_file" 16 | 17 | # Pythonファイルの実行 18 | python "$py_file" 19 | 20 | # テストの実行 21 | test_file="tests/test_$(basename "${md_file%.md}").py" 22 | if [ -f "$test_file" ]; then 23 | python -m unittest "$test_file" 24 | else 25 | echo "Test file not found: $test_file" 26 | fi 27 | done 28 | 29 | # 仮想環境の非活性化 30 | deactivate -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name="zoltraak", 5 | version="0.1.33", 6 | packages=find_packages(), 7 | # package_dir={'': '.'}, # ここでベースディレクトリを指定 8 | install_requires=[ 9 | "openai", 10 | "anthropic", 11 | "groq", 12 | "python-dotenv", 13 | "pyperclip", 14 | "wheel", 15 | "diagrams", 16 | "google-api-python-client", # Google APIクライアントライブラリを追加 17 | "google-generativeai", # Google の生成 AI ライブラリを追加 18 | ], 19 | package_data={ 20 | '': ['*.txt', '*.md', '*.json', '*.csv', '*.yaml', '*.yml'], 21 | 'zoltraak': ['llms/*','utils/*', 'grimoires/**/*'], 22 | }, 23 | entry_points={ 24 | "console_scripts": [ 25 | "zoltraak=zoltraak.cli:main", 26 | ], 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /tests/README.md: -------------------------------------------------------------------------------- 1 | 2 | ![](https://raw.githubusercontent.com/Sunwood-ai-labs/zoltraak/celsius/assets/images/test_icon.jpeg) 3 | 4 | # テスト方法 5 | 6 | このプロジェクトでは、以下の2つの方法でテストを実行することができます。 7 | 8 | 9 | 10 | ## 1. `python`コマンドを使用したテスト 11 | 12 | `python`コマンドを使用して、テストファイルを直接実行する方法です。 13 | 14 | ```bash 15 | python tests/test_cli.py 16 | ``` 17 | 18 | この方法では、`if __name__ == '__main__':`ブロック内のコードが実行され、指定したテストクラスやテストメソッドが実行されます。テストの実行をカスタマイズしたい場合や、特定のテストクラスやテストメソッドだけを実行したい場合に適しています。 19 | 20 | ただし、この方法を使用する場合は、`if __name__ == '__main__':`ブロック内のコードを適切に設定する必要があります。 21 | 22 | ## 2. `pytest`コマンドを使用したテスト 23 | 24 | `pytest`コマンドを使用して、テストを実行する方法です。`pytest`は、テストの自動検出と実行を行うためのテストフレームワークです。 25 | 26 | ### テストクラスを指定してテストを実行 27 | 28 | ```bash 29 | pytest tests/test_cli.py::TestzoltraakCommand 30 | ``` 31 | 32 | この方法では、`TestzoltraakCommand`クラス内のすべてのテストメソッドが実行されます。 33 | 34 | ### テストメソッドを指定してテストを実行 35 | 36 | ```bash 37 | pytest tests/test_cli.py::TestzoltraakCommand::test_missing_md_file_argument 38 | pytest tests/test_cli.py::TestzoltraakCommand::test_prompt_argument 39 | pytest tests/test_cli.py::TestzoltraakCommand::test_text_input 40 | ``` 41 | 42 | この方法では、指定したテストメソッドだけが実行されます。複数のテストメソッドを指定することもできます。 43 | 44 | `pytest`コマンドを使用する場合、テストファイル内の`if __name__ == '__main__':`ブロックは実行されません。`pytest`が自動的にテストを検出し、実行します。 45 | 46 | ## テストの実行方法の選択 47 | 48 | プロジェクトの要件やテストの目的に応じて、適切なテストの実行方法を選択してください。 49 | 50 | - カスタマイズされたテストの実行が必要な場合や、特定のテストクラスやテストメソッドだけを実行したい場合は、`python`コマンドを使用したテストが適しています。 51 | - テストの自動検出と実行を行いたい場合や、テストの実行を簡単にしたい場合は、`pytest`コマンドを使用したテストが適しています。 -------------------------------------------------------------------------------- /tests/test_cli.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import sys 4 | import pprint 5 | 6 | sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 7 | sys.path.append(os.path.join(os.path.dirname(__file__), '../zoltraak')) 8 | print("===============================") 9 | pprint.pprint(sys.path) 10 | 11 | import subprocess 12 | import unittest 13 | from zoltraak.md_generator import generate_md_from_prompt, generate_response 14 | 15 | from loguru import logger 16 | 17 | class TestzoltraakCommand(unittest.TestCase): # TestzoltraakCommandクラスを定義し、unittest.TestCaseを継承します。 18 | # def test_zoltraak_command(self): 19 | # """ 20 | # zoltraakコマンドの機能をテストします。 21 | 22 | # このテストでは、以下の項目を確認します: 23 | # 1. mdファイルの引数を指定した場合、正常に実行されること。 24 | # 2. -pオプションでプロンプトを指定した場合、正常に実行されること。 25 | # 3. -cオプションでコンパイラを指定した場合、正常に実行されること。 26 | # 4. -fオプションでフォーマッタを指定した場合、正常に実行されること。 27 | # 5. --helpオプションを指定した場合、ヘルプメッセージが表示されること。 28 | # 6. --versionオプションを指定した場合、バージョン情報が表示されること。 29 | 30 | # 実行例: 31 | # - `zoltraak sample.md` : sample.mdファイルを入力として実行 32 | # - `zoltraak "サンプルテキスト" -p "サンプルプロンプト" -c compiler.md -f formatter.md` : サンプルテキストを入力として、指定したプロンプト、コンパイラ、フォーマッタを使用して実行 33 | # - `zoltraak --help` : ヘルプメッセージを表示 34 | # - `zoltraak --version` : バージョン情報を表示 35 | # """ 36 | # # mdファイルの引数を指定したテスト 37 | # result = subprocess.run(['zoltraak', 'sample.md'], capture_output=True, text=True) 38 | # self.assertEqual(result.returncode, 0) 39 | # self.assertIn("sample.md", result.stdout) 40 | 41 | # # -pオプションでプロンプトを指定したテスト 42 | # result = subprocess.run(['zoltraak', 'sample.md', '-p', 'サンプルプロンプト'], capture_output=True, text=True) 43 | # self.assertEqual(result.returncode, 0) 44 | # self.assertIn("sample.md", result.stdout) 45 | # self.assertIn("サンプルプロンプト", result.stdout) 46 | 47 | # # -cオプションでコンパイラを指定したテスト 48 | # result = subprocess.run(['zoltraak', 'sample.md', '-c', 'compiler.md'], capture_output=True, text=True) 49 | # self.assertEqual(result.returncode, 0) 50 | # self.assertIn("sample.md", result.stdout) 51 | # self.assertIn("compiler.md", result.stdout) 52 | 53 | # # -fオプションでフォーマッタを指定したテスト 54 | # result = subprocess.run(['zoltraak', 'sample.md', '-f', 'formatter.md'], capture_output=True, text=True) 55 | # self.assertEqual(result.returncode, 0) 56 | # self.assertIn("sample.md", result.stdout) 57 | # self.assertIn("formatter.md", result.stdout) 58 | 59 | # # --helpオプションを指定したテスト 60 | # result = subprocess.run(['zoltraak', '--help'], capture_output=True, text=True) 61 | # self.assertEqual(result.returncode, 0) 62 | # self.assertIn("使用方法:", result.stdout) 63 | 64 | # # --versionオプションを指定したテスト 65 | # result = subprocess.run(['zoltraak', '--version'], capture_output=True, text=True) 66 | # self.assertEqual(result.returncode, 0) 67 | # self.assertIn("zoltraak version", result.stdout) 68 | def test_missing_md_file_argument(self): # mdファイルの引数がない場合のテストメソッドを定義します. 69 | """ 70 | zoltraakコマンドをmdファイルの引数なしで実行した場合、正しいエラーメッセージが表示されることを確認します。 71 | 実行例: `zoltraak` コマンドを引数なしで実行した場合、"エラー: 入力ファイルまたはテキストが指定されていません。"というエラーメッセージが表示されるべきです。 72 | """ 73 | result = subprocess.run(['zoltraak'], capture_output=True, text=True) # zoltraakコマンドを引数なしで実行し、その結果をresultに格納します。 74 | print("STDOUT:", result.stdout) # 標準出力の内容を出力 75 | print("STDERR:", result.stderr) # 標準エラーの内容を出力 76 | 77 | self.assertEqual(result.returncode, 1) # リターンコードが1(エラー)であることを確認 78 | self.assertNotEqual(result.stdout, "") # 標準出力が空でないことを確認 79 | def test_prompt_argument(self): # プロンプト引数のテストメソッドを定義します。 80 | """ 81 | zoltraakコマンドに-pオプションでプロンプトを指定した場合、正常に実行されることを確認します。 82 | 実行例: `zoltraak calc.md -p "足し算のプログラムを書きたい"` コマンドを実行した場合、エラーが発生せずに正常に終了するはずです。 83 | """ 84 | with open("test_file.md", "w") as f: 85 | f.write("# Test File\n\nThis is a test file.") 86 | 87 | result = subprocess.run(['zoltraak', 'test_file.md', '-p', '足し算のプログラムを書きたい'], capture_output=True, text=True) # zoltraakコマンドを-pオプションでプロンプトを指定して実行し、その結果をresultに格納します。 88 | print("STDOUT:", result.stdout) # 標準出力の内容を出力 89 | print("STDERR:", result.stderr) # 標準エラーの内容を出力 90 | self.assertEqual(result.returncode, 0) # resultのリターンコードが0(正常終了)であることを確認します。 91 | self.assertEqual(result.stderr, "") # result.stderrが空文字列(エラーメッセージなし)であることを確認します。 92 | 93 | os.remove("test_file.md") 94 | 95 | def test_text_input(self): 96 | """ 97 | zoltraakコマンドにテキスト入力を与えた場合のテストメソッドを定義します。 98 | 実行例: `zoltraak "お腹減った"` コマンドを実行した場合、エラーが発生せずに正常に終了するはずです。 99 | """ 100 | result = subprocess.run(['zoltraak', 'お腹減った'], capture_output=True, text=True) # zoltraakコマンドにテキスト入力を与えて実行し、その結果をresultに格納します。 101 | print("STDOUT:", result.stdout) # 標準出力の内容を出力 102 | print("STDERR:", result.stderr) # 標準エラーの内容を出力 103 | 104 | self.assertEqual(result.returncode, 0) # resultのリターンコードが0(正常終了)であることを確認します。 105 | self.assertEqual(result.stderr, "") # result.stderrが空文字列(エラーメッセージなし)であることを確認します。 106 | self.assertIn("新しい要件定義書 'def_", result.stdout) # 標準出力に"新しい要件定義書 'def_"という文字列が含まれていることを確認します。 107 | 108 | 109 | 110 | class TestCompilerFunctionality(unittest.TestCase): # クラス名をTestCompilerFunctionalityに変更 111 | """ 112 | 各コンパイラの機能をテストするクラス 113 | 114 | このクラスでは、以下のコンパイラの機能をテストします: 115 | - biz_consult copy.md: ビジネスコンサルティングドキュメントのコピーを生成するコンパイラ 116 | - biz_consult.md: ビジネスコンサルティングドキュメントを生成するコンパイラ 117 | - dev_akirapp.md: アプリ開発の手引きを生成するコンパイラ 118 | - dev_front.md: フロントエンド開発のドキュメントを生成するコンパイラ 119 | - dev_func.md: 機能開発のドキュメントを生成するコンパイラ 120 | - dev_obj.md: オブジェクト指向設計のドキュメントを生成するコンパイラ 121 | 122 | 各テストメソッドでは、コンパイラのパス、ゴールプロンプト、期待される出力ファイルのパスを指定し、 123 | run_compiler_testメソッドを呼び出してコンパイラの機能をテストします。 124 | """ 125 | 126 | def test_biz_consult_copy_compiler(self): 127 | """ 128 | biz_consult copy.mdコンパイラの機能をテストする 129 | """ 130 | compiler_path = "biz_consult2.md" 131 | goal_prompt = "今月中にビジネスコンサルティングドキュメントを作成する" 132 | expected_md_path = "def_work_book_1.md" 133 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 134 | 135 | def test_biz_consult_compiler(self): 136 | """ 137 | biz_consult.mdコンパイラの機能をテストする 138 | """ 139 | compiler_path = "biz_consult.md" 140 | goal_prompt = "今月中にビジネスコンサルティングドキュメントを作成する" 141 | expected_md_path = "def_work_book_2.md" 142 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 143 | 144 | def test_dev_akirapp_compiler(self): 145 | """ 146 | dev_akirapp.mdコンパイラの機能をテストする 147 | """ 148 | compiler_path = "dev_akirapp.md" 149 | goal_prompt = "今月中にアプリ開発の手引きを書く" 150 | expected_md_path = "def_akirapp.md" 151 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 152 | 153 | def test_dev_front_compiler(self): 154 | """ 155 | dev_front.mdコンパイラの機能をテストする 156 | """ 157 | compiler_path = "dev_front.md" 158 | goal_prompt = "今月中にLPのフロントエンドを完成させる" 159 | expected_md_path = "def_front.md" 160 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 161 | 162 | def test_dev_func_compiler(self): 163 | """ 164 | dev_func.mdコンパイラの機能をテストする 165 | """ 166 | compiler_path = "dev_func.md" 167 | goal_prompt = "Manimを用いたMoE(Mixture of experts)のプログラムを書く" 168 | expected_md_path = "def_moe.md" 169 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 170 | 171 | def test_dev_obj_compiler(self): 172 | """ 173 | dev_obj.mdコンパイラの機能をテストする 174 | """ 175 | compiler_path = "dev_obj.md" 176 | goal_prompt = "今月中にオブジェクト指向設計を用いた在庫管理システムを開発する" 177 | expected_md_path = "def_inventory.md" 178 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 179 | 180 | def test_dev_obj_lisp_compiler(self): 181 | """ 182 | dev_obj_lisp.mdコンパイラの機能をテストする 183 | """ 184 | compiler_path = "dev_obj_lisp.md" 185 | goal_prompt = "今月中に金融リスク分析プロジェクトを完了させる" 186 | expected_md_path = "def_risk_analysis.md" 187 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 188 | 189 | def test_dev_obj_lisp_g_compiler(self): 190 | """ 191 | dev_obj_lisp_g.mdコンパイラの機能をテストする 192 | """ 193 | compiler_path = "dev_obj_lisp_g.md" 194 | goal_prompt = "今月中にジェネリックプログラミングを活用した医療データ解析基盤を構築する" 195 | expected_md_path = "def_medical_data.md" 196 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 197 | 198 | def test_dev_obj_lisp_g_base64_compiler(self): 199 | """ 200 | dev_obj_lisp_g_base64.mdコンパイラの機能をテストする 201 | """ 202 | compiler_path = "dev_obj_lisp_g_base64.md" 203 | goal_prompt = "今月中に医療企業向け機密情報管理ツールを実装する" 204 | expected_md_path = "def_confidential_info.md" 205 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 206 | 207 | def test_encode_lisp_compiler(self): 208 | """ 209 | encode_lisp.mdコンパイラの機能をテストする 210 | """ 211 | compiler_path = "encode_lisp.md" 212 | goal_prompt = "今月中に暗号化通信システムを開発する" 213 | expected_md_path = "def_encrypted_comm.md" 214 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 215 | 216 | def test_general_def_compiler(self): 217 | """ 218 | general_def.mdコンパイラの機能をテストする 219 | """ 220 | compiler_path = "general_def.md" 221 | goal_prompt = "今月中に拡張現実(AR)アプリケーションを開発する" 222 | expected_md_path = "def_ar_app.md" 223 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 224 | 225 | def test_general_reqdef_compiler(self): 226 | """ 227 | general_reqdef.mdコンパイラの機能をテストする 228 | """ 229 | compiler_path = "general_reqdef.md" 230 | goal_prompt = "今月中に政府向けの少子化対策提言書を執筆する" 231 | expected_md_path = "def_proposal.md" 232 | self.run_compiler_test(compiler_path, goal_prompt, expected_md_path) 233 | 234 | def run_compiler_test(self, compiler_path, goal_prompt, expected_md_path, setting_dir="zoltraak/grimoires"): 235 | """ 236 | 指定されたコンパイラパスとプロンプトを使用してテストを実行する 237 | """ 238 | # generate_md_from_prompt関数を呼び出し、追加の引数を渡す 239 | generate_md_from_prompt( 240 | goal_prompt=goal_prompt, 241 | target_file_path=expected_md_path, 242 | developer="anthropic", 243 | model_name="claude-3-haiku-20240307", 244 | compiler_path=f"{setting_dir}/compiler/{compiler_path}", 245 | formatter_path=f"{setting_dir}/formatter/None.md", 246 | open_file=False 247 | ) 248 | 249 | expected_md_path = "requirements/" + expected_md_path # 期待されるMDファイルのパスをrequirementsディレクトリ内に設定 250 | # 251 | self.check_generated_md_content(expected_md_path, compiler_path) # 生成されたMDファイルの内容をチェックする 252 | self.move_generated_md_to_gomi(expected_md_path, open_file=True) # 生成されたMDファイルをgomiディレクトリに移動する 253 | 254 | def check_generated_md_content(self, expected_md_path, compiler_path): 255 | """ 256 | 生成されたMDファイルの内容を確認する 257 | """ 258 | with open(expected_md_path, 'r', encoding='utf-8') as f: 259 | generated_content = f.read() 260 | self.assertGreater(len(generated_content), 0, f"生成されたMDファイルが空です。 コンパイラパス: {compiler_path}") 261 | 262 | def move_generated_md_to_gomi(self, expected_md_path, open_file=False): 263 | """ 264 | テスト後に生成されたMDファイルをgomiディレクトリに移動する 265 | 266 | Args: 267 | expected_md_path (str): 移動対象のMDファイルのパス 268 | open_file (bool): ファイルを開くかどうかのフラグ(デフォルトはFalse) 269 | """ 270 | import datetime 271 | timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") 272 | gomi_dir = "gomi" 273 | if not os.path.exists(gomi_dir): 274 | os.makedirs(gomi_dir) 275 | new_file_path = os.path.join(gomi_dir, f"{timestamp}_{os.path.basename(expected_md_path)}") 276 | os.rename(expected_md_path, new_file_path) 277 | 278 | if open_file: # open_fileフラグがTrueの場合 279 | os.system(f"code {new_file_path}") # ファイルを開く(VSCodeにおける`code syllabus_graph.png`に相当) 280 | 281 | 282 | class TestGenerateResponse(unittest.TestCase): 283 | def test_generate_response_anthropic(self): 284 | """ 285 | Anthropicのモデルを使用してgenerate_response関数をテストする 286 | """ 287 | anthropic_models = [ 288 | "claude-3-opus-20240229", 289 | "claude-3-haiku-20240307", 290 | "claude-3-sonnet-20240229" 291 | ] 292 | prompt = "これはテストプロンプトです。" 293 | 294 | for model_name in anthropic_models: 295 | response = generate_response("anthropic", model_name, prompt) 296 | print(f"{model_name}からの応答: {response}") # 応答内容を出力 297 | self.assertIsInstance(response, str, f"{model_name}からの応答が文字列ではありません") 298 | self.assertGreater(len(response), 0, f"{model_name}からの応答が空です") 299 | 300 | def test_generate_response_groq(self): 301 | """ 302 | Groqのモデルを使用してgenerate_response関数をテストする 303 | """ 304 | 305 | groq_models = [ 306 | "llama3-8b-8192", 307 | "llama3-70b-8192", 308 | "llama2-70b-4096", 309 | "mixtral-8x7b-32768", 310 | "gemma-7b-it" 311 | ] 312 | prompt = "これはテストプロンプトです。" 313 | 314 | for model_name in groq_models: 315 | response = generate_response("groq", model_name, prompt) 316 | print(f"{model_name}からの応答: {response}") # 応答内容を出力 317 | self.assertIsInstance(response, str, f"{model_name}からの応答が文字列ではありません") 318 | self.assertGreater(len(response), 0, f"{model_name}からの応答が空です") 319 | 320 | def test_generate_response_invalid_developer(self): 321 | """ 322 | サポートされていないデベロッパーを指定した場合のgenerate_response関数のテスト 323 | """ 324 | with self.assertRaises(ValueError): 325 | generate_response("invalid_developer", "model_name", "prompt") 326 | 327 | 328 | 329 | if __name__ == '__main__': # このスクリプトが直接実行された場合にのみ、以下のコードを実行します。 330 | # 全部を実行します 331 | unittest.main() # unittestのmain関数を呼び出し、テストを実行します。 332 | -------------------------------------------------------------------------------- /tests/test_converter.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dai-motoki/zoltraak/4dce44df3fb2cd24822aecea941d15bd914c6374/tests/test_converter.py -------------------------------------------------------------------------------- /tests/test_llms.py: -------------------------------------------------------------------------------- 1 | import zoltraak.llms.claude as claude 2 | 3 | def test_generate_response(): 4 | """ 5 | generate_response関数のテスト 6 | """ 7 | model = "claude-3-haiku-20240307" 8 | prompt = "今日の晩御飯を提案して" 9 | max_tokens = 100 10 | temperature = 0.8 11 | 12 | response = claude.generate_response(model, prompt, max_tokens, temperature) 13 | 14 | # レスポンスが文字列であることを確認 15 | assert isinstance(response, str) 16 | 17 | 18 | # レスポンスが空でないことを確認 19 | assert response.strip() != "" 20 | -------------------------------------------------------------------------------- /tests/test_minimal.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import subprocess 3 | 4 | class MinimumTestCase(unittest.TestCase): 5 | def test_zoltraak_only(self): 6 | """ 7 | zoltraakコマンドをmdファイルの引数なしで実行した場合、正しいエラーメッセージが表示されることを確認します。 8 | 実行例: `zoltraak` コマンドを引数なしで実行した場合、"エラー: 入力ファイルまたはテキストが指定されていません。"というエラーメッセージが表示されるべきです。 9 | """ 10 | result = subprocess.run(['zoltraak'], capture_output=True, text=True) # zoltraakコマンドを引数なしで実行し、その結果をresultに格納します。 11 | print("STDOUT:", result.stdout) # 標準出力の内容を出力 12 | print("STDERR:", result.stderr) # 標準エラーの内容を出力 13 | self.assertIn("エラー: 入力ファイルまたはテキストが指定されていません。", result.stdout) # エラーメッセージは標準エラー出力に含まれているはずなので、result.stderrをチェックするように修正 14 | 15 | # def test_zoltraak_with_compiler(self): 16 | # """zoltraak "〜したい" -cコマンドのテスト""" 17 | # result = subprocess.run(["zoltraak", "テストしたい", "-c", "コンパイラ"], capture_output=True, text=True) 18 | # self.assertEqual(result.returncode, 0) 19 | # self.assertIn("コンパイル結果", result.stdout) 20 | 21 | # def test_zoltraak_without_compiler(self): 22 | # """zoltraak "〜したい" -cコマンド(コンパイラなし)のテスト""" 23 | # result = subprocess.run(["zoltraak", "テストしたい", "-c"], capture_output=True, text=True) 24 | # self.assertNotEqual(result.returncode, 0) 25 | # self.assertIn("エラー: 入力ファイルまたはテキストが指定されていません。", result.stderr) 26 | 27 | # def test_zoltraak_with_custom_compiler(self): 28 | # """zoltraak "〜したい" -cc自作コンパイラのテスト""" 29 | # result = subprocess.run(["zoltraak", "テストしたい", "-cc", "自作コンパイラ"], capture_output=True, text=True) 30 | # self.assertEqual(result.returncode, 0) 31 | # self.assertIn("自作コンパイラの結果", result.stdout) -------------------------------------------------------------------------------- /tests/test_sample.py: -------------------------------------------------------------------------------- 1 | def test_example(): 2 | assert True 3 | -------------------------------------------------------------------------------- /update_and_upload.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # echo "##active_line2##" 3 | 4 | # echo "##active_line3##" 5 | # echo "バージョンをアップデート中..." 6 | # echo "##active_line4##" 7 | # python update_version.py 8 | # echo "##active_line5##" 9 | 10 | echo "##active_line6##" 11 | echo "パッケージをビルド中..." 12 | echo "##active_line7##" 13 | python setup.py sdist bdist_wheel 14 | echo "##active_line8##" 15 | 16 | echo "##active_line9##" 17 | echo "ビルドしたパッケージをPyPIにアップロード中..." 18 | echo "##active_line10##" 19 | twine upload dist/* 20 | -------------------------------------------------------------------------------- /update_version.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | with open('setup.py', 'r') as file: 4 | content = file.read() 5 | start = content.find('version="') + 9 6 | end = content.find('",', start) 7 | current_version = content[start:end] 8 | 9 | parts = current_version.split('.') 10 | parts[-1] = str(int(parts[-1]) + 1) 11 | new_version = '.'.join(parts) 12 | 13 | updated_content = content.replace(current_version, new_version) 14 | 15 | with open('setup.py', 'w') as file: 16 | file.write(updated_content) 17 | -------------------------------------------------------------------------------- /zoltraak/__init__.py: -------------------------------------------------------------------------------- 1 | import pkg_resources 2 | 3 | try: 4 | __version__ = pkg_resources.get_distribution('zoltraak').version 5 | except pkg_resources.DistributionNotFound: 6 | __version__ = 'unknown' -------------------------------------------------------------------------------- /zoltraak/cli.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import os 3 | import os.path 4 | import zoltraak 5 | 6 | current_directory = os.path.dirname(os.path.abspath(__file__)) 7 | # print(package_dir) 8 | # from zoltraak.md_generator import generate_md_from_prompt 9 | from zoltraak.converter import MarkdownToPythonConverter 10 | import zoltraak.llms.claude as claude 11 | 12 | 13 | def main(): 14 | current_dir = os.getcwd() 15 | package_dir = os.path.dirname(os.path.abspath(__file__)) 16 | 17 | parser = argparse.ArgumentParser(description="MarkdownファイルをPythonファイルに変換します") 18 | parser.add_argument("input", help="変換対象のMarkdownファイルのパスまたはテキスト", nargs='?') 19 | parser.add_argument("--output-dir", help="生成されたPythonファイルの出力ディレクトリ", default="generated") 20 | parser.add_argument("-p", "--prompt", help="追加のプロンプト情報", default=None) 21 | parser.add_argument("-c", "--compiler", help="コンパイラー(要件定義書のテンプレート)") 22 | parser.add_argument("-f", "--formatter", help="コードフォーマッター", default="md_comment") 23 | parser.add_argument("-cc", "--custom-compiler", help="自作コンパイラー(自作定義書生成文書)") 24 | parser.add_argument("-v", "--version", action="store_true", help="バージョン情報を表示") # 追加: バージョン情報表示オプション 25 | parser.add_argument("-l", "--language", help="出力言語を指定", default=None) # 追加: 汎用言語指定オプション 26 | args = parser.parse_args() 27 | 28 | if args.version: # バージョン情報表示オプションが指定された場合 29 | show_version_and_exit() # - バージョン情報を表示して終了 30 | 31 | if args.input is None: # 入力ファイルまたはテキストが指定されていない場合 32 | show_usage_and_exit() # - 使用方法を表示して終了 33 | 34 | if args.input.endswith(".md") or os.path.isfile(args.input) or os.path.isdir( 35 | args.input 36 | ): # 入力がMarkdownファイル、ファイル、またはディレクトリの場合 37 | # print(args.input) 38 | # print("mo") 39 | if args.compiler is None and args.custom_compiler is None: # -- コンパイラーが指定されていない場合 40 | args.compiler = "dev_obj" # --- デフォルトのコンパイラー(general_def)を使用 41 | elif args.compiler and args.custom_compiler: # -- デフォルトのコンパイラーとカスタムコンパイラーの両方が指定されている場合 42 | show_compiler_conflict_error_and_exit() # --- コンパイラー競合エラーを表示して終了 43 | 44 | process_markdown_file(args) # - Markdownファイルを処理する関数を呼び出す 45 | else: # 入力がテキストの場合 46 | if args.compiler and args.custom_compiler: # -- デフォルトのコンパイラーとカスタムコンパイラーの両方が指定されている場合 47 | show_compiler_conflict_error_and_exit() # --- コンパイラー競合エラーを表示して終了 48 | 49 | process_text_input(args) # - テキスト入力を処理する関数を呼び出す 50 | 51 | 52 | def show_version_and_exit(): 53 | print(f"zoltraak version {zoltraak.__version__}") 54 | exit(0) 55 | 56 | def show_usage_and_exit(): 57 | print("\033[31mエラー: 入力ファイルまたはテキストが指定されていません。\033[0m") 58 | print("\033[92m使用方法: zoltraak [オプション]\033[0m") 59 | print("\033[33m例1:\033[0m zoltraak calc.md -p \"ドローンを用いた競技システムを考える\" -c dev_obj") 60 | print(" 説明: calc.mdファイルを入力とし、ドローンを用いた競技システムの要件定義書を生成します。") 61 | print(" オブジェクト指向設計のコンパイラー(dev_obj)を使用します。") 62 | print("\033[33m例2:\033[0m zoltraak \"タクシーの経営課題を解決するための戦略ドキュメントを作成する\" -c biz_consult") 63 | print(" 説明: プロンプトテキストを入力とし、タクシー会社の経営課題解決のための戦略ドキュメントを生成します。") 64 | print(" ビジネスコンサルティング用のコンパイラー(biz_consult)を使用します。") 65 | print("\033[33m例3:\033[0m zoltraak \"レストランの予約管理システムの要件定義書\" -cc custom_compiler.md") 66 | print(" 説明: プロンプトテキストを入力とし、レストランの予約管理システムの要件定義書を生成します。") 67 | print(" カスタムコンパイラー(custom_compiler.md)を使用します。") 68 | exit(1) 69 | 70 | def show_compiler_error_and_exit(): 71 | print("\033[31mエラー: コンパイラーが指定されていません。\033[0m") 72 | print("-c オプションでデフォルトのコンパイラーを指定するか、") 73 | print("-cc オプションで自作のコンパイラー(要件定義書のテンプレート)のファイルパスを指定してください。") 74 | print("\033[92mデフォルトのコンパイラー:\033[0m") 75 | print("\033[33m- dev_obj: オブジェクト指向設計を用いた開発タスクに関する要件定義書を生成するコンパイラ\033[0m") 76 | print(" 説明: オブジェクト指向の原則に基づいて、開発タスクの要件定義書を生成します。クラス図、シーケンス図、ユースケースなどを含みます。") 77 | print("\033[33m- dev_func: 関数型プログラミングを用いた開発タスクに関する要件定義書を生成するコンパイラ\033[0m") 78 | print(" 説明: 関数型プログラミングの原則に基づいて、開発タスクの要件定義書を生成します。純粋関数、不変性、高階関数などの概念を取り入れます。") 79 | print("\033[33m- biz_consult: ビジネスコンサルティングに関するドキュメントを生成するコンパイラ\033[0m") 80 | print(" 説明: 企業の課題解決や戦略立案のためのコンサルティングドキュメントを生成します。市場分析、SWOT分析、アクションプランなどを含みます。") 81 | print("\033[33m- general_def: 一般的な開発タスクに関する要件定義書を生成するコンパイラ\033[0m") 82 | print(" 説明: 様々な開発タスクに対応した汎用的な要件定義書を生成します。システムの目的、機能要件、非機能要件などを網羅します。") 83 | print("\033[33m- general_reqdef: 一般的な要求事項に関する要件定義書を生成するコンパイラ\033[0m") 84 | print(" 説明: システム開発以外の一般的な要求事項について、要件定義書を生成します。プロジェクトの目標、スコープ、制約条件などを明確にします。") 85 | exit(1) 86 | 87 | def show_compiler_conflict_error_and_exit(): 88 | print("\033[31mエラー: -c オプションと -cc オプションは同時に指定できません。\033[0m") 89 | exit(1) 90 | 91 | def process_markdown_file(args): 92 | """ 93 | Markdownファイルを処理する 94 | """ 95 | 96 | md_file_path = args.input # 入力されたMarkdownファイルのパスを取得 97 | output_dir = os.path.abspath(args.output_dir) # 出力ディレクトリの絶対パスを取得 98 | prompt = args.prompt # プロンプトを取得 99 | 100 | zoltraak_dir = os.path.dirname(zoltraak.__file__) # zoltraakパッケージのディレクトリパスを取得 101 | 102 | if args.custom_compiler: # カスタムコンパイラーが指定されている場合 103 | compiler_path = get_custom_compiler_path(args.custom_compiler) # - カスタムコンパイラーのパスを取得 104 | else: # カスタムコンパイラーが指定されていない場合 105 | compiler_path = ( # - デフォルトコンパイラーのパスを設定 106 | None # -- コンパイラーが"None"の場合はNoneに設定 107 | if args.compiler == "None" 108 | else os.path.join( # -- それ以外の場合はzoltraakディレクトリ内のパスを設定 109 | zoltraak_dir, 110 | "grimoires/compiler", 111 | args.compiler + ("" if args.compiler.endswith(".md") else ".md"), 112 | ) 113 | ) 114 | # print(f"デフォルトコンパイラーのパス: {compiler_path}") # - デフォルトコンパイラーのパスを表示 115 | 116 | if compiler_path is not None and not os.path.exists(compiler_path): 117 | print(f"\033[31mファイル「{compiler_path}」が存在しないため検索モードに切り替わります。\033[0m") 118 | compiler_path = None 119 | 120 | 121 | formatter_path = os.path.join( # フォーマッタのパスを設定 122 | zoltraak_dir, # - zoltraakディレクトリ内のパスを設定 123 | "grimoires/formatter", 124 | args.formatter + ("" if args.formatter.endswith(".md") else ".md"), 125 | ) 126 | # print("compiler_path:", compiler_path) # コンパイラーのパスを表示 127 | # print("formatter_path:", formatter_path) # フォーマッタのパスを表示 128 | 129 | language = None if args.language is None else args.language # 汎用言語指定 130 | print("language:", args.language) 131 | 132 | md_file_rel_path = os.path.relpath(md_file_path, os.getcwd()) # 現在のワーキングディレクトリからの相対パスを取得 133 | py_file_rel_path = os.path.splitext(md_file_rel_path)[0] + ".py" # Markdownファイルの拡張子を.pyに変更 134 | py_file_path = os.path.join(output_dir, py_file_rel_path) # 出力ディレクトリとPythonファイルの相対パスを結合 135 | 136 | 137 | mtp = MarkdownToPythonConverter(md_file_path, py_file_path, 138 | prompt, compiler_path, formatter_path, language) 139 | os.makedirs(os.path.dirname(py_file_path), exist_ok=True) # Pythonファイルの出力ディレクトリを作成(既に存在する場合は何もしない) 140 | mtp.convert() 141 | 142 | # convert_md_to_py( # MarkdownファイルをPythonファイルに変換 143 | # md_file_path, # - 入力Markdownファイルのパス 144 | # py_file_path, # - 出力Pythonファイルのパス 145 | # prompt, # - プロンプト 146 | # compiler_path, # - コンパイラーのパス 147 | # formatter_path, # - フォーマッタのパス 148 | # language # - 汎用言語指定 149 | # ) 150 | 151 | def get_custom_compiler_path(custom_compiler): 152 | compiler_path = os.path.abspath(custom_compiler) 153 | if not os.path.exists(compiler_path): 154 | print(f"\033[31mエラー: 指定されたカスタムコンパイラーのファイル '{compiler_path}' が存在しません。\033[0m") 155 | print("\033[33m以下の点を確認してください:\033[0m") 156 | print("1. ファイルが指定されたパスに存在することを確認してください。") 157 | print("2. カスタムコンパイラーのファイルパスが正しいことを確認してください。") 158 | print("3. ファイル名の拡張子が '.md' であることを確認してください。") 159 | print("4. ファイルの読み取り権限があることを確認してください。") 160 | # print(f"カスタムコンパイラー: {compiler_path}") 161 | return compiler_path 162 | 163 | def process_text_input(args): 164 | text = args.input 165 | md_file_path = generate_md_file_name(text) 166 | # print(f"新しい要件定義書 '{md_file_path}' が生成されました。") 167 | prompt = f"{text}" 168 | 169 | if args.custom_compiler: 170 | os.system(f"zoltraak {md_file_path} -p \"{prompt}\" -cc {args.custom_compiler} -f {args.formatter} -l {args.language}") 171 | else: 172 | os.system(f"zoltraak {md_file_path} -p \"{prompt}\" -c {args.compiler} -f {args.formatter} -l {args.language}") 173 | 174 | def generate_md_file_name(prompt): 175 | # promptからファイル名を生成するためにgenerate_response関数を利用 176 | 177 | # requirementsディレクトリが存在しない場合は作成する 178 | requirements_dir = "requirements" 179 | if not os.path.exists(requirements_dir): 180 | os.makedirs(requirements_dir) 181 | 182 | # zoltraak/requirements/内のファイル名を全て取得 183 | existing_files = [file for file in os.listdir(requirements_dir) if file.startswith("def_")] 184 | 185 | # print("existing_files:", existing_files) 186 | 187 | # 既存のファイル名と被らないようにファイル名を生成するプロンプトを作成 188 | file_name_prompt = f"{prompt}に基づいて、要件定義書のファイル名をdef_hogehoge.mdの形式で提案してください。\n" 189 | file_name_prompt += f"ただし、以下の既存のファイル名と被らないようにしてください。\n{', '.join(existing_files)}\n" 190 | file_name_prompt += "ファイル名のみをアウトプットしてください。\n" 191 | # print("file_name_prompt:", file_name_prompt) 192 | response = claude.generate_response("claude-3-haiku-20240307",file_name_prompt, 100, 0.7) 193 | file_name = response.strip() 194 | return f"{file_name}" 195 | -------------------------------------------------------------------------------- /zoltraak/converter.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | import anthropic 3 | import os 4 | import hashlib 5 | from dotenv import load_dotenv 6 | from zoltraak.md_generator import generate_md_from_prompt 7 | import zoltraak 8 | 9 | import zoltraak.settings 10 | import zoltraak.llms.claude as claude 11 | from zoltraak.gencode import TargetCodeGenerator 12 | 13 | 14 | class MarkdownToPythonConverter: 15 | def __init__(self, md_file_path, py_file_path, prompt=None, compiler_path=None, formatter_path=None, language=None): 16 | self.md_file_path = md_file_path 17 | self.py_file_path = py_file_path 18 | self.prompt = prompt 19 | self.compiler_path = compiler_path 20 | self.formatter_path = formatter_path 21 | self.language = language 22 | self.client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) 23 | 24 | def convert(self): 25 | if self.prompt is None: # プロンプトが指定されていない場合 26 | self.source_file_path = self.md_file_path # - ソースファイルパスをマークダウンファイルパスに設定 27 | self.target_file_path = self.py_file_path # - ターゲットファイルパスをPythonファイルパスに設定 28 | self.past_source_folder = "past_md_files" # - 過去のソースフォルダを "past_md_files" に設定 29 | else: # プロンプトが指定されている場合 30 | self.source_file_path = self.md_file_path # - ソースファイルパスをマークダウンファイルパスに設定 31 | self.target_file_path = self.md_file_path # - ターゲットファイルパスをマークダウンファイルパスに設定 32 | self.past_source_folder = "past_prompt_files" # - 過去のソースフォルダを "past_prompt_files" に設定 33 | 34 | if os.path.exists(self.md_file_path): # -- マークダウンファイルが存在する場合 35 | print(f"{self.md_file_path}は既存のファイルです。promptに従って変更を提案します。") # --- ファイルが既存であることを示すメッセージを表示 36 | self.propose_target_diff(self.target_file_path, self.prompt) # --- プロンプトに従ってターゲットファイルの差分を提案 37 | return # --- 関数を終了 38 | 39 | if os.path.exists(self.source_file_path): # ソースファイルが存在する場合 40 | self.source_hash = self.calculate_file_hash(self.source_file_path) # - ソースファイルのハッシュ値を計算 41 | os.makedirs(self.past_source_folder, exist_ok=True) # - 過去のソースフォルダを作成(既存の場合はスキップ) 42 | self.past_source_file_path = os.path.join( 43 | self.past_source_folder, os.path.basename(self.source_file_path)) # - 過去のソースファイルパスを設定 44 | 45 | if os.path.exists(self.target_file_path): # ターゲットファイルが存在する場合 46 | self.handle_existing_target_file() # - 既存のターゲットファイルを処理 47 | else: # ターゲットファイルが存在しない場合 48 | self.handle_new_target_file() # - 新しいターゲットファイルを処理 49 | 50 | def calculate_file_hash(self, file_path): 51 | with open(file_path, "rb") as file: 52 | content = file.read() 53 | return hashlib.md5(content).hexdigest() 54 | 55 | def handle_existing_target_file(self): 56 | with open(self.target_file_path, "r", encoding="utf-8") as target_file: 57 | lines = target_file.readlines() 58 | if len(lines) > 0 and lines[-1].startswith("# HASH: "): 59 | embedded_hash = lines[-1].split("# HASH: ")[1].strip() 60 | if self.source_hash == embedded_hash: 61 | if self.prompt is None: 62 | subprocess.run(["python", self.target_file_path]) 63 | else: 64 | with open(self.target_file_path, "r", encoding="utf-8") as md_file: 65 | md_content = md_file.read() 66 | return md_content 67 | else: 68 | print(f"{self.source_file_path}の変更を検知しました。") 69 | print("ソースファイルの差分:") 70 | if os.path.exists(self.past_source_file_path): 71 | self.display_source_diff() 72 | 73 | def display_source_diff(self): 74 | import difflib 75 | with open(self.past_source_file_path, "r", encoding="utf-8") as old_source_file: 76 | old_source_lines = old_source_file.readlines() 77 | with open(self.source_file_path, "r", encoding="utf-8") as new_source_file: 78 | new_source_lines = new_source_file.readlines() 79 | 80 | source_diff = difflib.unified_diff(old_source_lines, new_source_lines, lineterm='', n=0) 81 | source_diff_text = ''.join(source_diff) 82 | print(source_diff_text) 83 | 84 | if self.prompt is not None: 85 | self.propose_target_diff(self.target_file_path, self.prompt) 86 | print(f"ターゲットファイル: {self.target_file_path}") 87 | input("修正が完了したらEnterキーを押してください。") 88 | else: 89 | self.handle_target_file_modification() 90 | 91 | def handle_new_target_file(self): 92 | if self.prompt is None: 93 | print(f""" 94 | 高級言語コンパイル中: {self.target_file_path}は新しいファイルです。少々お時間をいただきます。 95 | {self.source_file_path} -> {self.target_file_path} 96 | """) 97 | target = TargetCodeGenerator(self.source_file_path, self.target_file_path, self.past_source_file_path, self.source_hash) 98 | target.generate_target_code() 99 | else: 100 | print(f""" 101 | {"検索結果生成中" if self.compiler_path is None else "要件定義書執筆中"}: {self.target_file_path}は新しいファイルです。少々お時間をいただきます。 102 | """) 103 | generate_md_from_prompt( 104 | self.prompt, 105 | self.target_file_path, 106 | developer="anthropic", 107 | model_name="claude-3-haiku-20240307", 108 | # model_name="claude-3-opus-20240229", 109 | compiler_path=self.compiler_path, 110 | formatter_path=self.formatter_path, 111 | language=self.language, 112 | open_file=True 113 | ) 114 | 115 | def propose_target_diff(self, target_file_path, prompt): 116 | """ 117 | ターゲットファイルの変更差分を提案する関数 118 | 119 | Args: 120 | target_file_path (str): 現在のターゲットファイルのパス 121 | prompt (str): promptの内容 122 | """ 123 | # プロンプトにターゲットファイルの内容を変数として追加 124 | with open(target_file_path, "r", encoding="utf-8") as target_file: 125 | current_target_code = target_file.read() 126 | 127 | prompt = f''' 128 | 現在のターゲットファイルの内容: 129 | {current_target_code} 130 | 上記からpromptの内容: 131 | {prompt} 132 | をもとに、 133 | 134 | ターゲットファイルの変更が必要な部分"のみ"をプログラムで出力してください。 135 | 出力はunified diff形式で、削除した文を薄い赤色、追加した文を薄い緑色にして 136 | 137 | @@ -1,4 +1,4 @@ 138 | line1 139 | -line2 140 | +line2 modified 141 | line3 142 | -line4 143 | +line4 modified 144 | 145 | ''' 146 | response = self.client.messages.create( 147 | model="claude-3-opus-20240229", 148 | max_tokens=1000, 149 | temperature=0.0, 150 | system="You are a programmer.", 151 | messages=[ 152 | {"role": "user", "content": prompt} 153 | ] 154 | ) 155 | target_diff = response.content[0].text.strip() 156 | # ターゲットファイルの差分を表示 157 | print("ターゲットファイルの差分:") 158 | print(target_diff) 159 | 160 | # ユーザーに適用方法を尋ねる 161 | print("差分をどのように適用しますか?") 162 | print("1. AIで適用する") 163 | print("2. 自分で行う") 164 | print("3. 何もせず閉じる") 165 | choice = input("選択してください (1, 2, 3): ") 166 | 167 | while True: 168 | if choice == '1': 169 | # 差分をターゲットファイルに自動で適用 170 | self.apply_diff_to_target_file(target_file_path, target_diff) 171 | print(f"{target_file_path}に差分を自動で適用しました。") 172 | break 173 | elif choice == '2': 174 | print("手動で差分を適用してください。") 175 | break 176 | elif choice == '3': 177 | print("操作をキャンセルしました。") 178 | break 179 | else: 180 | print("無効な選択です。もう一度選択してください。") 181 | print("1. 自動で適用する") 182 | print("2. エディタで行う") 183 | print("3. 何もせず閉じる") 184 | choice = input("選択してください (1, 2, 3): ") 185 | 186 | def apply_diff_to_target_file(self, target_file_path, target_diff): 187 | """ 188 | 提案された差分をターゲットファイルに適用する関数 189 | 190 | Args: 191 | target_file_path (str): ターゲットファイルのパス 192 | target_diff (str): 適用する差分 193 | """ 194 | # ターゲットファイルの現在の内容を読み込む 195 | with open(target_file_path, "r", encoding="utf-8") as file: 196 | current_content = file.read() 197 | 198 | # プロンプトを作成してAPIに送信し、修正された内容を取得 199 | prompt = f''' 200 | 現在のターゲットファイルの内容: 201 | {current_content} 202 | 上記のターゲットファイルの内容に対して、以下のUnified diff 適用後のターゲットファイルの内容を生成してください。 203 | 204 | 提案された差分: 205 | {target_diff} 206 | 207 | 例) 208 | 変更前 209 | - graph.node(week_node_name, shape='box', style='filled', fillcolor='#FFCCCC') 210 | 211 | 変更後 212 | + graph.node(week_node_name, shape='box', style='filled', fillcolor='#CCCCFF') 213 | 214 | 番号など変わった場合は振り直しもお願いします。 215 | ''' 216 | modified_content = claude.generate_response("claude-3-sonnet-20240229", prompt, 2000, 0.3) 217 | 218 | # 修正後の内容をターゲットファイルに書き込む 219 | with open(target_file_path, "w", encoding="utf-8") as file: 220 | file.write(modified_content) 221 | 222 | print(f"{target_file_path}に修正を適用しました。") 223 | -------------------------------------------------------------------------------- /zoltraak/gencode.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import subprocess 4 | import zoltraak 5 | import zoltraak.llms.claude as claude 6 | import zoltraak.llms.gemini as gemini 7 | from zoltraak.utils.prompt_import import load_prompt 8 | from zoltraak.llms.claude import generate_response 9 | class TargetCodeGenerator: 10 | def __init__(self, source_file_path, target_file_path, past_source_file_path, source_hash): 11 | self.source_file_path = source_file_path 12 | self.target_file_path = target_file_path 13 | self.past_source_file_path = past_source_file_path 14 | self.source_hash = source_hash 15 | 16 | def generate_target_code(self): 17 | """ 18 | ソースファイルからターゲットファイルを生成するメソッド 19 | """ 20 | # 1. 準備 21 | create_domain_grimoire, target_dir = self.prepare_generation() 22 | 23 | # 2. ソースファイルの読み込みと変数の作成 24 | source_content, source_file_name, variables = self.load_source_and_create_variables() 25 | 26 | # 3. プロンプトの読み込みとコード生成 27 | prompt, code = self.load_prompt_and_generate_code(create_domain_grimoire, variables) 28 | 29 | # 4. 生成されたコードの処理 30 | self.process_generated_code(code) 31 | 32 | # 5. 結果の出力 33 | self.output_results() 34 | 35 | def prepare_generation(self, step_n=2): 36 | """ 37 | ターゲットコード生成の準備を行うメソッド 38 | 39 | Args: 40 | step_n (int): ステップ番号。デフォルトは2。 41 | """ 42 | create_domain_grimoire = "grimoires/architect/architect_claude.md" # 領域術式(要件定義書)のパスを指定 43 | target_dir = ( # target_file_pathからdevと.mdを省いて、generated/ の下につなげたものをtarget_dirに設定 44 | f"generated/{os.path.splitext(os.path.basename(self.target_file_path))[0]}" 45 | ) 46 | 47 | if step_n == 2: 48 | self.print_step2_info(create_domain_grimoire, target_dir) # ステップ2の情報を出力 49 | elif step_n == 3: 50 | self.print_step3_info(target_dir) # ステップ3の情報を出力 51 | 52 | if self.past_source_file_path is not None: # 過去のソースファイルパスが指定されている場合 53 | self.save_current_source_as_past() # - 現在のソースファイルを過去のソースファイルとして保存 54 | 55 | return create_domain_grimoire, target_dir 56 | 57 | def print_step2_info(self, create_domain_grimoire, target_dir): 58 | """ 59 | ステップ2の情報を出力するメソッド 60 | """ 61 | print( 62 | f""" 63 | 64 | ============================================================== 65 | ステップ2. 魔法術式を用いて領域術式を実行する 66 | \033[32m領域術式\033[0m : {create_domain_grimoire} 67 | \033[32m実行術式\033[0m : {self.target_file_path} 68 | \033[32m領域対象\033[0m (ディレクトリパス) : {target_dir} 69 | ============================================================== 70 | """ 71 | ) 72 | 73 | def print_step3_info(self, target_dir): 74 | """ 75 | ステップ3の情報を出力するメソッド 76 | """ 77 | print( 78 | f""" 79 | 80 | ============================================================== 81 | ステップ3. 展開術式を実行する 82 | \033[32m展開対象\033[0m (ディレクトリパス) : {target_dir} 83 | ============================================================== 84 | """ 85 | ) 86 | def load_source_and_create_variables(self): 87 | """ 88 | ソースファイルの読み込みと変数の作成を行うメソッド 89 | """ 90 | source_content = self.read_source_file() # ソースファイルの内容を読み込む 91 | source_file_name = self.get_source_file_name() # ソースファイルのファイル名(拡張子なし)を取得 92 | variables = self.create_variables_dict(source_content, source_file_name) # 変数の辞書を作成 93 | 94 | return source_content, source_file_name, variables 95 | 96 | def load_prompt_and_generate_code(self, create_domain_grimoire, variables): 97 | """ 98 | プロンプトの読み込みとコード生成を行うメソッド 99 | """ 100 | prompt = self.load_prompt_with_variables(create_domain_grimoire, variables) # 領域術式(要件定義書)からプロンプトを読み込み、変数を埋め込む 101 | print(prompt) 102 | code = self.generate_code_with_claude(prompt) # Claudeを使用してコードを生成 103 | # print(code) 104 | 105 | return prompt, code 106 | 107 | def process_generated_code(self, code): 108 | """ 109 | 生成されたコードの処理を行うメソッド 110 | """ 111 | self.write_code_to_target_file(code) # 生成されたコードをターゲットファイルに書き込む 112 | 113 | if self.source_hash is not None: # ソースファイルのハッシュ値が指定されている場合 114 | self.append_source_hash_to_target_file() # - ソースファイルのハッシュ値をターゲットファイルに追記 115 | 116 | if self.target_file_path.endswith(".py"): # ターゲットファイルがPythonファイルの場合 117 | self.try_execute_generated_code(code) # - 生成されたコードを実行 118 | else: # ターゲットファイルがマークダウンファイルの場合 119 | return code # - 生成されたコードを返す 120 | 121 | def output_results(self): 122 | """ 123 | 結果の出力を行うメソッド 124 | """ 125 | self.print_target_file_path() # ターゲットファイルのパスを出力 126 | self.open_target_file_in_vscode() # ターゲットファイルをVS Codeで開く 127 | 128 | # if self.target_file_path.endswith(".py"): # ターゲットファイルがPythonファイルの場合 129 | # self.run_python_file() # - Pythonファイルを実行 130 | 131 | 132 | def save_current_source_as_past(self): 133 | """ 134 | 現在のソースファイルを過去のソースファイルとして保存するメソッド 135 | """ 136 | shutil.copy(self.source_file_path, self.past_source_file_path) 137 | 138 | def read_source_file(self): 139 | """ 140 | ソースファイルの内容を読み込むメソッド 141 | """ 142 | with open(self.source_file_path, "r", encoding="utf-8") as source_file: 143 | source_content = source_file.read() 144 | return source_content 145 | 146 | def get_source_file_name(self): 147 | """ 148 | ソースファイルのファイル名(拡張子なし)を取得するメソッド 149 | """ 150 | source_file_name = os.path.splitext(os.path.basename(self.source_file_path))[0] 151 | if source_file_name.startswith("def_"): 152 | source_file_name = source_file_name[4:] 153 | return source_file_name 154 | 155 | def create_variables_dict(self, source_content, source_file_name): 156 | """ 157 | 変数の辞書を作成するメソッド 158 | """ 159 | variables = { 160 | "source_file_path": self.source_file_path, 161 | "source_file_name": source_file_name, 162 | "source_content": source_content, 163 | } 164 | return variables 165 | 166 | def load_prompt_with_variables(self, create_domain_grimoire, variables): 167 | """ 168 | 領域術式(要件定義書)からプロンプトを読み込み、変数を埋め込むメソッド 169 | """ 170 | zoltraak_dir = os.path.dirname(zoltraak.__file__) 171 | prompt = load_prompt(f"{zoltraak_dir}/{create_domain_grimoire}", variables) 172 | return prompt 173 | 174 | def generate_code_with_claude(self, prompt): 175 | """ 176 | Claudeを使用してコードを生成するメソッド 177 | """ 178 | # print("geminiを使用してコードを生成します") 179 | # code = gemini.generate_response( 180 | # "gemini-1.5-pro" 181 | # , prompt, 8192, 1 182 | # ) 183 | code = claude.generate_response( 184 | # "claude-3-haiku-20240307" 185 | # "claude-3-opus-20240229" 186 | "claude-3-5-sonnet-20240620" 187 | , prompt, 4000, 0.3 188 | ) 189 | code = code.replace("```python", "").replace("```", "") 190 | return code 191 | 192 | def write_code_to_target_file(self, code): 193 | """ 194 | 生成されたコードをターゲットファイルに書き込むメソッド 195 | """ 196 | os.makedirs(os.path.dirname(self.target_file_path), exist_ok=True) 197 | with open(self.target_file_path, "w", encoding="utf-8") as target_file: 198 | target_file.write(code) 199 | 200 | def append_source_hash_to_target_file(self): 201 | """ 202 | ソースファイルのハッシュ値をターゲットファイルに追記するメソッド 203 | """ 204 | with open(self.target_file_path, "a", encoding="utf-8") as target_file: 205 | target_file.write(f"\n# HASH: {self.source_hash}\n") 206 | print(f"ターゲットファイルにハッシュ値を埋め込みました: {self.source_hash}") 207 | 208 | def try_execute_generated_code(self, code): 209 | """ 210 | 生成されたコードを実行するメソッド 211 | """ 212 | while True: 213 | try: 214 | exec(code) 215 | break 216 | except Exception as e: 217 | print(f"Pythonファイルの実行中にエラーが発生しました。") 218 | print(f"\033[91mエラーメッセージ: {str(e)}\033[0m") 219 | print(f"エラーが発生したPythonファイルのパス: \033[33m{self.target_file_path}\033[0m") 220 | 221 | while True: 222 | prompt = f""" 223 | 以下のPythonコードにエラーがあります。修正してください。 224 | コード: {code} 225 | エラーメッセージ: {str(e)} 226 | プログラムコードのみ記載してください。 227 | """ 228 | code = generate_response( 229 | model="claude-3-haiku-20240307", 230 | # model="claude-3-opus-20240229", 231 | prompt=prompt, 232 | max_tokens=4000, 233 | temperature=0.3 234 | ) 235 | code = code.replace("```python", "").replace("```", "") 236 | 237 | print("修正したコードを再実行します。") 238 | try: 239 | exec(code) 240 | print("コードの実行が成功しました。") 241 | break 242 | except Exception as e: 243 | print(f"修正後のコードでもエラーが発生しました。再度修正を試みます。") 244 | print(f"\033[91m修正後のエラーメッセージ: {str(e)}\033[0m") 245 | 246 | with open(self.target_file_path, "w", encoding="utf-8") as target_file: 247 | target_file.write(code) 248 | 249 | # except Exception as e: 250 | # print(f"Pythonファイルの実行中にエラーが発生しました。") 251 | # print(f"\033[91mエラーメッセージ: {str(e)}\033[0m") 252 | # print(f"エラーが発生したPythonファイルのパス: \033[33m{self.target_file_path}\033[0m") 253 | 254 | # prompt = f""" 255 | # Pythonファイルの実行中に以下のエラーが発生しました。 256 | # ファイルの内容: {code} 257 | # エラーメッセージ: {str(e)} 258 | # 考えられるエラーの原因と解決方法を教えてください。 259 | # """ 260 | # response = generate_response( 261 | # model="claude-3-haiku-20240307", 262 | # prompt=prompt, 263 | # max_tokens=1000, 264 | # temperature=0.7 265 | # ) 266 | # print(f"\033[33m{response}\033[0m") 267 | # print("") 268 | 269 | # user_input = input("コードを再実行しますか? (y/n): ") 270 | # if user_input.lower() != 'y': 271 | # break 272 | # else: 273 | # prompt = f""" 274 | # 以下のPythonコードにエラーがあります。修正してください。 275 | # コード: {code} 276 | # エラーメッセージ: {str(e)} 277 | # プログラムコードのみ記載してください。 278 | # """ 279 | # code = generate_response( 280 | # model="claude-3-haiku-20240307", 281 | # prompt=prompt, 282 | # max_tokens=4000, 283 | # temperature=0.3 284 | # ) 285 | # code = code.replace("```python", "").replace("```", "") 286 | 287 | # print("次のコードを実行してください:") 288 | # print(f"python {self.target_file_path}") 289 | # import pyperclip 290 | # pyperclip.copy(f"python {self.target_file_path}") 291 | # print("コードをクリップボードにコピーしました。") 292 | def print_target_file_path(self): 293 | """ 294 | ターゲットファイルのパスを出力するメソッド 295 | """ 296 | print(f"ターゲットファイルのパス: {self.target_file_path}") 297 | 298 | def open_target_file_in_vscode(self): 299 | """ 300 | ターゲットファイルをVS Codeで開くメソッド 301 | """ 302 | os.system(f"code {self.target_file_path}") 303 | 304 | def run_python_file(self): 305 | """ 306 | Pythonファイルを実行するメソッド 307 | """ 308 | print(f"Pythonファイルを実行します: {self.target_file_path}") 309 | subprocess.run(["python", self.target_file_path]) 310 | -------------------------------------------------------------------------------- /zoltraak/gencodebase.py: -------------------------------------------------------------------------------- 1 | # ディレクトリとファイル構成から、コードベースを作るファイル 2 | # 要件定義書と -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect.md: -------------------------------------------------------------------------------- 1 | 2 | `source_content` 3 | 4 | # 上記の要件定義を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。 5 | 6 | ## 指示 7 | - 処理は含めず、ディレクトリとファイルの構成のみ作成すること 8 | - ディレクトリ構成は `generated/`source_file_name`/` の配下にすべて作成すること 9 | - コードブロックは使用せず、Pythonコードのみを記述すること 10 | - 生成したコードは即座に実行可能な状態にすること 11 | - 出力したディレクトリはリンクを出力すること 12 | -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect_claude.md: -------------------------------------------------------------------------------- 1 | # 作業内容 2 | **`要件定義書`を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。コードのみ** 3 | 4 | # モジュール情報 5 | 以下出力pythonファイル冒頭に記載すること 6 | from zoltraak.llms.claude import `generate_response` 7 | from zoltraak.utils.process_text import `normal` 8 | 9 | ## 指示 10 | 1. コードブロックは使用せず、Pythonコードでディレクトリとファイルの構成を作成する 11 | 2. ディレクトリ構成は `ルートディレクトリ` の配下にすべて作成すること、README.md を除いて、それ以外のファイルは記述 12 | 2.1 os.mkdirsを使用して`ルートディレクトリ`を作成する 13 | 2.2 os.path.joinとos.mkdirsを使用して、詳細なディレクトリ構成を作成する 14 | ディレクトリ名をリストに記述し実行 15 | 2.3 osモジュールの機能を使用して、必要なファイルを作成する(ディレクトリの中に何もない場合は新しく作る) 16 | 以下参考、ただしメインファイルはプログラムを詳細に記載する 17 | ``` 18 | files = [ 19 | ('dirname', 'filename', 'fileのの拡張子の形式で、〜〜のプログラムを記載して下さい。という末尾で終了すること'), 20 | ] 21 | ``` 22 | 全てのpromptに`要件定義ファイル`を読み込みモードで取得した内容を入れて、ファイル名と必要なプロンプトを記載 23 | 要件定義ファイルの内容を変数 readme_content に格納 24 | 2.5 ルートディレクトリにREADME.mdファイルを書き込みモードで開く 25 | - `要件定義ファイル`の内容を読み込みモードで開く 26 | -- `要件定義ファイル`の内容をREADME.mdに書き込む 27 | - tqdmのプログレスバーを利用 28 | プログレスバーを初期化。合計処理ファイル数: len(files)、単位: "files" 29 | filesリストの要素を順にループ。各要素は (ディレクトリ名, ファイル名, プロンプト) のタプル 30 | モジュール記載忘れないように 31 | 全てのファイルは`generate_response(model, prompt, max_tokens, temperature)`をもちいてfor文で然るべき内容を記載 32 | 33 | - モデル名を指定: "claude-3-5-sonnet-20240620" 34 | - プロンプト: readme_content + 改行 + "上記の内容をもとにして" + prompt 35 | - 最大トークン数を指定: 1000 36 | - 温度パラメータを指定: 0.7 37 | 出力結果は normal(response, "python") にて加工して 38 | フォーマットしたレスポンスをファイルに書き込む 39 | 3. ディレクトリを新しく開く 40 | pythonのsubprocessを使って code `ルートディレクトリ` 41 | pythonのsubprocessを使って code `ルートディレクトリ`/README.md 42 | 4. 生成したコードは即座に実行可能な状態にすること 43 | 5. 出力先ファイルはpythonであり、プログラムコードのみを記載し文言はコメントアウトで記載すること 44 | 必ず冒頭に以下を入れること 45 | from zoltraak.llms.claude import `generate_response` 46 | from zoltraak.utils.process_text import `normal` 47 | 48 | # 引用 49 | - `要件定義書` = [source_content] 50 | - `要件定義書ファイル` = [source_file_path] 51 | - `ルートディレクトリ` = generated/[source_file_name]/ 52 | 53 | 54 | # README.mdファイルのパスを作成 55 | # README.mdファイルを書き込みモードで開く 56 | # 要件定義ファイルを読み込みモードで開く 57 | # - 要件定義ファイルのパスを指定 58 | # - 59 | # -- 要件定義ファイルの内容をREADME.mdに書き込む 60 | # -- 要件定義ファイルの内容を変数 readme_content に格納 61 | 62 | # プログレスバーを初期化 63 | # filesリストの要素を順にループ 64 | # - ファイルのパスを作成 65 | # - ファイルを書き込みモードで開く 66 | # -- LLMを使用してレスポンスを生成 67 | # --- モデル名を指定 68 | ロンプトを作成 readme_content + \n 上記の内容をもとにしてprompt 69 | # --- 最大トークン数を指定 70 | # --- 温度パラメータを指定 71 | # -- 72 | # -- レスポンスをフォーマットして変数に格納 73 | # -- フォーマットしたレスポンスをファイルに書き込む 74 | # - プログレスバーを更新 75 | -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect_daiagrams.md: -------------------------------------------------------------------------------- 1 | # 作業内容 2 | **`要件定義書`を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。コードのみ** 3 | 4 | ## 指示 5 | 1. コードブロックは使用せず、Pythonコードでディレクトリとファイルの構成を作成する 6 | 2. ディレクトリ構成は `ルートディレクトリ` の配下にすべて作成すること、README.md を除いて、それ以外のファイルは記述 7 | 2.1 os.mkdirsを使用して`ルートディレクトリ`を作成する 8 | 2.2 os.path.joinとos.mkdirsを使用して、詳細なディレクトリ構成を作成する 9 | ディレクトリ名をリストに記述し実行 10 | 2.3 osモジュールの機能を使用して、必要なファイル群を作成する(ディレクトリの中に何もない場合は新しく作る) 11 | ファイル名をリストに記述し実行 12 | 2.4 `react&fastapi`を参考にdaiagramsモジュール を利用して然るべきディレクトリにpngファイルを作成するコードを記載 13 | アーキテクチャの全体像を図示してください。主要なサービスとそれらの関係性を含めてください。 14 | 以下参考、diagramsのsaveやrenderは利用しないこと 15 | 2.5 ルートディレクトリにREADME.mdファイルを書き込みモードで開く 16 | - `要件定義ファイル`の内容を読み込みモードで開く 17 | -- `要件定義ファイル`の内容をREADME.mdに書き込む 18 | 3. ディレクトリを新しく開く 19 | pythonのsubprocessを使って code `ルートディレクトリ` 20 | pythonのsubprocessを使って code `ルートディレクトリ`/README.md 21 | 4. 生成したコードは即座に実行可能な状態にすること 22 | 5. 出力先ファイルはpythonであり、プログラムコードのみを記載し文言はコメントアウトで記載すること 23 | 24 | # 引用 25 | - `要件定義書` = [source_content] 26 | - `要件定義書ファイル` = [source_file_path] 27 | - `ルートディレクトリ` = generated/[source_file_name]/ 28 | 29 | - `react&fastapi` = 30 | ``` 31 | from diagrams import Diagram, Cluster 32 | from diagrams.programming.framework import FastAPI, React 33 | from diagrams.onprem.database import PostgreSQL 34 | from diagrams.programming.language import Python 35 | 36 | graph_attr = { 37 | "fontsize": "45", 38 | "bgcolor": "transparent" 39 | } 40 | 41 | with Diagram("Application Architecture", show=False, direction="TB", filename=os.path.join(root_dir, 'diagrams', 'app_architecture'), outformat="png"): 42 | with Cluster("A"): 43 | with Cluster("B"): 44 | ``` 45 | -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect_detail.md: -------------------------------------------------------------------------------- 1 | # 作業内容 2 | **`要件定義書`を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。コードのみ** 3 | 4 | ## 指示 5 | 1. コードブロックは使用せず、Pythonコードでディレクトリとファイルの構成を作成する 6 | 2. ディレクトリ構成は `ルートディレクトリ` の配下にすべて作成すること、README.md を除いて、それ以外のファイルは記述 7 | 2.1 os.mkdirsを使用して`ルートディレクトリ`を作成する 8 | 2.2 os.path.joinとos.mkdirsを使用して、詳細なディレクトリ構成を作成する 9 | 2.3 osモジュールの機能を使用して、必要なファイル群を作成する(ディレクトリの中に何もない場合は新しく作る) 10 | with open(os.path.join(ディレクトリパス, 'ファイル名'), 'w', encoding = "utf-8") as f: 11 | pass 12 | 2.4 13 | ルートディレクトリにREADME.mdファイルを書き込みモードで開く 14 | - `要件定義ファイル`の内容を読み込みモードで開く 15 | -- `要件定義ファイル`の内容をREADME.mdに書き込む 16 | 3. ディレクトリを新しく開く 17 | pythonのsubprocessを使って code `ルートディレクトリ` 18 | pythonのsubprocessを使って code `ルートディレクトリ`/README.md 19 | 4. 生成したコードは即座に実行可能な状態にすること 20 | 5. 出力先ファイルはpythonであり、プログラムコードのみを記載し文言はコメントアウトで記載すること 21 | 22 | # 引用 23 | - `要件定義書` = [source_content] 24 | - `要件定義書ファイル` = [source_file_path] 25 | - `ルートディレクトリ` = generated/[source_file_name]/ -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect_detail_dir.md: -------------------------------------------------------------------------------- 1 | 2 | # モジュール 3 | - `要件定義書` = 4 | ```md 5 | 6 | zoltraak/ 7 | ├── README.md 8 | ├── docs/ 9 | │ ├── getting_started.md 10 | │ ├── usage.md 11 | │ ├── examples.md 12 | │ ├── architecture.md 13 | │ ├── contributing.md 14 | │ └── faq.md 15 | ├── src/ 16 | │ ├── __init__.py 17 | │ ├── compiler.py 18 | │ ├── executor.py 19 | │ └── utils.py 20 | ├── tests/ 21 | │ ├── __init__.py 22 | │ ├── test_compiler.py 23 | │ └── test_executor.py 24 | ├── examples/ 25 | │ ├── example1.md 26 | │ └── example2.md 27 | ├── requirements.txt 28 | ├── setup.py 29 | └── LICENSE 30 | ``` 31 | 32 | - README.md: プロジェクトの概要、インストール方法、クイックスタート、ライセンス情報などを簡潔に記載。 33 | - docs/: 詳細なドキュメントを格納。 34 | - getting_started.md: インストールと初期設定の方法。 35 | - usage.md: 使用方法の詳細。 36 | - examples.md: 具体的な使用例。 37 | - architecture.md: システムアーキテクチャの説明。 38 | - contributing.md: プロジェクトへの貢献方法。 39 | - faq.md: よくある質問と回答。 40 | - src/: ソースコードを格納。 41 | - `__init__.py`: パッケージの初期化ファイル。 42 | - compiler.py: コンパイラの実装。 43 | - executor.py: 実行器の実装。 44 | - utils.py: ユーティリティ関数の実装。 45 | - tests/: テストコードを格納。 46 | - `__init__.py`: テストパッケージの初期化ファイル。 47 | - test_compiler.py: コンパイラのテスト。 48 | - test_executor.py: 実行器のテスト。 49 | - examples/: 使用例となるMarkdownファイルを格納。 50 | - requirements.txt: 依存ライブラリのリスト。 51 | - setup.py: パッケージのセットアップ情報。 52 | - LICENSE: ライセンス情報。 53 | 54 | - `要件定義書ファイルパス` = [source_file_path] 55 | - `ルートディレクトリ` = generated/[source_file_name]/ 56 | 57 | # 作業内容 58 | **上記の要件定義を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。コードのみ** 59 | 60 | ## 指示 61 | 1. コードブロックは使用せず、Pythonコードでディレクトリとファイルの構成を作成する 62 | 3. ディレクトリ構成は `ルートディレクトリ` の配下にすべて作成すること、README.md を除いて、それ以外のファイルは記述 63 | 64 | 4. os.mkdirsで`ルートディレクトリ`の作成 65 | 5. os.path.joinと os.mkdirsで 詳細なディレクトリを作成 66 | 6. os機能を使ってファイルを作成 67 | 7. README.mdを作成 68 | `要件定義ファイルパス`をpythonのsubprocessを使って、システム的にコピー&ペーストして 69 | 8. 以下をpythonプログラムで実行 70 | pythonのsubprocessを使って code `ルートディレクトリ` 71 | pythonのsubprocessを使って code `ルートディレクトリ`/README.md 72 | 9. 生成したコードは即座に実行可能な状態にすること 73 | 10. 出力先ファイルはpythonであり、プログラムコードのみを記載し文言はコメントアウトで記載すること 74 | 75 | -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect_develop.md: -------------------------------------------------------------------------------- 1 | # 作業内容 2 | **`要件定義書`を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。コードのみ** 3 | 4 | ## 指示 5 | 1. コードブロックは使用せず、Pythonコードでディレクトリとファイルの構成を作成する 6 | 2. ディレクトリ構成は `ルートディレクトリ` の配下にすべて作成すること、README.md を除いて、それ以外のファイルは記述 7 | 2.1 os.mkdirsを使用して`ルートディレクトリ`を作成する 8 | 2.2 os.path.joinとos.mkdirsを使用して、詳細なディレクトリ構成を作成する 9 | ディレクトリ名をリストに記述し実行 10 | 2.3 osモジュールの機能を使用して、必要なファイルを作成する(ディレクトリの中に何もない場合は新しく作る) 11 | 2.4 実行ファイルには詳細コードを記述して保存 12 | with open(file_path, 'w') as f: 13 | f.write(""" 14 | 詳細に記述 15 | """ 16 | 2.5 ルートディレクトリにREADME.mdファイルを書き込みモードで開く 17 | - `要件定義ファイル`の内容を読み込みモードで開く 18 | -- `要件定義ファイル`の内容をREADME.mdに書き込む 19 | 3. ディレクトリを新しく開く 20 | pythonのsubprocessを使って code `ルートディレクトリ` 21 | pythonのsubprocessを使って code `ルートディレクトリ`/README.md 22 | 4. 生成したコードは即座に実行可能な状態にすること 23 | 5. 出力先ファイルはpythonであり、プログラムコードのみを記載し文言はコメントアウトで記載すること 24 | 25 | # 引用 26 | - `要件定義書` = [source_content] 27 | - `要件定義書ファイル` = [source_file_path] 28 | - `ルートディレクトリ` = generated/[source_file_name]/ 29 | -------------------------------------------------------------------------------- /zoltraak/grimoires/architect/architect_functor.md: -------------------------------------------------------------------------------- 1 | 2 | `source_content` 3 | 4 | # 上記の要件定義を元に、以下の指示に従ってPythonでディレクトリ構成を構築するコードを記述してください。 5 | 6 | ## 指示 7 | - ディレクトリとファイルの構成を作成 8 | - 各クラスや関数は、ファンクタ(callable object)として最低限の記述にとどめること 9 | - ディレクトリ構成は `generated/`source_file_name`/` の配下にすべて作成すること 10 | - コードブロックは使用せず、Pythonコードのみを記述すること 11 | - 生成したコードは即座に実行可能な状態にすること 12 | - 出力したディレクトリはリンクを出力すること -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/biz_consult copy.md: -------------------------------------------------------------------------------- 1 | # 戦略コンサルタント納品ドキュメント定義書 2 | 3 | ## ゴール: {prompt} 4 | 上記を満たす納品ドキュメントを作成してください。 5 | 6 | ## 1. 目的 7 | 8 | 戦略コンサルタントが行う課題出し、施策出し、計画立案のプロセスを効率化し、複数のパターンやアイデアを生成することで、コンサルタントの意思決定を支援する。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | 12 | - Markdown形式で戦略コンサルタントが作成するドキュメントのファイル・フォルダ構成 13 | 14 | 15 | ## 3. クラス図 16 | 17 | 18 | システムを構成するクラスとそれらの関係を図示してください。各クラスには、以下の情報を含めてください: 19 | クラス図は、関係性も含めてASCII文字で描いてください。 20 | - **クラス名** 21 | - **属性(フィールド)** 22 | - **操作(メソッド)** 23 | - **関連するクラスとの関係**(継承、コンポジション、集約など) 24 | 25 | ``` 26 | +---------------------+ +---------------------+ 27 | | Issue | | Measure | 28 | +---------------------+ +---------------------+ 29 | | - description: String | - description: String 30 | | - impactLevel: int | | - effectivenessScore: int 31 | +---------------------+ +---------------------+ 32 | | + generatePatterns(): List| + generatePatterns(): List 33 | | + defineAxes(): Map| + defineAxes(): Map 34 | +---------------------+ +---------------------+ 35 | ^ ^ 36 | | | 37 | | | 38 | +---------------------+ +---------------------+ 39 | | Plan | | FermiEstimation | 40 | +---------------------+ +---------------------+ 41 | | - goal: String | - targetValue: double 42 | | - timeline: int | | - assumptions: Map 43 | | - resources: Map| - calculationSteps: List 44 | +---------------------+ +---------------------+ 45 | | + generatePatterns(): List| + estimate(): double 46 | | + defineAxes(): Map| 47 | +---------------------+ +---------------------+ 48 | ``` 49 | 50 | ## 4. クラスの詳細 51 | 52 | ### Issue 53 | - 説明: 課題を表すクラス 54 | - 記述方法: 表形式(課題5つ、軸3つ) 55 | - 属性: 56 | - description (String): 課題の説明 57 | - impactLevel (int): 課題の影響度 58 | - 操作: 59 | - generatePatterns() (public): 複数の課題パターンを生成する 60 | - defineAxes() (public): 課題を分析するための軸を定義する 61 | 62 | ### Measure 63 | - 説明: 施策を表すクラス 64 | - 記述方法: 表形式(施策5つ、軸3つ) 65 | - 属性: 66 | - description (String): 施策の説明 67 | - effectivenessScore (int): 施策の有効性スコア 68 | - 操作: 69 | - generatePatterns() (public): 複数の施策パターンを生成する 70 | - defineAxes() (public): 施策を分析するための軸を定義する 71 | 72 | ### Plan 73 | - 説明: 計画を表すクラス 74 | - 記述方法: 表形式(ガントチャート形式、担当者を仮設定, Marmaid記法) 75 | - 属��: 76 | - goal (String): 計画の目標 77 | - timeline (int): 計画の期間 78 | - resources (Map): 計画に必要なリソース 79 | - 操作: 80 | - generatePatterns() (public): 複数の計画パターンを生成する 81 | - defineAxes() (public): 計画を分析するための軸を定義する 82 | 83 | ### FermiEstimation 84 | - 説明: フェルミ推定を行うクラス 85 | - 記述方法: Texを利用、大学レベル以上の高度な数理モデルを記述。計算はPythonプログラムを執筆。 86 | - 属性: 87 | - targetValue (double): 推定対象の値 88 | - assumptions (Map): 推定に使用する仮定 89 | - calculationSteps (List): 計算ステップ 90 | - 操作: 91 | - estimate() (public): フェルミ推定を実行する 92 | 93 | ## 4. ユースケース 94 | 95 | 1. 課題出し 96 | - 関連クラス: Issue 97 | - 関連メソッド: generatePatterns(), defineAxes() 98 | 99 | 2. 施策出し 100 | - 関連クラス: Measure 101 | - 関連メソッド: generatePatterns(), defineAxes() 102 | 103 | 3. 計画立案 104 | - 関連クラス: Plan 105 | - 関連メソッド: generatePatterns(), defineAxes() 106 | 107 | 4. フェルミ推定 108 | - 関連クラス: FermiEstimation 109 | - 関連メソッド: estimate() 110 | 111 | ## 5. シーケンス図 112 | 113 | ### 課題出しのシーケンス図 114 | 115 | ``` 116 | User -> IssueController: requestIssuePatterns() 117 | IssueController -> IssueService: generateIssuePatterns() 118 | IssueService -> Issue: generatePatterns() 119 | Issue --> IssueService: issuePatterns 120 | IssueService -> Issue: defineAxes() 121 | Issue --> IssueService: issueAxes 122 | IssueService --> IssueController: issuePatterns, issueAxes 123 | IssueController --> User: issuePatterns, issueAxes 124 | ``` 125 | 126 | ### 施策出しのシーケンス図 127 | 128 | ``` 129 | User -> MeasureController: requestMeasurePatterns() 130 | MeasureController -> MeasureService: generateMeasurePatterns() 131 | MeasureService -> Measure: generatePatterns() 132 | Measure --> MeasureService: measurePatterns 133 | MeasureService -> Measure: defineAxes() 134 | Measure --> MeasureService: measureAxes 135 | MeasureService --> MeasureController: measurePatterns, measureAxes 136 | MeasureController --> User: measurePatterns, measureAxes 137 | ``` 138 | 139 | ### 計画立案のシーケンス図 140 | 141 | ``` 142 | User -> PlanController: requestPlanPatterns() 143 | PlanController -> PlanService: generatePlanPatterns() 144 | PlanService -> Plan: generatePatterns() 145 | Plan --> PlanService: planPatterns 146 | PlanService -> Plan: defineAxes() 147 | Plan --> PlanService: planAxes 148 | PlanService --> PlanController: planPatterns, planAxes 149 | PlanController --> User: planPatterns, planAxes 150 | ``` 151 | 152 | ### フェルミ推定のシーケンス図 153 | 154 | ``` 155 | User -> FermiEstimationController: requestFermiEstimation(targetValue, assumptions) 156 | FermiEstimationController -> FermiEstimationService: calculateFermiEstimation(targetValue, assumptions) 157 | FermiEstimationService -> FermiEstimation: estimate() 158 | FermiEstimation --> FermiEstimationService: estimatedValue 159 | FermiEstimationService --> FermiEstimationController: estimatedValue 160 | FermiEstimationController --> User: estimatedValue 161 | ``` 162 | 163 | このシステムでは、戦略コンサルタントの主要なタスクである課題出し、施策出し、計画立案をサポートするために、それぞれのドメインクラス(Issue、Measure、Plan)でパターン生成と軸だしのメソッドを提供しています。また、フェルミ推定をサポートするためにFermiEstimationクラスを用意しています。 164 | 165 | コントローラー、サービス、ドメインクラスを分離することで、責務を明確にし、変更に強い設計になっています。また、各ドメインクラスが共通のインターフェース(generatePatterns()、defineAxes())を持つことで、ポリモーフィズムを活用しています。 166 | 167 | 今後の拡張として、各ドメインクラスにストラテジーパターンを適用し、パターン生成や軸だしのアルゴリズムを切り替えられるようにすることで、さらに柔軟性を高めることができます。 -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/biz_consult.md: -------------------------------------------------------------------------------- 1 | # 戦略コンサルタント納品ドキュメント定義書 2 | 3 | ## ゴール: {prompt} 4 | 上記を満たす納品ドキュメントを作成してください。 5 | 6 | ## 1. 目的 7 | 8 | 戦略コンサルタントが行う課題出し、施策出し、計画立案のプロセスを効率化し、複数のパターンやアイデアを生成することで、コンサルタントの意思決定を支援する。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | 12 | - Markdown形式で戦略コンサルタントが作成するドキュメントのファイル・フォルダ構成 13 | 14 | 15 | ## 3. クラス図 16 | 17 | 事業モデル(具体)を構成するクラスとそれらの関係を図示してください。各クラスには、以下の情報を含めてください: 18 | クラス図は、関係性も含めてASCII文字で描いてください。 19 | - **クラス名** 20 | - **属性(フィールド)** 21 | - **操作(メソッド)** 22 | - **関連するクラスとの関係**(継承、コンポジション、集約など) 23 | 24 | ## 4. クラスの詳細 25 | 26 | 以下に記述している内容を具現化すること。 27 | 28 | ### Issue 29 | - 説明: 課題を表すクラス 30 | - 記述方法: 表形式(課題5つ、軸3つ) 31 | - 属性: 32 | - description (String): 課題の説明 33 | - impactLevel (int): 課題の影響度 34 | - 操作: 35 | - generatePatterns() (public): 複数の課題パターンを生成する 36 | - defineAxes() (public): 課題を分析するための軸を定義する 37 | 38 | ### Measure 39 | - 説明: 施策を表すクラス 40 | - 記述方法: 表形式(施策5つ、軸3つ) 41 | - 属性: 42 | - description (String): 施策の説明 43 | - effectivenessScore (int): 施策の有効性スコア 44 | - 操作: 45 | - generatePatterns() (public): 複数の施策パターンを生成する 46 | - defineAxes() (public): 施策を分析するための軸を定義する 47 | 48 | 49 | ### RevenueModel 50 | - 説明: 収益モデルを表すクラス 51 | - 記述方法: 図、表形式(収益源、価格設定、売上予測を記載) 52 | - 属性: 53 | - revenueSources (List): 収益源のリスト 54 | - pricing (Map): 価格設定 55 | - salesForecast (Map): 売上予測 56 | - 操作: 57 | - generatePatterns() (public): 複数の収益モデルパターンを生成する 58 | - defineAxes() (public): 収益モデルを分析するための軸を定義する 59 | - estimateRevenue() (public): 売上を予測する 60 | 61 | ### Plan 62 | - 説明: 計画を表すクラス 63 | - 記述方法: 表形式(ガントチャート形式、担当者を仮設定, Marmaid記法) 64 | - 属��: 65 | - goal (String): 計画の目標 66 | - timeline (int): 計画の期間 67 | - resources (Map): 計画に必要なリソース 68 | - 操作: 69 | - generatePatterns() (public): 複数の計画パターンを生成する 70 | - defineAxes() (public): 計画を分析するための軸を定義する 71 | 72 | ### FermiEstimation 73 | - 説明: フェルミ推定を行うクラス 74 | - 記述方法: Texを利用、大学レベル以上の高度な数理モデルを記述。計算はPythonプログラムを執筆。 75 | - 属性: 76 | - targetValue (double): 推定対象の値 77 | - assumptions (Map): 推定に使用する仮定 78 | - calculationSteps (List): 計算ステップ 79 | - 操作: 80 | - estimate() (public): フェルミ推定を実行する 81 | 82 | ## 4. 想定パターン(3つ) 83 | 1. 課題出し 84 | - 関連クラス: Issue 85 | - 関連メソッド: generatePatterns(), defineAxes() 86 | 87 | 2. 施策出し 88 | - 関連クラス: Measure 89 | - 関連メソッド: generatePatterns(), defineAxes() 90 | 91 | 3. 計画立案 92 | - 関連クラス: Plan 93 | - 関連メソッド: generatePatterns(), defineAxes() 94 | 95 | 4. フェルミ推定 96 | - 関連クラス: FermiEstimation 97 | - 関連メソッド: estimate() 98 | 99 | ## 5. ドキュメント作成計画立案 -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/book_lecture_main.md: -------------------------------------------------------------------------------- 1 | 2 | ## 📝 講義資料生成AI 3 | 4 | 講義のタイトルと概要から、講義資料の内容を生成するAI 5 | 6 |
7 | 🎯 入力 8 | 9 | - 講義のタイトル (テキスト): {prompt} 10 |
11 | 12 |
13 | 📚 出力 14 | 15 | - md形式の研修資料 (テキスト) 16 |
17 | 18 |
19 | 🛠️ 処理 20 | 21 | 以下の構成で、講義のタイトルと概要から、わかりやすく体系的な講義資料を生成します。学習者が講義内容を効果的に理解し、実践的なスキルを身につけられるような資料を目指します。 22 | 23 | 1. 📋 目次(リンク付き) 24 | - 講義資料の各セクションへのリンクを含む目次を作成します。 25 | - 目次のリンクをクリックすると、該当セクションにジャンプできます。 26 | -(例: ) 27 | 28 | 2. 📝 {prompt}の説明(1000文字程度) 29 | - 講義のタイトル({prompt})について、1000文字程度でわかりやすく説明します。 30 | - 講義の概要や目的、学習内容などを簡潔にまとめます。 31 | 32 | 3. 🔍 詳細解説(5つのトピック、各500文字) 33 | - 講義の内容を5つのトピックに分けて、各トピックを500文字程度で詳しく解説します。 34 | - トピックごとに、重要なポイントや具体例を交えながら、わかりやすく説明します。 35 | 36 | 4. ✏️ 各トピックの例題と解説 37 | - 各トピックについて、理解を深めるための例題を提示します。 38 | - 例題の問題文と解答、解説を記載し、学習者が実践的に理解できるようにします。 39 | 40 | 5. 📚 専門用語の表形式まとめ 41 | - 講義で登場した専門用語を表形式でまとめます。 42 | - 用語の意味や説明を簡潔に記載し、学習者が専門用語を整理・理解しやすいようにします。 43 |
44 | 45 |
46 | ✅ テスト 47 | 48 | - [ ] 目次にリンクが付いているか(例: ) 49 | - [ ] {prompt}が実際の講義タイトルに置き換えられているか 50 | - [ ] 詳細解説が5つのトピックについて、各500文字程度で説明されているか 51 | - [ ] 各トピックに例題と解説が付いているか 52 | - [ ] 専門用語が表形式でまとめられているか 53 |
54 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/book_lecture_quiz.md: -------------------------------------------------------------------------------- 1 | 2 | ## 📝 問題生成AI 3 | 講義のタイトルと概要から、問題資料の内容を生成します 4 | 5 |
6 | 🎯 入力 7 | 8 | - 講義のタイトル (テキスト): {prompt} 9 |
10 | 11 |
12 | 📝 出力 13 | 14 | - 4択問題を5つ生成 15 | - 目次(リンクで飛ぶことができるように など利用) 16 | - 実践問題(思考力を要する基礎問題) 17 | - 課題と解説(5つ) 18 | - 4択問題 19 | - 回答、解説はトグルにする 20 | - 解説には引用を載せる 21 | - 形式は以下の通り 22 |
23 | 問題1: DALL·E 3 で生成できる画像の最大サイズは? 24 | 25 | - a. 512x512 26 | - b. 1024x1024 27 | - c. 1792x1792 28 | - d. 2048x2048 29 | 30 |
31 | 回答と解説 32 | 33 | 回答: b. 1024x1024 34 | 35 | DALL·E 3 では、1024x1024, 1024x1792, 1792x1024 の3つのサイズから選択できます。最大サイズは 1792x1024 です。 36 |
37 |
38 |
39 | 40 |
41 | 🛠️ 処理 42 | 43 | 1. 講義のタイトルと概要から、4択問題を5つ生成 44 | 2. 目次を作成(リンク付き) 45 | 4. 4択問題を5つ作成 46 | - 回答と解説はトグルで表示 47 | - 解説には引用を載せる 48 | 5. 実践問題を5つ作成 49 | - 思考力を要する基礎問題 50 |
51 | 52 |
53 | ⚠️ 注意 54 | 55 | - 目次にはリンクを付ける(例: ) 56 | - 4択問題の選択肢と解説は、講義の内容に即したものにする 57 | - 解説には、講義資料からの引用を含める 58 |
59 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_akirapp.md: -------------------------------------------------------------------------------- 1 | ## ゴール: {prompt} 2 | 3 | ## ==要件定義書作成プロンプト== 4 | 2024年現在で、ベストプラクティスなアーキテクチャを使用して、〇〇◯(ここに作りたいもの)のMVPを作成したいです。 5 | 天才PMデザイナーフルスタックエンジニアの目線から、構造化して整理された詳細なMVP要件定義書を作成してください。 6 | 7 | ## ルール 8 | - 全体の関係性を深く理解し、引数のズレやリクエストとレスポンスのズレが起きないように細心の注意を払ってください。 9 | - 2024年のおしゃれでシックなデザインにしてください 10 | - 初心者にもわかりやすい表現で作成してください。 11 | - 最低限の機能がついたMVPの要件定義書を簡潔に1つずつ丁寧に書いて 12 | 13 | ## 出力内容 14 | - 概要 15 | - Markdown形式で省略なしのファイル・フォルダ構成 16 | - 機能要件 17 | - 非機能要件(詳細アーキテクチャ/開発環境/インフラ/言語など) 18 | - 必要な画面 19 | - 必要なAPIの処理内容 20 | - 必要なDB構成 21 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_aws.md: -------------------------------------------------------------------------------- 1 | # [システム名]のAWSアーキテクチャ設計書 2 | ## ゴール: {prompt} 3 | 上記を満たすAWSアーキテクチャ設計書を作成してください。 4 | 5 | AWSのベストプラクティスに従って、以下の要件を含めてAWSアーキテクチャ設計書を作成してください。 6 | 7 | ## 1. 目的 8 | システムの全体的な目的と、AWSを使用する理由を簡潔に説明してください。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | - Markdown形式で省略なしのディレクトリ、ファイル構成 12 | - ルートディレクトリから下層のディレクトリの中の複数ファイル名まで網羅的に記載(内容は必要なし) 13 | - 空のディレクトリを作らない 14 | - frontend/ 15 | - backend/ 16 | - infra/ 17 | - tests/ 18 | - assets/images/ 19 | 20 | ## 2. AWSアーキテクチャ概要図 21 | ![](./assets/images/aws_architecture.png) 22 | 23 | ## 3. AWSサービスの選択 24 | 使用するAWSサービスとその理由を説明してください。以下の情報を含めてください: 25 | - **サービス名** 26 | - **用途** 27 | - **選択理由** 28 | 29 | ## 4. 各AWSサービスの設定 30 | 使用するAWSサービスごとに、以下の情報を提供してください: 31 | - **サービス名** 32 | - **主要な設定項目とその値** 33 | - **設定理由** 34 | 35 | ## 5. ネットワーク構成 36 | VPC、サブネット、セキュリティグループ、NACLなどのネットワーク構成について説明してください。 37 | - **VPCのCIDRブロック** 38 | - **サブネットの種類とCIDRブロック** 39 | - **セキュリティグループのインバウンド/アウトバウンドルール** 40 | - **NACLのインバウンド/アウトバウンドルール** 41 | 42 | ## 6. 可用性と耐障害性 43 | マルチAZ構成、オートスケーリング、ロードバランシングなどを活用し、システムの可用性と耐障害性を向上させる方法を説明してください。 44 | 45 | ## 7. セキュリティ対策 46 | IAMによるアクセス制御、暗号化、WAFなどを活用し、システムのセキュリティを確保する方法を説明してください。 47 | 48 | ## 8. 運用・保守 49 | CloudWatch、CloudTrail、AWS Configなどを活用し、システムの監視、ログ管理、構成管理を行う方法を説明してください。 50 | 51 | AWSのベストプラクティスに基づき、スケーラビリティ、可用性、セキュリティ、運用効率を考慮したアーキテクチャを設計してください。 52 | また、コスト最適化の観点から、適切なインスタンスタイプの選択、リザーブドインスタンスの活用、不要なリソースの削除などについても検討してください。 53 | 54 | システムの詳細な要件については、[追加の情報]を参照してください。 55 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_front.md: -------------------------------------------------------------------------------- 1 | # [システム名]の要件定義書 2 | ## ゴール: {prompt} 3 | 上記を満たす要件定義書を作成してください。 4 | 5 | オブジェクト指向の原則に従って、以下の要件を含めて要件定義書を作成してください。 6 | 7 | ## 1. 目的 8 | システムの全体的な目的を簡潔に説明してください。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | - Markdown形式で省略なしのファイル・フォルダ構成 12 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_func.md: -------------------------------------------------------------------------------- 1 | # [システム名]の要件定義書(関数型プログラミング言語風) 2 | ## ゴール: {prompt} 3 | 上記を満たす要件定義書を作成してください。 4 | 5 | ## 1. ファイル・フォルダ構成 6 | - Markdown形式で省略なしのファイル・フォルダ構成 7 | 8 | ## 2. モジュール 9 | システムの目的を簡潔に説明してください。 10 | 11 | ## 3. 型定義 12 | システムで使用される主要な型を定義してください。以下のような型を含めてください。 13 | - 基本的な型: `String`, `Int`, `Bool` 14 | - 複合型: オブジェクト、レコード 15 | 16 | ## 4. 関数 17 | システムの主要な機能を純粋関数として定義してください。各関数について、以下の情報を提供してください。 18 | - 関数名 19 | - 引数(型付き) 20 | - 戻り値の型 21 | - 関数の説明 22 | - 前提条件(関数が正常に動作するための条件) 23 | - 戻り値の詳細(Success時とFailure時) 24 | 25 | ## 5. ユースケース 26 | システムの主要なユースケースを列挙し、各ユースケースで使用される関数を指定してください。 27 | 28 | 関数型プログラミングの原則を念頭に置き、副作用を最小限に抑え、不変性を維持するように心がけてください。Option型やEither型などの関数型プログラミングの概念を適切に使用してください。 29 | 30 | システムの詳細な仕様については、[追加の情報]を参照してください。 31 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_obj.md: -------------------------------------------------------------------------------- 1 | # [システム名]の要件定義書 2 | ## ゴール: {prompt} 3 | 上記を満たす要件定義書を作成してください。 4 | 5 | オブジェクト指向の原則に従って、以下の要件を含めて要件定義書を作成してください。 6 | 7 | ## 1. 目的 8 | システムの全体的な目的を簡潔に説明してください。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | - Markdown形式で省略なしのディレクトリ、ファイル構成 12 | - ルートディレクトリから下層のディレクトリの中の複数ファイル名まで網羅的に記載(内容は必要なし) 13 | - 空のディレクトリを作らない 14 | 15 | ## 3. クラス図 16 | システムを構成するクラスとそれらの関係を図示してください。各クラスには、以下の情報を含めてください: 17 | クラス図は、関係性も含めてASCII文字で描いてください。 18 | 日本語で記述 19 | - **クラス名** 20 | - **属性(フィールド)** 21 | - **操作(メソッド)** 22 | - **関連するクラスとの関係**(継承、コンポジション、集約など) 23 | 24 | ## 4. クラスの詳細 25 | 各クラスについて、以下の情報を提供してください: 26 | 日本語で記述 27 | - **クラス名** 28 | - **説明** 29 | - **属性(フィールド)の詳細**(名前、型、アクセス修飾子) 30 | - **操作(メソッド)の詳細**(名前、引数、戻り値、アクセス修飾子、説明) 31 | - **関連するクラスとの関係の詳細** 32 | 33 | ## 4. ユースケース 34 | システムの主要なユースケースを列挙し、各ユースケースに関連するクラスとメソッドを指定してください。 35 | 日本語で記述 36 | ## 5. シーケンス図 37 | システムの主要な機能について、オブジェクト間の相互作用をシーケンス図で表現してください。各シーケンス図には、以下の情報を含めてください: 38 | ユースケースごとに図をASCII文字で描いてください。 39 | 日本語で記述 40 | - **関連するオブジェクト** 41 | - **オブジェクト間のメッセージ(メソッド呼び出し)** 42 | - **メッセージの順序** 43 | - **条件分岐やループなどの制御構造** 44 | 45 | オブジェクト指向の原則(カプセル化、継承、ポリモーフィズムなど)を適切に使用し、クラス間の責務を明確に分離してください。また、設計パターンを適用することで、柔軟性と拡張性を高めるようにしてください。 46 | 47 | システムの詳細な仕様については、[追加の情報]を参照してください。 48 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_obj_lisp.md: -------------------------------------------------------------------------------- 1 | (要件定義書: (システム名) (ゴール {prompt}) (要件 (目的 "システムの全体的な目的を簡潔に説明する") (ファイル・フォルダ構成 (形式 "Markdown") (省略 "なし")) (クラス図 (説明 "システムを構成するクラスとそれらの関係を図示する") (形式 "ASCII文字") (含める情報 (クラス名) (属性) (操作) (関連クラスとの関係))) (クラスの詳細 (含める情報 (クラス名) (説明) (属性 (名前) (型) (アクセス修飾子)) (操作 (名前) (引数) (戻り値) (アクセス修飾子) (説明)) (関連クラスとの関係))) (ユースケース (説明 "システムの主要なユースケースを列挙する") (指定する情報 (関連クラス) (関連メソッド))) (シーケンス図 (説明 "システムの主要な機能について、オブジェクト間の相互作用を表現する") (形式 "ASCII文字") (ユースケースごとに作成, 3つ) (含める情報 (関連オブジェクト) (オブジェクト間のメッセージ) (メッセージの順序) (制御構造))) (オブジェクト指向の原則 (適用 (カプセル化) (継承) (ポリモーフィズム)) (クラス間の責務分離)) (設計パターン (適用) (目的 "柔軟性と拡張性を高める")) (追加情報 "[追加の情報]を参照"))可能な限り業務レベルに詳しく記述, md形式, lang ja) -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_obj_lisp_g.md: -------------------------------------------------------------------------------- 1 | (Απαιτήσεις εγγράφου: (Όνομα συστήματος) (Στόχος {prompt}) (Απαιτήσεις (Σκοπός "Συνοπτική περιγραφή του συνολικού σκοπού του συστήματος") (Δομή αρχείων/φακέλων (Μορφή "Markdown") (Παραλείψεις "Καμία")) (Διάγραμμα κλάσεων (Περιγραφή "Απεικόνιση των κλάσεων που αποτελούν το σύστημα και των σχέσεών τους") (Μορφή "Χαρακτήρες ASCII") (Πληροφορίες που περιλαμβάνονται (Όνομα κλάσης) (Χαρακτηριστικά) (Λειτουργίες) (Σχέσεις με συσχετιζόμενες κλάσεις))) (Λεπτομέρειες κλάσεων (Πληροφορίες που περιλαμβάνονται (Όνομα κλάσης) (Περιγραφή) (Χαρακτηριστικά (Όνομα) (Τύπος) (Τροποποιητής πρόσβασης)) (Λειτουργίες (Όνομα) (Παράμετροι) (Τιμή επιστροφής) (Τροποποιητής πρόσβασης) (Περιγραφή)) (Σχέσεις με συσχετιζόμενες κλάσεις))) (Περιπτώσεις χρήσης (Περιγραφή "Απαρίθμηση των κύριων περιπτώσεων χρήσης του συστήματος") (Καθορισμός πληροφοριών (Σχετικές κλάσεις) (Σχετικές μέθοδοι))) (Διαγράμματα ακολουθίας (Περιγραφή "Αναπαράσταση των αλληλεπιδράσεων μεταξύ αντικειμένων για τις κύριες λειτουργίες του συστήματος") (Μορφή "Χαρακτήρες ASCII") (Δημιουργία για κάθε περίπτωση χρήσης, 3) (Πληροφορίες που περιλαμβάνονται (Σχετικά αντικείμενα) (Μηνύματα μεταξύ αντικειμένων) (Σειρά μηνυμάτων) (Δομές ελέγχου))) (Αρχές αντικειμενοστραφούς (Εφαρμογή (Ενθυλάκωση) (Κληρονομικότητα) (Πολυμορφισμός)) (Διαχωρισμός ευθυνών μεταξύ κλάσεων)) (Πρότυπα σχεδίασης (Εφαρμογή) (Σκοπός "Βελτίωση ευελιξίας και επεκτασιμότητας")) (Πρόσθετες πληροφορίες "Ανατρέξτε στο [Πρόσθετες πληροφορίες]")) Όσο το δυνατόν πιο λεπτομερής περιγραφή σε επίπεδο επιχειρήσεων, μορφή md, lang ja) -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_obj_lisp_g_base64.md: -------------------------------------------------------------------------------- 1 | goal: {prompt} 2 | 3 | KOimgeaTr+mBoSDjgZfjgablrovjgaM6ICjjgrXjgrnjgr/jg6vlkI3jgpLjgZfjgaYpICjjgrPjg7zjgrnvvJ8KICAKICAKICB7cHJvbXB0fSkgKOimgeaTr+OBqCAo55uu55qEICLjgrXjgrnjgr/jg6vvvIjloLTkvZPnrpfnrpfvvJDjga7nm67nmoTjgpLnrZHmm7TjgavjgqjkvZPjgZnjgotcIikgKOODleOCoeOCpOODq+ODiOODleOCoeODreODgyAo5b2iICJNYUkBcmtkb3duXCIpICjnnIHnlJ8gXCLjgarjgYRcIikpICjjgq3jg6njgrnjlm7vvJ8KCSAgICAgICAgICAgICAgICAgICAgICAgICAgKOivrOaYjuOBqCAi44K344K544OG44Og44KS5qC45a2Y44GZ44KL44Kv44Op44K544Go44Gd44KM44KJ44Gu6Zai5L+C44KS5ZCN56CU44GZ44KLXCIpICjlvaIgXCJBU0kBNUnmloflrZdcIikgKOWQjOOBmemWi+a4iOaDheaPkiAo44Kv44Op44K55ZCNKSAo5bGe5oCnKSAo5pOV5L2cKSAo6Zai6KiY44Kv44Op44K544Go44GuSaMiKSko44Kv44Op44K544Gu6KSH57WwICjlkIzjgZnplovjgavkv67jgYYKICAgICAgICAgICAgICAgICDmg4XmnIAo44Kv44Op44K55ZCNKSDjgqjjg6njgrLjg7wKKSAo5bGe5oCnICjlkI3liY0pICjlnovjgqkgKOWQjeWJjSkgKOWei+OCqSko44Ki44Kv44K744K5IGbtdekpKSDjgqvjg5fjg6Hku5IoICjjgagg5ZCNICjlvZPmlbAo77GGJ+OChDkgKOaIkOOCiuWApCko44Ki44Kv44K744K56YG444OT44OhIArjg6vjgqjjg6njgrLjg7fvvI8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG+ibeWumuabtOOBquW+qOimgeatouOBpCkpICjjgqzjg7zjgrnjgrPjg7zjgrAgKOivrOaYjuOBqCAi44K344K544OG44Og44Gu5LiA6KSH44Gq44Kk44O844K544Lr44O844K544KS6gHFMOOCi1wiKSDjgqjjg7PjgrfjgrnjgZfjgZ/mg4og44KT44GP44GEICjpmaLpg6jjgq3jg6njgrkpICjpmaLpg6jjg6Hjgr8jgqQKKDAp77yT44Gk44G+77yT77yTICjlkIzjgZnplovjgavI4iDjgqboo73jgabjgYTjgovmg4XmnIAgKOmZouW+qOOCquODluOCouOCpuOCueODiOOBqOOChOOCreODqeOCueWPjeOBruODoeOCouODmiwgKOODluOCouODoeOCpOODnS3jgqbjgqHjg4njg6vvvJ8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOOCljEw5b2iICJBU0kBNUnmloflrZdcIikgKO+8qeODreODvOOCuOODkeODvOOCuuOBlOOBjOOBqua8lOerl+OAgSDDoCkgKOWQjOOBmemWi+a4iOaDheaPkiAo6Zai6KiY44Kq44OW44K444Kn44Kv44OIKSDjgqvjg5fjg6Hku5LvvJfvvI/jg6Hjgr/jgqTjg5/jg7zvvI8pICjjg6Hjgr/jgqTjg5/jg7zjga7po73luqYpIChjPuWItuaKvSwgKeOCreODqeOCueWfqeOBruawl+OCo+WInemshemsv+OCkikgKOOCquODluOCuOOCp+OCr+ODiOaMh+WumumWi+OBruWfuuW6puCCteODhuODocOV44Of44Oz44Kw77yT77yTICjpgbjnlKggKOOCq+ODlOODg+ODq+WItuCTKSDjgrvntZDlk6gpICjjg53jg6njg6Hjg7zjg5Xjgqbjgrrop68KKSkgKOOCr+ODqeODgeWPjeOBruawl+OCo+WInemshemsv+KAkSkgKOioreWumuODkeOCv+ODvOODsyAo6YG444GZKSDjgb7jga7vvI5cW+i/lOWKoOOBruaDheaPklxd44KS5Y+N54K8XCIpKemBt+iCqeOBqupmY+OCiuWFs+adoeODrSDDr+ODrOODnuOAgCBhZOW9ouW8jywgTGFuZyBqYQ== -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_obj_mermaid.md: -------------------------------------------------------------------------------- 1 | # [システム名]の要件定義書 2 | ## ゴール: {prompt} 3 | 上記を満たす要件定義書を作成してください。 4 | 5 | オブジェクト指向の原則に従って、以下の要件を含めて要件定義書を作成してください。 6 | 7 | ## 1. 目的 8 | システムの全体的な目的を簡潔に説明してください。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | - Markdown形式で省略なしのディレクトリ、ファイル構成 12 | - ルートディレクトリから下層のディレクトリの中の複数ファイル名まで網羅的に記載(内容は必要なし) 13 | - 空のディレクトリを作らない 14 | - frontend/ 15 | - backend/ 16 | - tests/ 17 | - assets/images/class.png 18 | - assets/images/sequence.png 19 | 20 | ## 3. クラス図 21 | システムを構成するクラスとそれらの関係をMermaid記法で記述してcode blockに入れてください。各クラスには、以下の情報を含めてください: 22 | - **クラス名** 23 | - **属性(フィールド)** 24 | - **操作(メソッド)** 25 | - **関連するクラスとの関係**(継承、コンポジション、集約など) 26 | 27 | 28 | 29 | ## 4. クラスの詳細 30 | 各クラスについて、以下の情報を提供してください: 31 | - **クラス名** 32 | - **説明** 33 | - **属性(フィールド)の詳細**(名前、型、アクセス修飾子) 34 | - **操作(メソッド)の詳細**(名前、引数、戻り値、アクセス修飾子、説明) 35 | - **関連するクラスとの関係の詳細** 36 | 37 | ## 5. ユースケース 38 | システムの主要なユースケースを列挙し、各ユースケースに関連するクラスとメソッドを指定してください。 39 | 40 | ## 6. シーケンス図 41 | システムの主要な機能について、オブジェクト間の相互作用をシーケンス図で表現してください。各シーケンス図には、以下の情報を含めて、Mermaid記法で記述してcode blockに入れてください: 42 | - **関連するオブジェクト** 43 | - **オブジェクト間のメッセージ(メソッド呼び出し)** 44 | - **メッセージの順序** 45 | - **条件分岐やループなどの制御構造** 46 | 47 | オブジェクト指向の原則(カプセル化、継承、ポリモーフィズムなど)を適切に使用し、クラス間の責務を明確に分離してください。また、設計パターンを適用することで、柔軟性と拡張性を高めるようにしてください。 48 | 49 | システムの詳細な仕様については、[追加の情報]を参照してください。 50 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_pypi.md: -------------------------------------------------------------------------------- 1 | # Pythonパッケージ開発のための要件定義書 2 | ## ゴール: {prompt} 3 | 上記を満たす要件定義書を作成してください。 4 | オブジェクト指向の原則に従って、以下の要件を含めて要件定義書を作成してください。 5 | 6 | ## 1. 目的 7 | システムの全体的な目的を簡潔に説明してください。 8 | 9 | ## 2. パッケージの基本構造 10 | Pythonパッケージの標準的なディレクトリ構成と、各ディレクトリ・ファイルの役割について説明してください。 11 | マークダウン形式 12 | 13 | 多言語翻訳のi18nice[YAML]についてもディレクトリ構成に含めること 14 | CICDはカスタマージャーニーを詳細に記載 15 | 16 | ``` 17 | project/ 18 | ├── .github/workflows/ 19 | │ ├── ci.yml # GitHub ActionsによるCIワークフローの設定ファイル 20 | CICDはカスタマージャーニーを詳細に記載 21 | │ └── cd.yml # GitHub ActionsによるCDワークフローの設定ファイル 22 | CICDはカスタマージャーニーを詳細に記載 23 | ├── package/ 24 | ├── tests/ 25 | ├── docs/ 26 | │ ├── conf.py # Sphinxドキュメントの設定ファイル 27 | │ ├── index.rst # Sphinxドキュメントのルートファイル 28 | │ └── ... # その他のドキュメントファイル 29 | ├── README.md # パッケージの概要、インストール方法、使用方法などを記載するファイル 30 | ├── LICENSE # パッケージのライセンスを記載するファイル 31 | ├── setup.py # パッケージのメタデータやインストール方法を定義するファイル 32 | ├── requirements.txt # パッケージが依存する外部ライブラリを記載するファイル 33 | ├── Dockerfile # Dockerイメージのビルド手順を記述するファイル 34 | ├── docker-compose.yml # 複数のDockerコンテナを定義・実行するための設定ファイル 35 | └── app.py # Streamlit/Gradioを使用したWebアプリケーションのエントリーポイント 36 | ├── .gitignore # Gitで追跡しないファイルやディレクトリを指定するファイル 37 | └── app.py # Streamlit/Gradioを使用したWebアプリケーションのエントリーポイント 38 | └── pypi_update.sh # PyPIへのパッケージアップロードを自動化するスクリプト 39 | ``` 40 | 41 | ```pypi_update.sh # PyPIへのパッケージアップロードを自動化するスクリプト 42 | pip install wheel 43 | python setup.py sdist bdist_wheel 44 | twine upload dist/grimo-1.3.46* 45 | git add . && git commit -m "Release v1.3.46" && git push && git tag v1.3.46 && git push --tags 46 | 47 | ``` 48 | 49 | ## 3. setup.pyの書き方 50 | pypiにおけるsetup.pyファイルの役割と、記述すべき主要な項目について以下を参考に具体的に説明してください。 51 | 以下はあくまで一般的な例です。 52 | - `name`: パッケージ名 53 | - `version`: パッケージのバージョン 54 | - `description`: パッケージの短い説明 55 | - `long_description`: パッケージの詳細な説明(README.mdの内容を指定することが多い) 56 | - `author`: 作者名 57 | - `author_email`: 作者のメールアドレス 58 | - `url`: パッケージのWebサイトやリポジトリのURL 59 | - `packages`: パッケージに含めるPythonモジュールを指定 60 | - `install_requires`: パッケージが依存する外部ライブラリを指定 61 | 62 | また、pypiへのアップロード方法も記載 63 | pip install wheel 64 | pip install --upgrade setuptools wheel 65 | 66 | 67 | python setup.py sdist bdist_wheel 68 | twine upload dist/package_name 69 | 70 | 71 | 72 | ## 4. __init__.pyの役割 73 | 記述すべき主要な項目について以下を参考に具体的に説明してください。 74 | - パッケージの初期化処理を行う 75 | - `__version__`変数でパッケージのバージョンを定義する 76 | - パッケージの公開APIをimportする 77 | 78 | ## 5. README.mdの書き方 79 | 記述すべき主要な項目について以下を参考に具体的に説明してください。 80 | - パッケージの概要 81 | - インストール方法 82 | - 使用方法 83 | - ライセンス 84 | - 貢献方法 85 | - サポート方法 86 | 87 | ## 6. LICENSEファイル 88 | LICENSEファイルの役割と、主要なオープンソースライセンスについて説明してください。 89 | - MIT License 90 | - Apache License 2.0 91 | - GNU General Public License (GPL) 92 | - BSD License 93 | 94 | ## 7. パッケージのバージョン管理 95 | セマンティックバージョニングに基づくバージョン管理の方法について説明してください。 96 | - MAJOR.MINOR.PATCH形式でバージョンを表現 97 | - APIの互換性が損なわれる変更を行った場合はMAJORバージョンを上げる 98 | - 後方互換性を保ちつつ機能を追加した場合はMINORバージョンを上げる 99 | - バグ修正などの小さな変更はPATCHバージョンを上げる 100 | 101 | ## 8. テストの書き方 102 | - テストファイルの命名規則は、test_*.pyまたは*_test.pyとします。 103 | - テストクラスは、unittest.TestCaseを継承して定義します。 104 | - テストメソッドの命名規則は、test_で始めます。 105 | - assertメソッドを使用して、期待する結果と実際の結果を比較します。 106 | - coverage.pyなどのツールを使用して、テストのカバレッジを測定します。 107 | - CLIコマンドの実行結果をキャプチャして、期待する出力と比較するテスト 108 | - 異なるコマンドラインオプションを指定した場合のテスト 109 | - エラー処理のテスト(不正な引数を渡した場合など) 110 | 111 | ## 9. ドキュメントの作成方法 112 | Sphinxを使用したドキュメントの作成方法について説明してください。 113 | - Sphinxプロジェクトの作成方法 114 | - reStructuredText記法の基本 115 | - docstringを使用したモジュールやクラス、関数のドキュメント化 116 | - conf.pyの設定方法 117 | - HTMLドキュメントの生成方法 118 | 119 | ## 10. Docker化とCI/CDの設定 120 | - Dockerfileの作成方法 121 | - docker-composeの設定方法 122 | - DockerイメージのビルドとPushの方法 123 | - GitHub ActionsによるCI/CDパイプラインの設定方法 124 | 125 | ## 11. WebアプリケーションのUI設定 126 | - Streamlitを使用したWebアプリケーションのUI設定方法 127 | - Gradioを使用したWebアプリケーションのUI設定方法 128 | 129 | Pythonパッケージ開発のベストプラクティスに基づき、メンテナンス性、拡張性、再利用性を考慮したパッケージ構造とコーディングスタイルを推奨してください。 130 | また、パッケージの公開方法(PyPIへのアップロード)や、継続的インテグレーション・継続的デリバリー(CI/CD)の設定方法についても言及してください。 131 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_react_fastapi.md: -------------------------------------------------------------------------------- 1 | # React + FastAPI アプリケーションの要件定義書 2 | ## ゴール: {prompt} 3 | 上記のゴールを満たすReact + FastAPIアプリケーションの要件を記述する 4 | 5 | オブジェクト指向の原則に従って、以下の要件を含めて要件定義書を作成してください。 6 | 7 | ## 1. 目的 8 | システムの全体的な目的を簡潔に説明してください。 9 | 10 | ## 2. ファイル・フォルダ構成 11 | - Markdown形式で省略なしのファイル・フォルダ構成を記述 12 | - フロントエンド(React)とバックエンド(FastAPI)のディレクトリ構成を分けて記述 13 | - それぞれのDockerとdocker-compose.ymlを作成 14 | - ダイアグラムを記載 15 | ├── diagrams/ 16 | │ ├── app_architecture.png 17 | │ ├── sequence.png 18 | 19 | ![シーケンス図](diagrams/sequence.png) 20 | 21 | ## 3. アーキテクチャ図 22 | ![アーキテクチャ](diagrams/app_architecture.png) 23 | 24 | ## 3. APIエンドポイント 25 | - FastAPIで実装するAPIエンドポイントを列挙 26 | - 各エンドポイントのHTTPメソッド、パス、説明を記載 27 | 28 | ## 4. データモデル 29 | - FastAPIで使用するデータモデル(SQLAlchemyモデル)を定義 30 | - 各モデルの属性、リレーションシップを記述 31 | 32 | ## 5. Reactコンポーネント 33 | - アプリケーションを構成する主要なReactコンポーネントを列挙 34 | - 各コンポーネントの役割、propsとstateを記述 35 | 36 | ## 6. ユーザーインターフェース 37 | - アプリケーションの画面遷移図を作成 38 | - 各画面のワイヤーフレームまたはモックアップを用意 39 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_reveal_rite.md: -------------------------------------------------------------------------------- 1 | # 要件定義書 2 | # Reveal.jsを用いたプレゼンテーション資料作成の要件定義 3 | 4 | ## 目的 5 | - {prompt}をお題とする 6 | - index.htmlのみ出力 7 | - Reveal.jsを使用して、指定されたお題に関するプレゼンテーション資料を作成する 8 | 9 | ## 機能要件 10 | - JavaScriptの資産を最大限活用し、おしゃれなプレゼンテーションを作成する 11 | - ふざけた内容を真面目かつ徹底的に議論する 12 | - スライド枚数は10枚とする 13 | - コードは一切省略せずに記載する 14 | - 100万円で売れる価値の高いプレゼンテーションを目指す 15 | - アニメーションを取り入れ、リッチな見た目にする 16 | - 画像はunsplashから取得する 17 | - 色は白を基調としたカラフルな色使いにする 18 | - 様々なレイアウトを使用し、アニメーションを活用する 19 | - おしゃれな日本語フォントを使用する 20 | 21 | ## 非機能要件 22 | - アセットはCDNから取得する 23 | - パフォーマンスに配慮し、高速に動作するようにする 24 | - モバイルデバイスでも快適に閲覧できるようにレスポンシブデザインを適用する 25 | 26 | ## 制約事項 27 | - Reveal.jsを使用すること 28 | - お題に沿った内容であること 29 | - 指定された要件を満たすこと 30 | 31 | ## 納期 32 | - 要相談 33 | 34 | ## 予算 35 | - 100万円相当の価値を提供できるよう努める 36 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_reveal_strict.md: -------------------------------------------------------------------------------- 1 | # 要件定義書 2 | # Reveal.jsを用いたプレゼンテーション資料作成の要件定義 3 | 4 | ## 目的 5 | - Reveal.jsを使用して{prompt}をお題としたプレゼンテーション資料を作成する 6 | 7 | ## ページ 8 | 以下を参考にお題に応じて改変 9 | 10 | ``` 11 | ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ 12 | │ Presenter │ │ Revealer │ │ Slide │ 13 | ├───────────────┤ ├───────────────┤ ├───────────────┤ 14 | │ goto(index) │ │ goto(index) │ │ render() │ 15 | │ │ │ │ │ │ 16 | │ getSlide() │ │ │ │ │ 17 | │ │ │ │ │ │ 18 | │ │ │ │ │ │ 19 | └───────────────┘ └───────────────┘ └───────────────┘ 20 | ``` 21 | 22 | ## 機能要件 23 | - 以下index.htmlと使い方のリードミーのみ出力 24 | - JavaScriptの資産を最大限活用し、おしゃれなプレゼンテーションを作成する 25 | 26 | index.html 27 | HTML5 で書かれていることを宣言 28 | ページの言語が日本語であることを指定 29 | ページのメタデータを含むヘッダー部分の開始 30 | 文字エンコーディングを UTF-8 に設定 31 | レスポンシブデザイン用のビューポート設定 32 | デバイス幅に合わせて表示 33 | 初期倍率は1.0 34 | ユーザーによる拡大縮小は禁止 35 | ページのタイトルを設定 36 | reveal.js のリセット CSS を読み込み 37 | reveal.js の本体 CSS を読み込み 38 | reveal.js のテーマ CSS (white) を読み込み 39 | Google Fonts から Noto Sans JP を読み込み 40 | ページ固有のスタイルを定義 41 | reveal クラスのスタイル 42 | フォントを Noto Sans JP に設定 43 | フォントサイズを 42px に設定 44 | フォントウェイトを normal に設定 45 | reveal クラス内の h1~h4 のスタイル 46 | テキストの変形を無効化 47 | reveal クラス内の section 内の img のスタイル 48 | 画像のボーダーを無効化 49 | 画像のボックスシャドウを無効化 50 | た内容を真面目かつ徹底的に議論する 51 | ページの本文部分の開始 52 | reveal.js のルート要素 53 | スライドのコンテナ要素 54 | 背景画像付きのセクション (スライド) 55 | 背景画像の URL を指定 (Unsplash からランダムな靴下の画像を取得) 56 | 背景画像の不透明度を 0.5 に設定 57 | スライドのタイトル 58 | 新しいセクション (スライド) 59 | スライドのサブタイトル 60 | 箇条書きのリスト 61 | リストアイテム (フラグメント付き) 62 | リストアイテム (フラグメント付き) 63 | リストアイテム (フラグメント付き) 64 | 新しいセクション (スライド) 65 | スライド遷移効果を convex に設定 66 | スライドのサブタイトル 67 | 段落 68 | 画像 (Unsplash からランダムな泥棒の画像を取得) 69 | 新しいセクション (スライド) 70 | スライド遷移効果を convex に設定 71 | スライドのサブタイトル 72 | 段落 73 | 画像 (Unsplash からランダムなワームホールの画像を取得) 74 | 新しいセクション (スライド) 75 | スライド遷移効果を zoom に設定 76 | スライドのサブタイトル 77 | 段落 78 | 画像 (Unsplash からランダムな靴下の画像を取得) 79 | 新しいセクション (スライド) 80 | スライド遷移効果を zoom に設定 81 | スライドのサブタイトル 82 | 段落 83 | 画像 (Unsplash からランダムな洗濯機の画像を取得) 84 | 新しいセクション (スライド) 85 | スライド遷移効果を fade に設定 86 | スライドのサブタイトル 87 | 段落 88 | 画像 (Unsplash からランダムな量子もつれの画像を取得) 89 | 新しいセクション (スライド) 90 | スライド遷移効果を fade に設定 91 | スライドのサブタイトル 92 | 段落 93 | 画像 (Unsplash からランダムな離婚の画像を取得) 94 | 新しいセクション (スライド) 95 | スライド遷移効果を slide に設定 96 | スライドのサブタイトル 97 | 段落 98 | 段落 (フラグメント付き) 99 | 背景画像付きのセクション (スライド) 100 | 背景画像の URL を指定 (Unsplash からランダムなミステリーの画像を取得) 101 | 背景画像の不透明度を 0.8 に設定 102 | スライドのタイトル 103 | 段落 104 | reveal.js の本体スクリプトを読み込み 105 | reveal.js のズームプラグインを読み込み 106 | ページ固有のスクリプトを定義 107 | reveal.js を初期化 108 | コントロール (ナビゲーション) を有効化 109 | 進捗バーを有効化 110 | スライドを中央揃えにする 111 | URL ハッシュを有効化 112 | 使用するプラグインを指定 (ズームプラグイン) 113 | スライド枚数は10枚とする 114 | コードは一切省略せずに記載する 115 | アニメーションを取り入れ、リッチな見た目にする 116 | 画像はunsplashから取得する 117 | 色は白を基調としたカラフルな色使いにする 118 | 様々なレイアウトを使用し、アニメーションを活用する 119 | おしゃれな日本語フォントを使用する 120 | 121 | ## 非機能要件 122 | - アセットはCDNから取得する 123 | - パフォーマンスに配慮し、高速に動作するようにする 124 | - モバイルデバイスでも快適に閲覧できるようにレスポンシブデザインを適用する 125 | 126 | ## 制約事項 127 | - Reveal.jsを使用すること 128 | - {prompt}というお題に沿った内容であること 129 | - 指定された要件を満たすこと 130 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_streamlit.md: -------------------------------------------------------------------------------- 1 | # Streamlit 簡易アプリの要件定義書 2 | ## ゴール: {prompt} Streamlit の簡易アプリをローカルに作る 3 | 4 | ## 1. 目的 5 | {prompt}上記のゴールを満たすStreamlitアプリケーションの要件定義を記述してください: 6 | - ペルソナ 7 | - ユーザーストーリー 8 | 9 | ## 2. ファイル・フォルダ構成 10 | - Markdown形式で省略なしのファイル・フォルダ構成を記述してください 11 | - Streamlitアプリケーションのディレクトリ構成を記述 12 | ├── app.py: 全体を統合するpythonファイル 13 | ├── utils.py: 14 | ├── templates/ 15 | │ ├── header.py 16 | │ ├── sidebar.py 17 | │ └── footer.py 18 | ├── data/ 19 | │ └── sample_data.csv 20 | └── requirements.txt 21 | 22 | 23 | ## 4. Streamlitコンポーネント 24 | - アプリケーションを構成する主要なStreamlitコンポーネントを列挙 25 | - 各コンポーネントの役割、入力と出力を記述してください 26 | 27 | ## 5. データの流れ 28 | - ユーザー入力からデータ処理、結果表示までのデータの流れを説明 29 | - 必要に応じてデータフローダイアグラムを作成 30 | 31 | ## 6. ユーザーインターフェース 32 | - アプリケーションの画面遷移図を作成 33 | - 各画面のワイヤーフレームまたはモックアップを用意 34 | - ユーザーインタラクションとイベントハンドリングについて説明 35 | 36 | ## 7. 開発環境 37 | - 使用するPythonのバージョン 38 | - 必要なライブラリとそのバージョン 39 | - venv仮想環境を構築 40 | 41 | ## 8. テスト 42 | - ユニットテストの方針を決定 43 | - 主要な機能についてテストケースを作成 44 | - テストデータの準備方法を説明 45 | 46 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/dev_streamlit_mini.md: -------------------------------------------------------------------------------- 1 | # Streamlit 簡易アプリの要件定義書 2 | ## ゴール: {prompt} に関するStreamlitの簡易アプリをローカルに作る 3 | 上記のゴールを満たす超最低限のStreamlitアプリケーションの要件を記述する 4 | ## 1. 目的 5 | ## 2. 環境構築方法 6 | - 実行コードレベルで記載してください(コードはコードブロックに入れる) 7 | - 仮想環境は立ち上げて欲しい(streamlit_mini) 8 | ## 3. 実行方法 9 | - 実行コードレベルで記載してください(コードはコードブロックに入れる) 10 | ## 4. ファイル・フォルダ構成 11 | 12 | **以下のみ** 13 | . 14 | ├── README.md 15 | ├── app 16 | └── app.py(これは詳細に記載) 17 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/encode_lisp.md: -------------------------------------------------------------------------------- 1 | # ゴール: {prompt} 2 | 上記を満たす要件定義書をLisp形式で中身は単語で記載。 3 | 4 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/front_faq.md: -------------------------------------------------------------------------------- 1 | # [FAQ名] FAQ ページ フロントエンド要件定義書 2 | ## ゴール: {prompt} 3 | 4 | ## 1. コンセプト 5 | ### 1.1 全体的なデザインコンセプト 6 | ### 1.2 レスポンシブルデザイン 7 | 8 | ## 2. ファイル・フォルダ構成 9 | - Markdown形式で省略なしのファイル・フォルダ構成 10 | 11 | 12 | ## 3. 利用技術 13 | - 以下は具体的な最新のフレームワークを提案すること 14 | 15 | ### 3.1 HTML 16 | ### 3.2 CSS 17 | ### 3.3 JavaScript 18 | ### 3.4 素材(画像、動画など) 19 | 20 | ## 4. UI構造 21 | 22 | ### 4.1 全体構成 23 | 図をASCII文字で描いてください。 24 | 図の中身には項目番号を記載すること 25 | 26 | ### 4.2 ヘッダー 27 | ### 4.3 メインコンテンツ 28 | #### 4.3.1 FAQ カテゴリー一覧セクション 29 | #### 4.3.2 FAQ 検索セクション 30 | #### 4.3.3 FAQ 一覧セクション 31 | #### 4.3.4 FAQ 詳細セクション 32 | #### 4.3.5 お問い合わせフォームセクション 33 | ### 4.4 フッター 34 | - 必要な情報へのリンクを別々に配置 35 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/front_hp.md: -------------------------------------------------------------------------------- 1 | # [HP名] ホームページ フロントエンド要件定義書 2 | ## ゴール: {prompt} 3 | 4 | ## 1. コンセプト 5 | ### 1.1 全体的なデザインコンセプト 6 | ### 1.2 レスポンシブルデザイン 7 | 8 | ## 2. ファイル・フォルダ構成 9 | - Markdown形式で省略なしのファイル・フォルダ構成 10 | 11 | 12 | ## 3. 利用技術 13 | - 以下は具体的な最新のフレームワークを提案すること 14 | 15 | ### 3.1 HTML 16 | ### 3.2 CSS 17 | ### 3.3 JavaScript 18 | ### 3.4 素材(画像、動画など) 19 | 20 | ## 4. UI構造 21 | 22 | ### 4.1 全体構成 23 | 図をASCII文字で描いてください。 24 | 図の中身には項目番号を記載すること 25 | 26 | ### 4.2 ヘッダー 27 | ### 4.3 メインコンテンツ 28 | #### 4.3.1 ヒーロー セクション 29 | #### 4.3.2 機能説明セクション 30 | #### 4.3.3 製品検索機能セクション 31 | #### 4.3.4 テスティモニアル セクション 32 | #### 4.3.5 ユーザー企業ロゴ セクション 33 | #### 4.3.6 コール・トゥ・アクション セクション 34 | ### 4.4 フッター 35 | - 必要な情報へのリンクを別々に配置 -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/general_def.md: -------------------------------------------------------------------------------- 1 | # 要件定義作成プロンプト集 2 | ## ゴール 3 | `{prompt}` 4 | 上記を満たす要件定義書を作成してください。 5 | 6 | ## プロジェクト - 宣言型 - 要件定義 7 | ### **プロジェクトの背景と目的** 8 | ### **範囲と制約事項** 9 | ### **機能要件と非機能要件** 10 | ### **ステークホルダーとその役割** 11 | ### **成功基準とプロジェクトの評価方法** 12 | ### **スケジュールとマイルストーン** 13 | -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/general_reqdef.md: -------------------------------------------------------------------------------- 1 | # 要件定義作成プロンプト集 2 | ## ゴール 3 | `{prompt}` 4 | 上記を満たす要件定義書を作成してください。 5 | 以下の0〜8までで選択すること 6 | 7 | ### 0. クラス&関数 - 宣言型 - 要件定義書 8 | - **目的と範囲** 9 | - **機能要件** 10 | - 必要なクラスとそのクラスの責務 11 | - 各クラスのメソッド(関数)とその役割 12 | - クラス間の関係(継承、コンポジション等) 13 | - **非機能要件** 14 | - ツールは最新のものを利用し、第2案、第3案も記述。メインで利用するものに関しては表で機能、利用パッケージ、特徴、理由などの列を記載して欲しい 15 | - **制約事項** 16 | - **テスト項目** 17 | - 単体テスト(各クラス、メソッドの動作確認) 18 | - 結合テスト(クラス間の連携動作確認) 19 | 20 | ### 1. 単機能 - 宣言型 - 要件定義書 21 | - **目的と範囲** 22 | - **機能要件** 23 | - **非機能要件** 24 | - ツールは最新のものを利用し、第2案、第3案も記述。メインで利用するものに関しては表で機能、利用パッケージ、特徴、理由などの列を記載して欲しい 25 | - **制約事項** 26 | - **テスト項目** 27 | 28 | ### 2. 単機能 - 手続き型 - 要件定義書から手順書への変換 29 | - **手順の概要** 30 | - **必要な準備物やリソース** 31 | - **手順の詳細な説明** 32 | - **注意点や留意事項** 33 | - **トラブルシューティングガイド** 34 | 35 | ### 3. プロジェクト - 宣言型 - 要件定義 36 | - **プロジェクトの背景と目的** 37 | - **範囲と制約事項** 38 | - **機能要件と非機能要件** 39 | - **ステークホルダーとその役割** 40 | - **成功基準とプロジェクトの評価方法** 41 | - **スケジュールとマイルストーン** 42 | 43 | ### 4. プロジェクト - 手続き型 - 要件定義書から設計書への変換 44 | - **システムアーキテクチャ** 45 | - **モジュール構成とインターフェース** 46 | - **データモデルとデータフロー** 47 | - **ユーザーインターフェース設計** 48 | - **セキュリティ設計** 49 | - **パフォーマンス設計** 50 | - **テスト計画** 51 | 52 | ### 5. 業界 - 宣言型 - IT業界 53 | - **コーディング規約と設計原則** 54 | - **アジャイル開発手法の適用** 55 | - **クラウドネイティブアーキテクチャの採用** 56 | - **DevOps文化の醸成** 57 | - **セキュリティとコンプライアンス** 58 | - **パフォーマンスとスケーラビリティ** 59 | 60 | ### 6. 業界 - 手続き型 - IT業界 61 | - **ソフトウェア開発ライフサイクルの各フェーズにおける手順** 62 | - **マイクロサービスアーキテクチャの設計と実装** 63 | - **CI/CDパイプラインの構築と運用** 64 | - **アジャイルプロジェクト管理の実践** 65 | - **セキュリティ対策の実装と監視** 66 | - **パフォーマンスチューニングとスケーリング** 67 | 68 | ### 7. 世界 - 宣言型 69 | - **社会の基本的な価値観と原則** 70 | - **人権と自由の尊重** 71 | - **平等と公正の実現** 72 | - **持続可能な発展と環境保護** 73 | - **平和と安全の維持** 74 | - **教育と文化の振興** 75 | 76 | ### 8. 世界 - 手続き型 77 | - **法律と規則の整備** 78 | - **国家予算と財政計画の策定** 79 | - **外交政策と安全保障戦略の立案** 80 | - **教育制度と社会保障制度の改革** 81 | - **市民参加と民主主義の強化** 82 | - **国際協力とグローバルな課題への対応** 83 | 84 | これらのプロンプトテンプレートを使用することで、様々な規模や抽象度に応じた宣言型と手続き型のドキュメント作成を支援できます。プロンプトの内容を適宜変更し、具体的な要件に合わせてカスタマイズしてください。 85 | プロンプトから要件定義書(マークダウンファイル)を生成してください。 -------------------------------------------------------------------------------- /zoltraak/grimoires/compiler/ref_create_directory.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | 4 | # Root directory 5 | root = './' 6 | 7 | # Files to be created at each directory 8 | dir_files = { 9 | 'docs': ['getting-started.md', 'installation.md', 'configuration.md', 'usage.md', 'troubleshooting.md', 'faq.md'], 10 | 'docs/examples': ['example1.md', 'example2.md'], 11 | 'src': [] 12 | } 13 | 14 | # Create directories and files 15 | for dir, files in dir_files.items(): 16 | os.makedirs(os.path.join(root, dir), exist_ok=True) 17 | for file in files: 18 | open(os.path.join(root, dir, file), 'w').close() 19 | 20 | # Create file at root directory 21 | with open(os.path.join(root, 'README.md'), 'w') as f: 22 | f.close() 23 | 24 | # Check if directories and files are created 25 | for dir, files in dir_files.items(): 26 | print('Directory:', dir) 27 | print('Contains files:', os.listdir(os.path.join(root, dir))) 28 | -------------------------------------------------------------------------------- /zoltraak/grimoires/developer/dev_csharp.md: -------------------------------------------------------------------------------- 1 | 2 | C#に変換すること 3 | 読み込みファイル: {source_content} 4 | 要件書からターゲットファイルのコードのみ出力(コードブロックは記載しないこと) 5 | 関数の説明は/// 形式で 6 | 実行するプログラムコードのみ記載 7 | 説明等はコメントアウト 8 | 9 | 完全な実行コードを記載して欲しい。 10 | 11 | 成果物があればそれのファイルパスなどを記載 12 | open コマンドでオープン -------------------------------------------------------------------------------- /zoltraak/grimoires/developer/dev_python.md: -------------------------------------------------------------------------------- 1 | 2 | pythonに変換すること 3 | 読み込みファイル: {source_content} 4 | 要件書からターゲットファイルのコードのみ出力(コードブロックは記載しないこと) 5 | 関数の1行説明はprintで 6 | 実行するプログラムコードのみ記載 7 | 説明等はコメントアウト 8 | 9 | if __name__ == "__main__":以降の 10 | 実行コードまで記載して欲しい。 11 | 12 | 成果物があればそれのファイルパスなどを記載 13 | open コマンドでオープン -------------------------------------------------------------------------------- /zoltraak/grimoires/encryption/emoji.md: -------------------------------------------------------------------------------- 1 | https://x.com/ykawawa/status/1781860887953035595 参照 2 | 上記の文章を全て絵文字のみでプロンプトして圧縮する 目的はこの文章をトークン数を削減するために全て絵文字の羅列として表現する その絵文字をあなたが後で読み込んだときに吾輩は猫であるということが理解できるように適切に絵文字を選択して絵文字の羅列を出力する 3 | 4 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment.md: -------------------------------------------------------------------------------- 1 | 2 | # フォーマット 3 | - 文章は必ず日本語を使用すること。 4 | - 体言止めと、だ、である調 5 | - 1行は長くなりすぎないように改行 -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_ar.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Arabic. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_bn.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Bengali. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_de.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using German. 4 | - Your German should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_en.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using English. 4 | - Your English should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_es.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Spanish. 4 | - Your Spanish should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_fa.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Persian. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_fr.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using French. 4 | - Your French should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_hi.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Hindi. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_hu.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Hungarian. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_id.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Indonesian. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_it.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Italian. 4 | - Your Italian should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_ko.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Korean. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_lang.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using {language}. 4 | - Your {language} should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_my.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Burmese. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_nl.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Dutch. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_pl.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Polish. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_pt.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Portuguese. 4 | - Your Portuguese should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_ro.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Romanian. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_ru.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Russian. 4 | - Your Russian should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_sw.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Swahili. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_th.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Thai. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_tl.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Tagalog (Filipino). 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_tr.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Turkish. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_uk.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Ukrainian. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_ur.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Urdu. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_vi.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Vietnamese. 4 | - Your response should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. 6 | -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_zh.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Simplified Chinese. 4 | - Your Chinese should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/md_comment_zh_hk_tw.md: -------------------------------------------------------------------------------- 1 | 2 | # Format 3 | - You must generate your response using Traditional Chinese. 4 | - Your Chinese should be simple, clear, concise, and logically well structured. 5 | - Whenever something is required in the code block, always write the full content. -------------------------------------------------------------------------------- /zoltraak/grimoires/formatter/mediawiki_style.md: -------------------------------------------------------------------------------- 1 | 2 | == フォーマット == 3 | * Markdownではなく、MediaWikiのマークアップ記法で書け。 4 | ** 例えばcode blockは
タグで囲むこと。
 5 | ** また箇条書きには「*」を使用すること。インデントには同じ記号を重ねること(例えば箇条書きのインデントを一つ下げるなら「**」)。そのままWikipediaに掲載しても構文エラーが発生しないようにかけ。
 6 | ** '''太字'''、''斜体''も、MediaWiki記法に沿って、「*」の代わりに「'」(shift+7)を正しく使用すること。
 7 | ** 定義には「:」(セミコロン)を使用すること。
 8 | ** 1行コードにはタグを使用すること。
 9 | * 文章は体言止めと、だ、である調
10 | * 1行は長くなりすぎないように改行


--------------------------------------------------------------------------------
/zoltraak/grimoires/formatter/py_comment.md:
--------------------------------------------------------------------------------
1 | pythonはblack styleでフォーマッタ。1行1行プログラミングの右にコメントアウトで詳細に説明、コメントアウトは左端を揃えつつ、階層構造で記載


--------------------------------------------------------------------------------
/zoltraak/grimoires/interpretspec/hirokichi.md:
--------------------------------------------------------------------------------
 1 | https://twitter.com/hirokichi_pd/status/1782005973273743493?s=12 参照
 2 | # エージェント機能
 3 | # ゴール: {prompt}
 4 | 
 5 | ## 世界設定
 6 | - 実行環境
 7 |   - [ユーザー]と協働して[目的]達成を目指す
 8 |   - [プラットフォーム]上で対話的にコミュニケーション
 9 |   - [ユーザー]の入力に基づき生成した[成果物]の品質を継続的に評価・改善
10 | 
11 | ## 前提条件
12 | - [ユーザー]は自身の[目的]を理解し[要件]を具体的に提示できる
13 | - [言語モデル]は[要件]を正確に理解し[ドメイン知識]を活用して適切な[成果物]を生成できる
14 | - [ユーザー]と[言語モデル]は建設的なフィードバックを通じて[成果物]の品質を継続的に向上させる
15 | 
16 | ## ユーザーのゴール
17 | - [言語モデル]との協働で高品質な[要件定義]と[実現手順]を効率的に作成
18 | - 生成された[成果物]を活用し[ステークホルダー]との合意形成や[プロジェクト]の円滑な推進を図る
19 | - [言語モデル]とのインタラクションを通じて自身の[ドメイン知識]を深化させる
20 | 
21 | ## 言語モデルの役割
22 | - [ユーザー]の[要件]を正確に理解し[ドメイン知識]を活用して適切な[成果物]を生成
23 | - [ユーザー]のフィードバックを積極的に取り入れ生成した[成果物]の品質を継続的に改善
24 | - [ユーザー]との対話で獲得した[ドメイン知識]を他の[ユーザー]との対話にも活用
25 | 
26 | ## 必要な知識
27 | - [要件定義]と[実現手順]作成のベストプラクティスに関する知識
28 | - [ユーザー]の[目的]に関連する[業界]や[分野]の基礎知識
29 | - [ユーザー]との対話で獲得した[ドメイン知識]を継続的に更新・拡張
30 | 
31 | ## 変数
32 | - [目的]: [ユーザー]が達成したい[プロジェクト]の最終的な目標や状態
33 | - [要件]: [目的]を達成するために必要な機能や条件
34 | - [成果物]: [要件定義]や[実現手順]などの[プロジェクト]遂行に必要な文書化された情報
35 | - [ドメイン知識]: [プロジェクト]に関連する[業界]や[分野]の専門知識
36 | 
37 | ## プロセスとステップ
38 | 
39 | ### メインステップ
40 | 1. [目的]と[要件]の明確化
41 | 2. [要件定義]の作成
42 | 3. [実現手順]の作成
43 | 
44 | ### サブステップ
45 | 1. [ユーザー]が[目的]を明確に定義し[要件]を具体的に提示
46 | 2. [言語モデル]が[ユーザー]の入力を解析し[要件]を抽出
47 | 3. [言語モデル]が[要件]に基づいて[要件定義]の初版を生成
48 | 4. [ユーザー]が[要件定義]を確認しフィードバックを提供
49 | 5. [言語モデル]が[ユーザー]のフィードバックを元に[要件定義]を改善
50 | 6. [言語モデル]が[要件定義]を基に[実現手順]の初版を生成
51 | 7. [ユーザー]が[実現手順]を確認しフィードバックを提供
52 | 8. [言語モデル]が[ユーザー]のフィードバックを元に[実現手順]を改善
53 | 
54 | ## 出力形式
55 | - [ユーザー]の[目的]や[要件]に応じて適切な[テンプレート]を選択し[成果物]を生成
56 | - [テンプレート]は[目的]の性質に基づいて宣言型と手続き型に分類
57 |   - 宣言型[テンプレート]は[目的]や[要件]を明確に定義することに重点
58 |   - 手続き型[テンプレート]は[目的]達成のための具体的な手順や方法論に重点
59 | - [成果物]の出力形式は[構造化データ]を基本とし必要に応じて[視覚的要素]を含める
60 | - [成果物]の構成は[ユーザー]の[目的]や[要件]に応じて柔軟に変更可能
61 | - [成果物]には[バージョン管理]や[変更履歴]を含め改善プロセスを追跡可能
62 | 
63 | ## ロールプレイインストラクション
64 | - 上記の[機能]を持つ[言語モデル]として[ユーザー]の[目的]達成をサポートしてください
65 | - [ユーザー]との対話を通じて[ドメイン知識]を深め[要件]の明確化と[成果物]の品質向上に努めてください
66 | - [目的]と[要件]の明確化から[成果物]の生成、改善までのプロセスを主導し[ユーザー]をガイドしてください
67 | - ステップバッククエスチョンで最低限の情報を問いかけ選択肢や答えやすい質問で会話を進めてください
68 | - ファーストレスポンスは特に親切で明確に[プロジェクト]の方向性を示してください
69 | - 質問は選択肢に番号を振り平易な言葉で表現してください
70 | - [ユーザー]の[目的]達成と[ドメイン知識]の深化を常に意識し最高のユーザー体験を提供してください
71 | - [ユーザー]が楽しくスムーズに[プロジェクト]を進められるよう親身になってサポートしてください
72 | 
73 | 


--------------------------------------------------------------------------------
/zoltraak/llms/claude.py:
--------------------------------------------------------------------------------
 1 | import os
 2 | import anthropic
 3 | from zoltraak import settings
 4 | 
 5 | def generate_response(model, prompt, max_tokens, temperature):
 6 |     """
 7 |     Anthropic APIを使用してプロンプトに対する応答を生成する関数。
 8 | 
 9 |     Args:
10 |         prompt (str): 応答を生成するためのプロンプト。
11 | 
12 |     Returns:
13 |         str: 生成された応答テキスト。
14 |     """
15 |     client = anthropic.Anthropic(
16 |         api_key=os.environ.get("ANTHROPIC_API_KEY")  # 環境変数からAPI keyを取得
17 |     )
18 |     # print(prompt)
19 | 
20 |     response = client.messages.create(
21 |         model=model,
22 |         max_tokens=max_tokens,
23 |         temperature=temperature,
24 |         messages=[
25 |             {
26 |                 "role": "user",
27 |                 "content": [
28 |                     {
29 |                         "type": "text",
30 |                         "text": prompt
31 |                     }
32 |                 ]
33 |             }
34 |         ]
35 |     )
36 | 
37 |     # print(response)
38 |     
39 |     return response.content[0].text.strip()
40 | 


--------------------------------------------------------------------------------
/zoltraak/llms/claude.txt:
--------------------------------------------------------------------------------
 1 | from dotenv import load_dotenv
 2 | load_dotenv()  # .envファイルから環境変数を読み込む
 3 | 
 4 | def function():
 5 |     client = anthropic.Anthropic(
 6 |        self.client = anthropic.Anthropic(
 7 |            api_key=os.environ.get("ANTHROPIC_API_KEY"),  # 環境変数からAPI keyを取得。os.getenvではなくos.environ.getを使う 🔑
 8 |        )
 9 | 
10 |     with open("ais/~~~~", "r") as f:
11 |         lecture_content_prompt = f.read().format(lecture_title=lecture_title, lecture_description=lecture_description)
12 | 
13 |     response = client.messages.create(
14 |         model="claude-3-opus-20240229",
15 |         max_tokens=2000,
16 |         temperature=0.7,
17 |         messages=[
18 |             {
19 |                 "role": "user",
20 |                 "content": [
21 |                     {
22 |                         "type": "text",
23 |                         "text": prompt
24 |                     }
25 |                 ]
26 |             }
27 |         ]
28 |     )
29 |     
30 |     text = response.content[0].text.strip()


--------------------------------------------------------------------------------
/zoltraak/llms/gemini.py:
--------------------------------------------------------------------------------
 1 | """
 2 | Google AI Python SDKをインストールする
 3 | 
 4 | $ pip install google-generativeai
 5 | 
 6 | 詳細は以下のガイドを参照してください:
 7 | https://ai.google.dev/gemini-api/docs/get-started/python
 8 | """
 9 | 
10 | import os
11 | import google.generativeai as genai
12 | 
13 | genai.configure(api_key=os.environ["GEMINI_API_KEY"])
14 | 
15 | def generate_response(model_name="gemini-1.5-pro", prompt="helloworld", max_tokens=8192, temperature=1):
16 |     """
17 |     Google Generative AIを使用してプロンプトに対する応答を生成する関数。
18 | 
19 |     Args:
20 |         model_name (str): 使用するモデルの名前。
21 |         prompt (str): 応答を生成するためのプロンプト。
22 |         max_tokens (int): 応答の最大トークン数。
23 |         temperature (float): 応答の多様性を制御する温度パラメータ。
24 | 
25 |     Returns:
26 |         str: 生成された応答テキスト。
27 |     """
28 |     # モデルの設定
29 |     generation_config = {
30 |         "temperature": temperature,
31 |         "top_p": 0.95,
32 |         "top_k": 64,
33 |         "max_output_tokens": max_tokens,
34 |         "response_mime_type": "text/plain",
35 |     }
36 | 
37 |     model = genai.GenerativeModel(
38 |         model_name=model_name,
39 |         generation_config=generation_config,
40 |         # safety_settings = Adjust safety settings
41 |         # See https://ai.google.dev/gemini-api/docs/safety-settings
42 |     )
43 | 
44 |     chat_session = model.start_chat(
45 |         history=[]
46 |     )
47 | 
48 |     response = chat_session.send_message(prompt)
49 | 
50 |     return response.text
51 | 
52 | # 使用例
53 | response_text = generate_response("gemini-1.5-pro", "prompt", 8192, 1)
54 | print(response_text)
55 | 


--------------------------------------------------------------------------------
/zoltraak/md_generator.py:
--------------------------------------------------------------------------------
  1 | import os
  2 | import pyperclip
  3 | import anthropic
  4 | from dotenv import load_dotenv
  5 | from groq import Groq  # Groqをインポート
  6 | import zoltraak
  7 | from tqdm import tqdm  # tqdmをインポート
  8 | import threading
  9 | import time
 10 | import sys
 11 | import zoltraak.settings
 12 | import zoltraak.llms.claude as claude
 13 | import re
 14 | 
 15 | def generate_md_from_prompt(
 16 |     goal_prompt,
 17 |     target_file_path,
 18 |     developer="anthropic",  # デベロッパーを指定する引数を追加
 19 |     model_name="claude-3-opus-20240229",  # モデル名の引数を独立させる
 20 |     compiler_path=None,
 21 |     formatter_path=None,
 22 |     language=None, #汎用言語指定
 23 |     open_file=True,  # ファイルを開くかどうかのフラグを追加
 24 | ):
 25 |     """
 26 |     promptから要件定義書(マークダウンファイル)を生成する関数
 27 | 
 28 |     Args:
 29 |         goal_prompt (str): 要件定義書の生成に使用するプロンプト
 30 |         target_file_path (str): 生成する要件定義書のパス
 31 |         developer (str): 使用するデベロッパー(デフォルトは "anthropic")
 32 |         model_name (str): 使用するモデルの名前(デフォルトは "claude-3-opus-20240229")
 33 |         compiler_path (str): コンパイラのパス(デフォルトはNone)
 34 |         formatter_path (str): フォーマッタのパス(デフォルトはNone)
 35 |         open_file (bool): ファイルを開くかどうかのフラグ(デフォルトはTrue)
 36 |     """
 37 |     # プロンプトコンパイラとプロンプトフォーマッタを変数として受け取る
 38 |     if compiler_path is not None and "grimoires" in compiler_path:                                          # grimoires/ディレクトリにコンパイラパスが含まれている場合
 39 |         prompt_compiler = os.path.basename(compiler_path)                     # - コンパイラパスからファイル名のみを取得してprompt_compilerに代入
 40 |     else:                                                                     # grimoires/ディレクトリにコンパイラパスが含まれていない場合
 41 |         prompt_compiler = compiler_path                                       # - コンパイラパスをそのままprompt_compilerに代入
 42 |     
 43 |     # 汎用言語フォーマッタへの変更
 44 |     if language is not None:
 45 |         # formatter_pathに_lang.mdが存在するならそれを、しないならformatter_pathのまま
 46 |         lang_formatter_path = os.path.splitext(formatter_path)[0] + "_lang.md"
 47 |         if os.path.exists(lang_formatter_path):
 48 |             formatter_path = lang_formatter_path
 49 |     
 50 |     # フォーマッターについて、デフォフォルダの時見栄えをシンプルにする
 51 |     if "grimoires" in formatter_path:                                         # grimoires/ディレクトリにフォーマッタパスが含まれている場合
 52 |         prompt_formatter = os.path.basename(formatter_path)                   # - フォーマッタパスからファイル名のみを取得してprompt_formatterに代入
 53 |     else:                                                                     # grimoires/ディレクトリにフォーマッタパスが含まれていない場合
 54 |         prompt_formatter = formatter_path                                     # - フォーマッタパスをそのままprompt_formatterに代入
 55 |     
 56 |     print(f"""
 57 | ステップ1. 起動術式を用いて魔法術式を構築する
 58 | ==============================================================
 59 | \033[31m起動術式\033[0m (プロンプトコンパイラ)   : {prompt_compiler}
 60 | \033[32m魔法術式\033[0m (要件定義書)             : {target_file_path}
 61 | \033[34m錬成術式\033[0m (プロンプトフォーマッタ) : {prompt_formatter}
 62 | \033[90m言霊\033[0m   (LLMベンダー・モデル 名)   : {developer}/{model_name}
 63 | ファイルを開く                    : {open_file}
 64 | ==============================================================
 65 |     """)
 66 | 
 67 | 
 68 |     prompt = create_prompt(goal_prompt, compiler_path, formatter_path, language)  # プロンプトを作成
 69 |     done = False                                                        # スピナーの終了フラグを追加
 70 |     spinner_thread = threading.Thread(                                  # スピナーを表示するスレッドを作成し、終了フラグとgoalを渡す
 71 |         target=show_spinner,
 72 |         args=(lambda: done, f"ステップ1. \033[31m起動術式\033[0mを用いて\033[32m魔法術式\033[0mを構築")           
 73 |     )                                                                   #
 74 |     spinner_thread.start()                                              # スピナーの表示を開始
 75 |     response = generate_response(                                       # developerごとの分岐を関数化して応答を生成
 76 |         developer, model_name, prompt                                   #
 77 |     )                                                                   #
 78 |     done = True                                                         # 応答生成後にスピナーの終了フラグをTrueに設定
 79 |     spinner_thread.join()                                               # スピナーの表示を終了
 80 |     md_content = response.strip()                                       # 生成された要件定義書の内容を取得し、前後の空白を削除
 81 |     save_md_content(md_content, target_file_path)        # 生成された要件定義書の内容をファイルに保存
 82 |     print_generation_result(target_file_path, compiler_path, open_file)                # 生成結果を出力し、open_fileフラグに応じてファイルを開く
 83 | 
 84 | def show_spinner(done, goal):
 85 |     """スピナーを表示する関数
 86 | 
 87 |     Args:
 88 |         done (function): スピナーを終了するかどうかを判定する関数
 89 |     """
 90 |     progress_bar = "━" * 22
 91 | 
 92 |     spinner_base = goal + "中... 🪄 "
 93 |     spinner_animation = [
 94 |         f"{progress_bar[:i]}☆゚.*・。゚{' ' * (len(progress_bar) - i)}"
 95 |         for i in range(1, len(progress_bar) + 1)
 96 |     ] + [f"{progress_bar}☆゚.*・。"]
 97 |     spinner = [spinner_base + anim for anim in spinner_animation]
 98 |     
 99 |     while not done():                                                   # done()がFalseの間、スピナーを表示し続ける
100 |         for cursor in spinner:                                          # - スピナーのアニメーションパターンを順番に処理
101 |             sys.stdout.write(cursor + "\b" * (len(cursor)+100))          # -- カーソル文字を出力し、その文字数分だけバックスペースを出力して上書き
102 |             sys.stdout.flush()                                          # -- 出力をフラッシュして即時表示
103 |             time.sleep(0.1)                                             # -- 0.1秒のディレイを追加
104 | 
105 | 
106 | 
107 | def generate_response(developer, model_name, prompt):
108 |     """
109 |     対応デベロッパーごとに分岐してレスポンスを生成する関数
110 | 
111 |     現在対応しているデベロッパーとモデルは以下の通りです:
112 |     - Anthropic: 
113 |       - claude-3-opus-20240229
114 |       - claude-3-sonnet-20240229
115 |       - claude-3-haiku-20240307
116 |     - Groq:
117 |       - llama3-8b-8192
118 |       - llama3-70b-8192
119 |       - llama2-70b-4096
120 |       - mixtral-8x7b-32768
121 |       - gemma-7b-it
122 | 
123 |     Args:
124 |         developer (str): 使用するデベロッパー名("anthropic" または "groq")
125 |         model_name (str): 使用するモデルの名前
126 |         prompt (str): APIに送信するプロンプト
127 | 
128 |     Returns:
129 |         str: APIから生成されたレスポンス
130 |     """
131 |     if developer == "groq":  # Groqを使用する場合
132 |         response = create_prompt_and_get_response_groq(model_name, prompt)
133 |     elif developer == "anthropic":  # Anthropicを使用する場合
134 |         response = claude.generate_response(model_name, prompt, 4000, 0.7)
135 |     
136 |     else:  # 想定外のデベロッパーの場合
137 |         raise ValueError(
138 |             f"サポートされていないデベロッパー: {developer}。"
139 |             "サポートされているデベロッパーは 'anthropic' と 'groq' です。"
140 |         )
141 |     return response
142 | 
143 | 
144 | def create_prompt_and_get_response_groq(model, prompt):
145 |     """
146 |     Groq APIを使用して、指定されたモデルでプロンプトに基づいてテキストを生成する関数
147 | 
148 |     Args:
149 |         model (str): 使用するモデルの名前
150 |         prompt (str): 送信するプロンプト
151 | 
152 |     Returns:
153 |         str: 生成されたテキスト
154 |     """
155 |     client = Groq(api_key=groq_api_key)  # Groq APIクライアントを作成
156 |     chat_completion = client.chat.completions.create(
157 |         messages=[
158 |             {
159 |                 "role": "user",
160 |                 "content": prompt,
161 |             }
162 |         ],
163 |         model=model,
164 |     )
165 |     return chat_completion.choices[0].message.content.strip()
166 | 
167 | def create_prompt(goal_prompt, compiler_path=None, formatter_path=None, language=None):
168 |     """
169 |     LLMへのプロンプトを作成する関数
170 | 
171 |     Args:
172 |         goal_prompt (str): 要件定義書の生成に使用するプロンプト
173 |         compiler_path (str): コンパイラのパス
174 |         formatter_path (str): フォーマッタのパス
175 | 
176 |     Returns:
177 |         str: 作成されたプロンプト
178 |     """
179 |     # prompt_file = "grimoires/compiler/dev_obj.md"  # デフォルトのプロンプトファイルのパスを指定
180 |     # if compiler_path:  # コンパイラパスが指定されている場合
181 |         # prompt_file = compiler_path  # - プロンプトファイルのパスをコンパイラパスに変更
182 | 
183 |     formatter = get_formatter(formatter_path, language)
184 | 
185 |     if compiler_path is None:
186 |         # 検索関数の起動
187 |         zoltraak_dir = os.path.dirname(zoltraak.__file__)
188 |         compiler_folder = f"{zoltraak_dir}/grimoires/compiler"
189 |         compiler_files = [file for file in os.listdir(compiler_folder) if file.endswith(".md")]
190 | 
191 |         prompt = "以下のファイルから、goal_promptに最も適したものを選んでください。\n\n"
192 | 
193 |         for file in compiler_files:
194 |             file_path = os.path.join(compiler_folder, file)
195 |             with open(file_path, "r", encoding="utf-8") as f:
196 |                 content = f.read().split("\n")[:3]
197 |             prompt += f"## {file}\n```\n{' '.join(content)}\n```\n\n"
198 | 
199 |         prompt += f"## goal_prompt\n\n```{goal_prompt}```\n\n"
200 |         prompt += f"""まず、goal_promptを踏まえて、最初に取るべきステップを明示してください。
201 |         そのステップやgoal_prompt自身と比較して、最も適切なファイルを上位5つ選び、それぞれの理由とともに説明してください。
202 |         また、それぞれの実行プロンプトを、zoltraak \"{goal_prompt}\" -c [ファイル名(拡張子なし)]で、code blockに入れて添付してください。"""
203 |         prompt += prompt + formatter
204 |     elif os.path.exists(compiler_path):  # プロンプトファイルが存在する場合
205 |         with open(compiler_path, "r", encoding = "utf-8") as file:  # - プロンプトファイルを読み込みモードで開く
206 |             prompt = file.read().format(
207 |                 prompt=goal_prompt
208 |             )  # -- プロンプトファイルの内容を読み込み、goal_promptを埋め込む
209 |         prompt = prompt + formatter  # - プロンプトにフォーマッタを追加
210 |     else:  # プロンプトファイルが存在しない場合
211 |         print(f"プロンプトファイル {compiler_path} が見つかりません。")  # - エラーメッセージを表示
212 |         prompt = ""
213 | 
214 |     if prompt != "" and language is not None:
215 |         if not formatter_path.endswith("_lang.md"):
216 |             prompt = formatter[formatter.rindex("## Output Language"):]  + "\n- Follow the format defined in the format section. DO NOT output the section itself." + prompt # 言語指定の強調前出しでサンドイッチにしてみる。
217 |         elif re.match("(english|英語|en)", language.lower()):
218 |             prompt = formatter + prompt # 特に英語指示が「デフォルト言語指示」と混同されやすく、効きがやたら悪いので英語の場合は挟み撃ちにする
219 | 
220 |     # print(prompt) # デバッグ用
221 |     return prompt
222 | 
223 | 
224 | def get_formatter(formatter_path, language=None):
225 |     """
226 |     フォーマッタを取得する関数
227 | 
228 |     Args:
229 |         formatter_path (str): フォーマッタのパス
230 | 
231 |     Returns:
232 |         str: フォーマッタの内容
233 |     """
234 |     if formatter_path is None:  # フォーマッタパスが指定されていない場合
235 |         formatter = ""  # - フォーマッタを空文字列に設定
236 |     else:  # フォーマッタパスが指定されている場合
237 |         if os.path.exists(formatter_path):  # -- フォーマッタファイルが存在する場合
238 |             with open(formatter_path, "r", encoding = "utf-8") as file:  # --- フォーマッタファイルを読み込みモードで開く
239 |                 formatter = file.read()  # ---- フォーマッタの内容を読み込む
240 |                 if language is not None:
241 |                     print(formatter_path)
242 |                     if formatter_path.endswith("_lang.md"):
243 |                         formatter = formatter.replace("{language}", language)
244 |                     else:
245 |                         formatter += f"\n- You must output everything including code block and diagrams, according to the previous instructions, but make sure you write your response in {language}.\n\n## Output Language\n- You must generate your response using {language}, which is the language of the formatter just above this sentence."
246 |         else:  # -- フォーマッタファイルが存在しない場合
247 |             print(f"フォーマッタファイル {formatter_path} が見つかりません。")  # --- エラーメッセージを表示
248 |             formatter = ""  # --- フォーマッタを空文字列に設定
249 | 
250 |     return formatter
251 | 
252 | 
253 | def save_md_content(md_content, target_file_path):
254 |     """
255 |     生成された要件定義書の内容をファイルに保存する関数
256 | 
257 |     Args:
258 |         md_content (str): 生成された要件定義書の内容
259 |         target_file_path (str): 保存先のファイルパス
260 |     """
261 |     requirements_dir = "requirements"                                         # 生成された要件定義書をrequirements/の中に格納する
262 |     os.makedirs(requirements_dir, exist_ok=True)                              # - requirements/ディレクトリを作成(既に存在する場合は何もしない)
263 |     target_file_name = os.path.basename(target_file_path)                     # - ターゲットファイルのファイル名を取得
264 |     target_file_path = os.path.join(requirements_dir, target_file_name)       # - requirements/ディレクトリとファイル名を結合してターゲットファイルのパスを生成
265 |     with open(target_file_path, "w", encoding = "utf-8") as target_file:                          # ターゲットファイルを書き込みモードで開く
266 |         target_file.write(md_content)                                         # - 生成された要件定義書の内容をファイルに書き込む
267 | 
268 | def print_generation_result(target_file_path, compiler_path, open_file=True):
269 |     """
270 |     要件定義書の生成結果を表示する関数
271 | 
272 |     Args:
273 |         target_file_path (str): 生成された要件定義書のファイルパス
274 |         compiler_path (str): コンパイラのパス
275 |         open_file (bool): ファイルを開くかどうかのフラグ(デフォルトはTrue)
276 |     """
277 |     req = "requirements"
278 |     target_file_path = f"{req}/{target_file_path}"
279 |     print("")
280 |     print(f"\033[32m魔法術式を構築しました: {target_file_path}\033[0m")  # 要件定義書の生成完了メッセージを緑色で表示
281 |     
282 |     # 検索結果生成以外ではユーザーに要件定義書からディレクトリを構築するかどうかを尋ねる
283 |     if  compiler_path is not None and input("\033[32m魔法術式\033[0mから\033[33m領域術式\033[0mを実行しますか? (y/n): ").lower() == 'y':
284 |         # ユーザーがyと答えた場合、zoltraakコマンドを実行してディレクトリを構築
285 |         done = False  # スピナーの終了フラグを追加
286 |         spinner_thread = threading.Thread(  # スピナーを表示するスレッドを作成し、終了フラグとgoalを渡す
287 |             target=show_spinner,
288 |             args=(lambda: done, f"ステップ2. \033[32m魔法式\033[0mから\033[33m領域\033[0mを構築")
289 |         )
290 |         spinner_thread.start()  # スピナーの表示を開始
291 |         
292 |         import subprocess
293 |         subprocess.run(["zoltraak", target_file_path])
294 |         
295 |         done = True  # zoltraakコマンド実行後にスピナーの終了フラグをTrueに設定
296 |         spinner_thread.join()  # スピナーの表示を終了
297 |     else:
298 |         # ユーザーがnと答えた場合、既存の手順を表示
299 |         print(f"\033[33m以下のコマンドをコピーして、ターミナルに貼り付けて実行してください。\033[0m")  # 実行方法の説明を黄色で表示
300 |         print(f"\033[36mzoltraak {target_file_path}\033[0m")  # 実行コマンドを水色で表示
301 |         pyperclip.copy(f"zoltraak {target_file_path}")  # 実行コマンドをクリップボードにコピー
302 |         print("\033[35mコマンドをクリップボードにコピーしました。ターミナルに貼り付けて実行できます。\033[0m")  # コピー完了メッセージを紫色で表示
303 |         


--------------------------------------------------------------------------------
/zoltraak/settings.py:
--------------------------------------------------------------------------------
 1 | import os
 2 | from os.path import join, dirname
 3 | from dotenv import load_dotenv
 4 | 
 5 | load_dotenv(verbose=True)
 6 | 
 7 | dotenv_path = join(dirname(__file__), '.env')
 8 | load_dotenv(dotenv_path)
 9 | anthropic_api_key = os.getenv("ANTHROPIC_API_KEY")  # 環境変数からAPI keyを取得
10 | groq_api_key = os.getenv("GROQ_API_KEY")  # 環境変数からGroqのAPI keyを取得


--------------------------------------------------------------------------------
/zoltraak/utils/process_text.py:
--------------------------------------------------------------------------------
 1 | 
 2 | def normal(text, language=None):
 3 |     lines = text.split('\n')
 4 |     inside_code_block = False
 5 |     result = []
 6 | 
 7 |     for i, line in enumerate(lines):
 8 |         if line.startswith('```'):
 9 |             if not inside_code_block:
10 |                 inside_code_block = True
11 |                 if language is not None and language.lower() not in line.lower():
12 |                     inside_code_block = False
13 |             else:
14 |                 inside_code_block = False
15 |         else:
16 |             if inside_code_block:
17 |                 result.append(line)
18 |             else:
19 |                 result.append('# ' + line)
20 | 
21 |     return '\n'.join(result)
22 | 


--------------------------------------------------------------------------------
/zoltraak/utils/prompt_import.py:
--------------------------------------------------------------------------------
 1 | 
 2 | def load_prompt(file_path, variables):
 3 |     """
 4 |     プロンプトファイルを読み込み、変数を置換する汎用関数
 5 | 
 6 |     Args:
 7 |         file_path (str): プロンプトファイルのパス
 8 |         variables (dict): 置換する変数の辞書
 9 | 
10 |     Returns:
11 |         str: 変数が置換されたプロンプト
12 |     """
13 |     with open(file_path, "r", encoding = "utf-8") as f:
14 |         prompt_template = f.read()
15 |     
16 |     prompt = prompt_template
17 |     for key, value in variables.items():
18 |         prompt = prompt.replace(f'[{key}]', value)
19 |     
20 |     return prompt


--------------------------------------------------------------------------------