forked from miyatti777/aipm_v0
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup_workspace_simple.sh
More file actions
executable file
·309 lines (263 loc) · 10.2 KB
/
setup_workspace_simple.sh
File metadata and controls
executable file
·309 lines (263 loc) · 10.2 KB
1
2
3
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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
#!/bin/bash
#============================================================
# setup_workspace_simple.sh
# ─ AIプロジェクト管理ワークスペースの簡易構築スクリプト
#
# 使い方: ./setup_workspace_simple.sh [root_directory] [config_file]
# ./setup_workspace_simple.sh [config_file]
# 例: ./setup_workspace_simple.sh /Users/username/new_workspace ./my_config.sh
# ./setup_workspace_simple.sh setup_config.sh # カレントディレクトリに作成
#
# 基本的なフォルダ構造を作成し、Flowに日付フォルダを作成します
# コンフィグファイルを指定すると、クローンするリポジトリをカスタマイズできます
#============================================================
set -e
# 色の定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# ログ関数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# デフォルト設定
# これらの設定はコンフィグファイルでオーバーライドできます
setup_default_config() {
# ルールリポジトリ
RULE_REPOS=(
"https://github.com/miyatti777/rules_basic_public.git|.cursor/rules/basic"
)
# スクリプトリポジトリ
SCRIPT_REPOS=(
"https://github.com/miyatti777/scripts.git|scripts_public"
)
# プログラムリポジトリ
PROGRAM_REPOS=(
"https://github.com/miyatti777/sample_pj_curry.git|Stock/programs/夕食作り"
)
# サンプルプログラムフォルダ(フォールバック用)
SAMPLE_PROGRAMS=(
"夕食作り"
)
# 基本ディレクトリ
BASE_DIRS=(
"Flow"
"Stock"
"Archived"
"Archived/projects"
"scripts"
".cursor/rules"
".cursor/rules/basic"
"Stock/programs"
)
# AUTO_APPROVE:trueに設定すると確認メッセージをスキップ
AUTO_APPROVE=false
# AUTO_CLONE:trueに設定するとリポジトリを自動クローン
AUTO_CLONE=false
}
# コンフィグファイルの読み込み
load_config() {
local config_file="$1"
if [ -f "$config_file" ]; then
log_info "コンフィグファイルを読み込んでいます: $config_file"
# shellcheck source=/dev/null
source "$config_file"
log_success "コンフィグファイルを読み込みました"
else
log_warning "指定されたコンフィグファイルが見つかりません: $config_file"
log_info "デフォルト設定を使用します"
fi
}
# リポジトリのクローン処理
clone_repository() {
local url=$1
local target=$2
local full_path="$ROOT_DIR/$target"
# ターゲットディレクトリが既に存在し、かつgitリポジトリである場合はpullのみ
if [ -d "$full_path/.git" ]; then
log_info "リポジトリは既に存在します: $target - 更新を試みます"
(cd "$full_path" && git pull)
log_success "リポジトリを更新しました: $target"
else
# ディレクトリが存在する場合は中身を確認
if [ -d "$full_path" ]; then
# 空のディレクトリでなければエラー
if [ "$(ls -A "$full_path")" ]; then
log_error "ターゲットディレクトリ '$full_path' は空ではありません。クローンできません。"
return 1
fi
# 空のディレクトリなら削除してクローン
rmdir "$full_path"
fi
# 親ディレクトリを作成
mkdir -p "$(dirname "$full_path")"
# リポジトリをクローン
log_info "リポジトリをクローンしています: $url -> $target"
git clone "$url" "$full_path"
if [ $? -eq 0 ]; then
log_success "リポジトリをクローンしました: $target"
else
log_error "リポジトリのクローンに失敗しました: $url"
return 1
fi
fi
}
# リポジトリのクローン
clone_repositories() {
log_info "リポジトリをクローンしています..."
# git が必要
if ! command -v git &> /dev/null; then
log_warning "git がインストールされていません。リポジトリクローンをスキップします。"
return 1
fi
# AUTO_CLONEがfalseの場合は確認
local clone_confirm="y"
if [ "$AUTO_CLONE" != "true" ]; then
read -p "リポジトリをクローンしますか? (y/n): " clone_confirm
if [[ "$clone_confirm" != [yY] ]]; then
log_info "リポジトリのクローンはスキップされました"
return 0
fi
else
log_info "AUTO_CLONE=true が設定されているため、すべてのリポジトリを自動クローンします"
fi
# ルールリポジトリ
if [ ${#RULE_REPOS[@]} -gt 0 ]; then
log_info "ルールリポジトリをクローンしています..."
for repo_entry in "${RULE_REPOS[@]}"; do
url=$(echo "$repo_entry" | cut -d'|' -f1)
target=$(echo "$repo_entry" | cut -d'|' -f2)
clone_repository "$url" "$target"
done
else
log_info "ルールリポジトリの指定がないためスキップします"
fi
# スクリプトリポジトリ
if [ ${#SCRIPT_REPOS[@]} -gt 0 ]; then
log_info "スクリプトリポジトリをクローンしています..."
for repo_entry in "${SCRIPT_REPOS[@]}"; do
url=$(echo "$repo_entry" | cut -d'|' -f1)
target=$(echo "$repo_entry" | cut -d'|' -f2)
clone_repository "$url" "$target"
done
else
log_info "スクリプトリポジトリの指定がないためスキップします"
fi
# プログラムリポジトリ
if [ ${#PROGRAM_REPOS[@]} -gt 0 ]; then
log_info "プログラムリポジトリをクローンしています..."
for repo_entry in "${PROGRAM_REPOS[@]}"; do
url=$(echo "$repo_entry" | cut -d'|' -f1)
target=$(echo "$repo_entry" | cut -d'|' -f2)
# AUTO_CLONEがtrueでない場合は各リポジトリごとに確認
local repo_confirm="y"
if [ "$AUTO_CLONE" != "true" ]; then
read -p "$url をクローンしますか? (y/n): " repo_confirm
fi
if [[ "$repo_confirm" == [yY] || "$AUTO_CLONE" == "true" ]]; then
clone_repository "$url" "$target" || log_warning "リポジトリ $url のクローンに問題が発生しましたが、処理は継続します"
else
log_info "リポジトリはスキップされました: $url"
fi
done
else
log_info "プログラムリポジトリの指定がないためスキップします"
fi
log_success "リポジトリのクローンが完了しました"
}
# フォールバックのディレクトリ作成
create_fallback_directories() {
log_info "追加のディレクトリを作成しています..."
# 共通ナレッジ領域作成
if [ ! -d "$ROOT_DIR/Stock/programs/Common/Public" ]; then
mkdir -p "$ROOT_DIR/Stock/programs/Common/Public"
log_info "共通ナレッジディレクトリ作成: Stock/programs/Common/Public"
fi
# サンプルプログラムフォルダの作成(クローンが失敗または選択されなかった場合のフォールバック)
for prog in "${SAMPLE_PROGRAMS[@]}"; do
if [ ! -d "$ROOT_DIR/Stock/programs/$prog" ]; then
mkdir -p "$ROOT_DIR/Stock/programs/$prog"
log_info "プログラムディレクトリ作成: Stock/programs/$prog"
fi
done
}
# メイン処理
main() {
echo "============================================================"
echo " AIプロジェクト管理ワークスペース簡易構築スクリプト"
echo "============================================================"
# 引数の処理を柔軟にする
# 引数が1つだけの場合、それがconfig_fileかどうかを判断
if [ $# -eq 1 ] && [[ "$1" == *".sh" ]]; then
ROOT_DIR="./"
CONFIG_FILE="$1"
else
# 通常の引数処理(以前と同じ)
ROOT_DIR="${1:-./}"
CONFIG_FILE="${2:-./setup_config.sh}"
fi
# デフォルト設定をロード
setup_default_config
# コンフィグファイルをロード(指定されていれば)
if [ -n "$CONFIG_FILE" ]; then
load_config "$CONFIG_FILE"
fi
# 絶対パスに変換(ディレクトリが存在しなくてもパスを解決できるように)
if [[ "$ROOT_DIR" = /* ]]; then
# 既に絶対パスの場合はそのまま
:
else
# 相対パスの場合は現在のディレクトリからの絶対パスに変換
ROOT_DIR="$(pwd)/$ROOT_DIR"
fi
log_info "ワークスペースのルートディレクトリ: $ROOT_DIR"
log_info "使用するコンフィグファイル: $CONFIG_FILE"
# 確認メッセージ(AUTO_APPROVEがtrueの場合はスキップ)
if [ "$AUTO_APPROVE" != "true" ]; then
read -p "この場所にワークスペースを作成してよろしいですか? (y/n): " confirm
if [[ "$confirm" != [yY] ]]; then
log_info "キャンセルされました"
exit 0
fi
else
log_info "AUTO_APPROVE=true が設定されているため、確認をスキップします"
fi
# ルートディレクトリ作成
mkdir -p "$ROOT_DIR"
log_info "基本ディレクトリ構造を作成しています..."
# ディレクトリ作成
for dir in "${BASE_DIRS[@]}"; do
mkdir -p "$ROOT_DIR/$dir"
log_info "ディレクトリ作成: $dir"
done
# 日付フォルダ作成
log_info "Flow 内に日付フォルダを作成しています..."
TODAY=$(date +"%Y-%m-%d")
YEAR_MONTH=$(date +"%Y%m")
FLOW_DATE_DIR="$ROOT_DIR/Flow/$YEAR_MONTH/$TODAY"
mkdir -p "$FLOW_DATE_DIR"
log_info "日付フォルダ作成: Flow/$YEAR_MONTH/$TODAY"
# リポジトリのクローン(先に行う)
clone_repositories
# クローンされなかったディレクトリをフォールバックとして作成
create_fallback_directories
# 完了メッセージ
log_success "ワークスペースの構築が完了しました: $ROOT_DIR"
echo "============================================================"
echo "完了しました!新しいワークスペースが構築されました。"
echo "ディレクトリ: $ROOT_DIR"
echo "============================================================"
}
# スクリプト実行
main "$@"