-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·201 lines (187 loc) · 7.87 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·201 lines (187 loc) · 7.87 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
#!/usr/bin/env bash
# Symlink dotagents entries into ~/.claude/{skills,commands}, a selected Codex skill surface, ~/.grok/rules, and ~/.cursor/rules.
# Idempotent: re-running overwrites existing symlinks but never removes unrelated files.
set -euo pipefail
profile=official
profile_set=false
usage() {
cat <<'EOF'
使い方: ./install.sh [--profile official|legacy]
Codex skill 配布先:
official ~/.agents/skills (既定)
legacy ~/.codex/skills
EOF
}
while [ "$#" -gt 0 ]; do
case "$1" in
--help|-h) usage; exit 0 ;;
--profile)
[ "$#" -ge 2 ] || { echo 'FAIL: --profile には official または legacy が必要' >&2; exit 2; }
[ "$profile_set" = false ] || { echo 'FAIL: --profile を重複指定できない' >&2; exit 2; }
profile="$2"; profile_set=true; shift 2 ;;
--profile=*)
[ "$profile_set" = false ] || { echo 'FAIL: --profile を重複指定できない' >&2; exit 2; }
profile="${1#--profile=}"; profile_set=true; shift ;;
*) echo "FAIL: 不明な引数: $1" >&2; usage >&2; exit 2 ;;
esac
done
case "$profile" in official|legacy) ;; *) echo "FAIL: 不正な profile: $profile" >&2; exit 2 ;; esac
# MSYS/Git Bash(Windows native): 無指定だと ln -s が実コピーになり正本化が静かに不成立する。
# 開発者モード ON 前提で本物の symlink を強制(非対応なら ln が失敗して止まる=静かなコピーへ逃げない)。
case "$(uname -s)" in MINGW*|MSYS*) export MSYS=winsymlinks:nativestrict ;; esac
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "Codex skill profile: $profile"
link_one() {
local src="$1" dst="$2"
if [ -e "$dst" ] && [ ! -L "$dst" ]; then
echo "SKIP (real file exists — 退避しないと本リポ版が使われない): $dst" >&2
return 0
fi
ln -sfn "$src" "$dst"
echo "linked: $dst -> $src"
}
remove_retired_link() {
local path="$1" actual_target expected_target
shift
[ -L "$path" ] || return 0
actual_target="$(readlink "$path")"
for expected_target in "$@"; do
if [ "$actual_target" = "$expected_target" ]; then
rm "$path"
echo "removed retired link: $path"
return 0
fi
done
}
# 廃止済みの dotagents 所有入口だけを除去する。実ファイルや別所有者の
# symlink は触らず、旧 official / legacy の双方に残る dangling link を防ぐ。
remove_retired_link "$HOME/.claude/skills/audit-gauntlet" \
"$HERE/claude/skills/audit-gauntlet" "$HOME/Developer/dotagent/claude/skills/audit-gauntlet"
remove_retired_link "$HOME/.claude/commands/audit-gauntlet.md" \
"$HERE/claude/commands/audit-gauntlet.md" "$HOME/Developer/dotagent/claude/commands/audit-gauntlet.md"
remove_retired_link "$HOME/.agents/skills/audit-gauntlet" \
"$HERE/codex/skills/audit-gauntlet" "$HOME/Developer/dotagent/codex/skills/audit-gauntlet"
remove_retired_link "$HOME/.codex/skills/audit-gauntlet" \
"$HERE/codex/skills/audit-gauntlet" "$HOME/Developer/dotagent/codex/skills/audit-gauntlet"
# Claude
mkdir -p "$HOME/.claude/skills" "$HOME/.claude/commands" "$HOME/.claude/agents"
# global CLAUDE.md (canonical copy lives in this repo; terminals must remove any
# pre-existing real file first — link_one SKIPs real files by design)
if [ -e "$HERE/claude/CLAUDE.md" ]; then
link_one "$HERE/claude/CLAUDE.md" "$HOME/.claude/CLAUDE.md"
fi
if [ -d "$HERE/shared/runbooks" ]; then
link_one "$HERE/shared/runbooks" "$HOME/.claude/runbooks"
fi
for d in "$HERE/claude/skills"/*/; do
[ -d "$d" ] || continue
link_one "${d%/}" "$HOME/.claude/skills/$(basename "$d")"
done
for f in "$HERE/claude/commands"/*.md; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.claude/commands/$(basename "$f")"
done
for f in "$HERE/claude/agents"/*.md; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.claude/agents/$(basename "$f")"
done
# Codex(skill 面は profile ごとに一方だけへ配布)
mkdir -p "$HOME/.codex/rules" "$HOME/.codex/agents"
if [ "$profile" = official ]; then
codex_skills_dir="$HOME/.agents/skills"
else
codex_skills_dir="$HOME/.codex/skills"
fi
mkdir -p "$codex_skills_dir"
if [ -e "$HERE/codex/AGENTS.md" ]; then
link_one "$HERE/codex/AGENTS.md" "$HOME/.codex/AGENTS.md"
fi
if [ -d "$HERE/shared/runbooks" ]; then
link_one "$HERE/shared/runbooks" "$HOME/.codex/runbooks"
fi
for d in "$HERE/codex/skills"/*/; do
[ -d "$d" ] || continue
link_one "${d%/}" "$codex_skills_dir/$(basename "$d")"
done
for f in "$HERE/codex/rules"/*; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.codex/rules/$(basename "$f")"
done
for f in "$HERE/codex/agents"/*.toml; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.codex/agents/$(basename "$f")"
done
# Grok(憲法・runbook・skill・agent・hook)
mkdir -p "$HOME/.grok/rules" "$HOME/.grok/skills" "$HOME/.grok/agents" "$HOME/.grok/hooks"
if [ -e "$HERE/grok/AGENTS.md" ]; then
link_one "$HERE/grok/AGENTS.md" "$HOME/.grok/rules/AGENTS.md"
fi
if [ -d "$HERE/shared/runbooks" ]; then
link_one "$HERE/shared/runbooks" "$HOME/.grok/runbooks"
fi
for d in "$HERE/grok/skills"/*/; do
[ -d "$d" ] || continue
link_one "${d%/}" "$HOME/.grok/skills/$(basename "$d")"
done
for f in "$HERE/grok/agents"/*.md; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.grok/agents/$(basename "$f")"
done
for f in "$HERE/grok/hooks"/*.json; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.grok/hooks/$(basename "$f")"
done
# Cursor(憲法は native rules の factory.mdc のみ。AGENTS.md は生成物として保持し ~/.cursor へは置かない)
mkdir -p "$HOME/.cursor/rules" "$HOME/.cursor/skills" "$HOME/.cursor/agents"
if [ -e "$HERE/cursor/rules/factory.mdc" ]; then
link_one "$HERE/cursor/rules/factory.mdc" "$HOME/.cursor/rules/factory.mdc"
# Desktop 3.17.8 の getGlobalRules は workspace 内 .cursor/rules だけ always-apply する。
# 同一正本の overlay。窓への --add はしない(last-active を誤る)。
mkdir -p "$HOME/.cursor/factory-constitution/.cursor/rules"
link_one "$HERE/cursor/rules/factory.mdc" "$HOME/.cursor/factory-constitution/.cursor/rules/factory.mdc"
fi
if [ -d "$HERE/shared/runbooks" ]; then
link_one "$HERE/shared/runbooks" "$HOME/.cursor/runbooks"
fi
for d in "$HERE/cursor/skills"/*/; do
[ -d "$d" ] || continue
link_one "${d%/}" "$HOME/.cursor/skills/$(basename "$d")"
done
for f in "$HERE/cursor/agents"/*.md; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.cursor/agents/$(basename "$f")"
done
# Caveatの状態はsymlink配布しない。host別一撃展開はCaveat READMEが定める
# 製品setup入口を一度だけ呼び、dotagentsは内部path・remote・認証を判定しない。
if [ -d "$HERE/caveat" ]; then
echo "NOTE: dotagents/caveat is retired and is not a Caveat state source." >&2
echo " Caveat product setup owns current state; see https://github.com/kitepon/Caveat#readme." >&2
fi
# bin scripts (extension dropped at the destination, e.g. agents-update.sh -> agents-update)
mkdir -p "$HOME/.local/bin"
remove_retired_link \
"$HOME/.local/bin/windows-native-product-smoke" \
"$HERE/bin/windows-native-product-smoke.mjs" \
"$HOME/Developer/dotagent/bin/windows-native-product-smoke.mjs"
remove_retired_link \
"$HOME/.local/bin/render-current-docs" \
"$HERE/bin/render-current-docs.mjs" \
"$HOME/Developer/dotagent/bin/render-current-docs.mjs"
remove_retired_link \
"$HOME/.local/bin/apply-observer-hook-config" \
"$HERE/bin/apply-observer-hook-config.sh" \
"$HOME/Developer/dotagent/bin/apply-observer-hook-config.sh"
remove_retired_link \
"$HOME/.local/bin/verify-observer-package" \
"$HERE/bin/verify-observer-package.sh" \
"$HOME/Developer/dotagent/bin/verify-observer-package.sh"
for f in "$HERE/bin"/*.sh; do
[ -e "$f" ] || continue
link_one "$f" "$HOME/.local/bin/$(basename "$f" .sh)"
done
for f in "$HERE/bin"/*.mjs; do
[ -e "$f" ] || continue
[ "$(basename "$f")" != render-current-docs.mjs ] || continue
link_one "$f" "$HOME/.local/bin/$(basename "$f" .mjs)"
done
echo "done."