Skip to content

Commit

Permalink
Merge branch 'release/5.0.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
Sunwood-ai-labs committed Jun 10, 2024
2 parents 5d1588a + 2bd7c26 commit 123049c
Show file tree
Hide file tree
Showing 15 changed files with 476 additions and 121 deletions.
69 changes: 69 additions & 0 deletions .aira/config.dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
aira:
gaiah: # 共通設定
run: true
repo:
repo_name: "SourceSage"
description: "Evolutionary Merge Experiment"
private: false
local:
repo_dir: "./"
no_initial_commit: false
commit:
commit_msg_path: ".Gaiah.md"
branch_name: null

dev: # 開発時の設定 (必要に応じて上書き)
repo:
create_repo: false
local:
init_repo: false
commit:
process_commits: true

init: # 初期化時の設定 (必要に応じて上書き)
repo:
create_repo: true
local:
init_repo: true
commit:
process_commits: false

llm:
model: "gemini/gemini-1.5-pro-latest" # 利用するLLMモデル

repository_summary_output_dir: .aira # リポジトリ概要の出力ディレクトリ
readme_prompt_template_path: .aira/readme_prompt_template.txt # README生成のプロンプトテンプレートのパス

harmon_ai:
run: true
environment:
repo_name: "SourceSage"
owner_name: "Sunwood-ai-labs"
package_name: "SourceSage"
icon_url: "hhttps://huggingface.co/datasets/MakiAi/IconAssets/resolve/main/SourceSage.jpeg"
title: "SourceSage"
subtitle: "~ Evolutionary Merge Experiment ~"
website_url: "https://hamaruki.com/"
github_url: "https://github.com/Sunwood-ai-labs"
twitter_url: "https://x.com/hAru_mAki_ch"
blog_url: "https://hamaruki.com/"

product:
important_message_file: "important_template.md"
sections_content_file: "sections_template.md"
output_file: "README_template.md"
cicd_file_path: "publish-to-pypi.yml"
cicd_main_path: "publish-to-pypi.yml"
github_cicd_dir: ".github/workflows"

llm_product:
sections_content_file: "sections_template_llm.md"

development:
output_dir: "C:/Prj/SourceSage/.harmon_ai"

main:
main_dir: "C:/Prj/SourceSage/"
replace_readme: true

instructions_prompt: .aira/instructions.md
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ SourceSageは、プロジェクトのソースコードとファイル構成を


>[!IMPORTANT]
>このリポジトリ自体も[SourceSage](https://github.com/Sunwood-ai-labs/SourceSage)を活用しており、リリースノートやREADME、コミットメッセージの9割は[SourceSage](https://github.com/Sunwood-ai-labs/SourceSage)[claude.ai](https://claude.ai/)で生成しています。
>このリポジトリのリリースノートやREADME、コミットメッセージの9割近くは[claude.ai](https://claude.ai/)[ChatGPT4](https://chatgpt.com/)を活用した[AIRA](https://github.com/Sunwood-ai-labs/AIRA), [SourceSage](https://github.com/Sunwood-ai-labs/SourceSage), [Gaiah](https://github.com/Sunwood-ai-labs/Gaiah), [HarmonAI_II](https://github.com/Sunwood-ai-labs/HarmonAI_II)で生成しています。
## 更新内容

Expand Down Expand Up @@ -130,6 +129,15 @@ SourceSageをプロジェクトで使用するには、以下の手順に従っ

これらのファイルを使って、AIによるプロジェクトの解析や自動修正、ドキュメント化などを行うことができます。

```bash
sourcesage
```

```bash
sourcesage --docuMind-model="gemini/gemini-1.5-pro-latest" --docuMind-release-report=".SourceSageAssets\RELEASE_REPORT\Report_v0.1.0.md" --docuMind-changelog=".SourceSageAssets\Changelog\CHANGELOG_release_v0.2.0.md" --repo-name="AIRA-Sample01" --repo-version="v0.2.0"
```


### リポジトリのIssueも取得する方法

デフォルトでは、SourceSageは現在のディレクトリをプロジェクトのルートとして解析します。ただし、GitHub上のリポジトリのIssueも取得したい場合は、以下のようにリポジトリのオーナー名とリポジトリ名をコマンドライン引数で指定します:
Expand Down Expand Up @@ -218,6 +226,8 @@ Issueとマージされたファイルの例はこちらです。

CommitCraftを使用することで、開発者はコミットメッセージを考える負担を軽減し、一貫性のある適切なコミットメッセージを自動的に生成できます。絵文字の活用やGaiahのテンプレートを利用することで、よりわかりやすく効果的なコミットメッセージの作成が可能になります。



## 3. DocuMind:リリース後のドキュメント化

<p align="center">
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
name='sourcesage',

# パッケージのバージョン
version='4.4.0',
version='5.0.0',

# パッケージに含めるモジュールを自動的に探す
packages=find_packages(),
Expand Down
85 changes: 73 additions & 12 deletions sourcesage/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,41 @@
import sys
from art import *

from .config.constants import Constants
from .modules.CommitCraft import CommitCraft
from .modules.DocuMind import DocuMind

logger.configure(
handlers=[
{
"sink": sys.stderr,
"format": "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level:<8}</level> | <cyan>{name:<45}:{line:<5}</cyan> | <level>{message}</level>",
"format": "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level:<10}</level> | <cyan>{name:<45}:{line:<5}</cyan> | <level>{message}</level>",
"colorize": True,
}
]
)

def main():
parser = argparse.ArgumentParser(description='SourceSage CLI')
tprint(" SourceSage", font="rnd-xlarge")

# ==============================================
# 基本設定
#
parser.add_argument('--config', help='設定ファイルへのパス', default='sourcesage.yml')
parser.add_argument('--output', help='生成されたファイルの出力ディレクトリ', default='./')
parser.add_argument('--repo', help='リポジトリへのパス', default='./')
parser.add_argument('--owner', help='リポジトリのオーナー', default='Sunwood-ai-labs')
parser.add_argument('--repository', help='リポジトリの名前', default='SourceSage')
parser.add_argument('--mode', nargs='+', help='実行するモード: Sage, GenerateReport, CommitCraft, DocuMind, または all', default='all')

package_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
default_ignore_file = os.path.join(package_root, 'sourcesage', 'config', '.SourceSageignore')
default_language_map = os.path.join(package_root, 'sourcesage', 'config', 'language_map.json')


# ==============================================
# 無視ファイルと言語マップ設定
#
current_dir_ignore_file = os.path.join(os.getcwd(), '.SourceSageignore')
if os.path.exists(current_dir_ignore_file):
ignore_file = current_dir_ignore_file
Expand All @@ -39,7 +52,9 @@ def main():
parser.add_argument('--ignore-file', help='無視ファイルへのパス', default=ignore_file)
parser.add_argument('--language-map', help='言語マップファイルへのパス', default=default_language_map)

# ==============================================
# レポート生成用の引数を追加
#
parser.add_argument('--repo-path', type=str, default="", help='gitリポジトリへのパス')
parser.add_argument('--git-fetch-tags', type=str, nargs='+', default=["git", "fetch", "--tags"], help='gitタグを取得するコマンド')
parser.add_argument('--git-tag-sort', type=str, nargs='+', default=["git", "tag", "--sort=-creatordate"], help='gitタグをソートするコマンド')
Expand All @@ -49,23 +64,69 @@ def main():
parser.add_argument('--output-path', type=str, default=".SourceSageAssets/RELEASE_REPORT/", help='Markdownレポートの保存先フォルダ')
parser.add_argument('--report-file-name', type=str, default="Report_{latest_tag}.md", help='Markdownレポートのファイル名。{latest_tag}は最新のタグに置換されます。')

# ==============================================
# CommitCraft用の引数を追加
#
parser.add_argument('--llm-output', type=str, default="llm_output.md", help='LLMレスポンスの出力ファイル')
parser.add_argument('--model-name', type=str, default=None, help='LLMのモデル名(デフォルト: None)')
parser.add_argument('--stage-info-file', type=str, default=".SourceSageAssets\COMMIT_CRAFT/STAGE_INFO\STAGE_INFO_AND_PROMT_GAIAH_B.md", help='ステージファイルパス')
parser.add_argument('--commit-craft-output', type=str, default=".SourceSageAssets/COMMIT_CRAFT/", help='CommitCraftの出力フォルダ')

# ==============================================
# DocuMind用の引数を追加
#
parser.add_argument('--docuMind-model', type=str, default=None, help='DocuMindで使用するLLMのモデル名')
parser.add_argument('--docuMind-db', type=str, default=".SourceSageAssets/DocuMind.md", help='DocuMindのデータベースファイルのパス')
parser.add_argument('--docuMind-release-report', type=str, default=".SourceSageAssets/RELEASE_REPORT/Report_{latest_tag}.md", help='リリースレポートのパス。{latest_tag}は最新のタグに置換されます。')
parser.add_argument('--docuMind-changelog', type=str, default=".SourceSageAssets/Changelog/CHANGELOG_release_{version}.md", help='変更履歴のパス。{version}はバージョンに置換されます。')
parser.add_argument('--docuMind-output', type=str, default=".SourceSageAssets/DOCUMIND/RELEASE_NOTES.md", help='リリースノートの出力パス')
parser.add_argument('--docuMind-prompt-output', type=str, default=".SourceSageAssets/DOCUMIND/_PROMPT.md", help='リリースノート作成のプロンプト')
parser.add_argument('--repo-name', type=str, default="SourceSage", help='リポジトリの名前')
parser.add_argument('--repo-version', type=str, default="v0.2.0", help='リポジトリのバージョン')

args = parser.parse_args()

# -----------------------------------------------
# SourceSageの実行
sourcesage = SourceSage(args.config, args.output, args.repo, args.owner, args.repository, args.ignore_file, args.language_map)
sourcesage.run()
#
if 'all' in args.mode or 'Sage' in args.mode:
logger.info("SourceSageを起動します...")
sourcesage = SourceSage(args.config, args.output, args.repo, args.owner, args.repository, args.ignore_file, args.language_map)
sourcesage.run()

# -----------------------------------------------
# レポートの生成
logger.info("git diff レポートの生成を開始します...")
git_diff_generator = GitDiffGenerator(args.repo_path, args.git_fetch_tags, args.git_tag_sort, args.git_diff_command)
diff, latest_tag, previous_tag = git_diff_generator.get_git_diff()
#
if 'all' in args.mode or 'Generate Report' in args.mode:
logger.info("git diff レポートの生成を開始します...")
git_diff_generator = GitDiffGenerator(args.repo_path, args.git_fetch_tags, args.git_tag_sort, args.git_diff_command)
diff, latest_tag, previous_tag = git_diff_generator.get_git_diff()

if(diff != None):
report_file_name = args.report_file_name.format(latest_tag=latest_tag)
os.makedirs(args.output_path, exist_ok=True)
output_path = os.path.join(args.output_path, report_file_name)

report_file_name = args.report_file_name.format(latest_tag=latest_tag)
os.makedirs(args.output_path, exist_ok=True)
output_path = os.path.join(args.output_path, report_file_name)
markdown_report_generator = MarkdownReportGenerator(diff, latest_tag, previous_tag, args.report_title, args.report_sections, output_path)
markdown_report_generator.generate_markdown_report()

markdown_report_generator = MarkdownReportGenerator(diff, latest_tag, previous_tag, args.report_title, args.report_sections, output_path)
markdown_report_generator.generate_markdown_report()
# -----------------------------------------------
# CommitCraftを使用してLLMにステージ情報を送信し、コミットメッセージを生成
#
if 'all' in args.mode or 'CommitCraft' in args.mode:
stage_info_file = args.stage_info_file
llm_output_file = os.path.join(args.commit_craft_output, args.llm_output)
os.makedirs(args.commit_craft_output, exist_ok=True)
commit_craft = CommitCraft(args.model_name, stage_info_file, llm_output_file)
commit_craft.generate_commit_messages()

# -----------------------------------------------
# DocuMindを使用してリリースノートを生成
#
if 'all' in args.mode or 'DocuMind' in args.mode:
docuMind = DocuMind(args.docuMind_model, args.docuMind_db, args.docuMind_release_report, args.docuMind_changelog, args.repo_name, args.repo_version, args.docuMind_prompt_output)
release_notes = docuMind.generate_release_notes()
docuMind.save_release_notes(args.docuMind_output, release_notes)

logger.success("プロセスが完了しました。")
tprint("!! successfully !!", font="rnd-medium")
Expand Down
7 changes: 4 additions & 3 deletions sourcesage/config/STAGE_INFO/STAGE_INFO_TEMPLATE_GAIAH_B.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- 正確にstep-by-stepで処理して
- ブランチで数ファイルごとに分けた方が良いと判断した場合はブランチ名を提案して
- なるべく少ないブランチ数にして
- 最適な「commit messages title」を挿入して

下記の差分情報とコミットメッセージの種類を参考に下記のマークダウンフォーマットで出力して

Expand All @@ -30,9 +31,9 @@

=== Commit Messages フォーマット ===

# Commit Messages Title
# commit messages title

## branch name
## feature/branch01

### path/to/file1.txt

Expand All @@ -50,7 +51,7 @@
- 詳細な説明(必要に応じて)
```

## branch name
## release/sample

### path/to/file3.txt

Expand Down
7 changes: 6 additions & 1 deletion sourcesage/config/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ def __init__(self, output_dir, owner, repository):
self.LANGUAGE_MAP_FILE = os.path.join(self.CONFIG_DIR, 'language_map.json')
self.IGNORE_FILE = os.path.join(self.CONFIG_DIR, '.SourceSageignore')

self.SOURCE_SAGE_MD = "DocuMind.md"
self.SOURCE_SAGE_MD = "Repository_summary.md"
self.DOCUMIND_DIR = "DOCUMIND"

self.CHANGELOG_DIR = "Changelog"
self.STAGED_DIFF_MD = "STAGED_DIFF.md"

Expand All @@ -25,6 +27,9 @@ def set_output_dir(self, output_dir):
self.ISSUE_LOG_DIR = os.path.join(self.SOURCE_SAGE_ASSETS_DIR, "ISSUE_LOG")
self.ISSUES_RESOLVE_DIR = os.path.join(self.SOURCE_SAGE_ASSETS_DIR, "ISSUE_WISE/ISSUES_RESOLVE")
self.STAGE_INFO_DIR = os.path.join(self.SOURCE_SAGE_ASSETS_DIR, "COMMIT_CRAFT/STAGE_INFO")




self.TEMPLATE_ISSUES_RESOLVE_DIR = os.path.join(self.DOCS_DIR, "ISSUES_RESOLVE")
self.ISSUES_RESOLVE_TEMPLATE_MD = "ISSUES_RESOLVE_TEMPLATE.md"
Expand Down
1 change: 1 addition & 0 deletions sourcesage/config/language_map.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
".java": "java",
".c": "c",
".cpp": "cpp",
".h": "cpp",
".cs": "csharp",
".go": "go",
".php": "php",
Expand Down
9 changes: 4 additions & 5 deletions sourcesage/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ def __init__(self, config_path, output_dir, repo_path, owner, repository, ignore
self.constants = Constants(output_dir, owner, repository)

def run(self):
tprint("SourceSage", font="rnd-xlarge")
logger.info("Running SourceSage...")

# Load configuration
Expand All @@ -37,7 +36,7 @@ def run(self):

# Generate SourceSage markdown
sourcesage_module = SourceSageModule(folders=[self.repo_path], ignore_file=self.ignore_file,
output_file=os.path.join(self.constants.SOURCE_SAGE_ASSETS_DIR, self.constants.SOURCE_SAGE_MD),
output_file=os.path.join(self.constants.SOURCE_SAGE_ASSETS_DIR, self.constants.DOCUMIND_DIR, self.constants.SOURCE_SAGE_MD),
language_map_file=self.language_map_file)
sourcesage_module.generate_markdown()

Expand Down Expand Up @@ -87,14 +86,14 @@ def run(self):

# Convert issues to markdown
issues_to_markdown = IssuesToMarkdown(issues_file=os.path.join(self.constants.ISSUE_LOG_DIR, self.constants.ISSUES_FILE_NAME),
sourcesage_file=os.path.join(self.constants.SOURCE_SAGE_ASSETS_DIR, self.constants.SOURCE_SAGE_MD),
sourcesage_file=os.path.join(self.constants.SOURCE_SAGE_ASSETS_DIR, self.constants.DOCUMIND_DIR, self.constants.SOURCE_SAGE_MD),
template_file=os.path.join(self.constants.DOCS_DIR, self.constants.TEMPLATE_ISSUES_RESOLVE_DIR, self.constants.ISSUES_RESOLVE_TEMPLATE_MD),
output_folder=self.constants.ISSUES_RESOLVE_DIR)
issues_to_markdown.load_data()
issues_to_markdown.create_markdown_files()

logger.info("SourceSage completed successfully.")
tprint("!! successfully !!", font="rnd-medium")
# logger.info("SourceSage completed successfully.")
# tprint("!! successfully !!", font="rnd-medium")
def load_config(self):
# Load configuration from YAML file
# Implement this method based on your configuration file structure
Expand Down
Loading

0 comments on commit 123049c

Please sign in to comment.